ayuda con programa en mikroc

buenas estoy tratando hacer un programa el cual al contrar 20 pulsos por el pin RA4 me desactive el puerto B por un tiempo. este es el codigo que llevo hasta el momento, muchas gracias por la ayuda

Código:
void main( void ){
char TEST = 20;           // Constante TEST = 20
//Configuración de puertos.

          OSCCON = 0b01110110;                //Oscilador interno a 4MHz

          ANSEL  = 0;                 //Configura portA como digital
          ANSELH = 0;                 //configura los demas puertos como digitales

          TRISA  = 0xFF;              // PORTA is input
          TRISB  = 0x00;              // PORTb is out
          TRISC  = 0xFF;              // PORTC is input
          TRISD  = 0xFF;              // PORTD is input
          TRISE  = 0xFF;              // PORTE is input

          PORTA = 0;
          PORTB = 0;
          PORTC = 0;
          PORTD = 0;
          PORTE = 0;

          OPTION_REG = 0;            //Activación de las resistencias PULL-UP del puerto B.
          
          OPTION_REG.F5 = 1;       // Contador TMR0 recibe los pulsos por el pin RA4
          OPTION_REG.F3 = 1;       // Valor del pre-escalador 1:1
          
          TMR0 = 0;                // Reiniciar el temporizador/contador TMR0
          
       do {
       PORTB = 0b00001111;
       if (TMR0 == TEST)      // ¿Coincide el número en el temporizador con la constante TEST?
       PORTB = 0b00000000;    // Números coinciden. Poner el RB en cero
       Delay_ms(3000);        // Tiempo de retardo de 3000mS

       }
       while (1);               // Quedarse en el bucle infinito
}
...
 
Hola.
Cuál es el problema exactamente? bueno a simple vista hace falta las llaves del IF que encierren a PORTB... y Delya_ms...
Sucede que casi siempre se ejecuta Delay_ms(3000) y como TMR0 cuenta por si solo, es muy dificil que coincida la comparación del IF cuando el TMR0 sea 20... puede que sea mayor... puede que sea menor...
 
No sé yo eso de que el preescalador esté en 1:1, primero hay que configurar el OPTION_REG para que use el reloj del WDT en PSA (que yo deshabilito), la entrada por RB4 ya la tienes (en T0CS) y los 3 primeros (F0-F2) bits del OPTION_REG tendrían que estar en 000 para que el prescaler sea de 1:1. Así lo hice yo, asigné el 000 para asegurarme. Si no configuras el uso del WDT, se toma el reloj oscilador y el prescaler es de 1:2.

¿Has probado a declarar "test" como int? ¿Y luego forzar el registro del TMR0 a ser un int?
test = (int)TMR0

Por cierto, cuando solicites ayuda indica un poco cuál es el problema, será mucho más fácil que ponernos a mirar un código entero.
 
Última edición:
el problema que estoy teniendo es que no se me desactiva el puerto B de hecho tengo la simulación en proteus, que igual manera la subo



la idea es que por el puerto b este activando un relay al poner el s1 en posición de los leds se genere el pulso con el cual prendo y apago, tomo este pulso y lo ingreso por RA4 al micro y cuando este halla contado 20 pulsos desactive el puerto b, acabo de probar la propuesta de (int)TMR0 e int tets y no me funciono, muchas gracias por su ayuda
 

Adjuntos

  • micro flasher.rar
    22.2 KB · Visitas: 2
  • Captura.jpg
    Captura.jpg
    124.7 KB · Visitas: 5
Última edición:
Creo que las llaves entre el do while y el if no están correctas. Además según está propuesto, una vez cuente por primera vez los 20 pulsos y haga lo que hay dentro del if, seguirá aumentando el contador y no se volverá a dar la igualdad, hay que incluir un TMR0=0 tras los 3 segundos.
 
Idem... Insisto con eso de las llaves del IF... como el PIC pierde más tiempo en el Delay no hay cuando se entere que ha llegado el conteo a 20...
Aísla solo el delay para cuendo IF se cumple y no fuera todo el tiempo.

PD. IF sin llaves solo ejecuta la siguiente instrucción, no todas...
 
Atrás
Arriba