ayuda con programa en mikroc

#1
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
}
...
 
#2
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...
 
#3
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:
#4
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

Última edición:
#5
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.
 
#6
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...
 

Temas similares

Arriba