Hola amigos de TODOPIC un saludo.
Les cuento que estoy utilizando un pic184550, programando en C MPLABX- XC8 y simulando en proteus.
Estoy configurando el pic para que apague un led con un pulsador, es decir, cuando coloque un alto con el pulsador en la pata del pic RA4/T0CKl que maneja el TIMER0 apague el led en otro puerto, ahora tengo un problema pues no funciona..
lo primero que hago en el void principal es habilitar las interrupciones globales, activo la interrupcion del TIMER0 en el registro de interrupciones INTCON, luego configuro el registro del TIMER "T0CON".
RCONbits.IPEN = 1; // Activa modo alta y baja prioridad
INTCONbits.GIEL = 1;// permitimos interrupciones de baja prioridad (Global Interrupt Enable Low)
INTCONbits.GIEH=1; //alto en ultima compuerta
INTCONbits.TMR0IE=1; // habilitamos interrupcion del timer0
T0CON=0xFA; // registro TIMER0, Increment on high-to-low transition on T0CKI pin, Transition on T0CKI pin
luego realizo la funcion de interrucion:
void interrupt isr (void)
{
if (TMR0IF==1)
{
act_alarma[0] = 0;
TMR0IF=0;
}
}
la variable interna del programa act_alarma[0] es la que maneja el pin del led, depende de esta junto a otra condicion encendera o apagara el led.
coloco el timer como contador con el registro "T0CS: Timer0 Clock Source Select bit" poniendo este bit en 1, para utilizar la para RA4 como control.
ahora les comento lo que me pasa, al colocar el bit <4>"T0SE: Timer0 Source Edge Select bit" en 0, es decir, incremento de bajo a alto en el pin para realizar la transición, parece como si la interrupción se ejecutara instantáneamente, se esto porque al colocar este bit de esta manera, el LED no se enciende cuando debería estarlo, es como si de entrada colocara la bandera TMR0IF en 1, por ende act_alarma[0] = 0.
cuando coloco el bit del registro T0SE en 1, el led se enciende normal cuando debe hacerlo segun el programa...hasta ahora todo bien, pero se oprime el pulsador y no pasa nada, el led nunca se apaga, es decir, no ejecuta la interrupcion, o la bandera TMR0IF nunca se coloca en uno...
es primera vez que utilizo el TIMER, nose si tengo que configurar el contador o como se configura para una cuenta de X flancos de subida, active la bandera..
tambien encontre esto en el datasheet:
El modo de contador se selecciona ajustando el bit T0CS
(= 1 ) . En el modo de contador , incrementos Timer0 ya sea en
cada flanco ascendente o descendente de pin RA4 / T0CKI / C1OUT /
RCV . El borde de incremento se determina por la
Timer0 Fuente Edge Select poco , T0SE ( T0CON < 4 > ) ;
despejar este bit selecciona el flanco de subida . Restricciones a la
la entrada de reloj externo se discuten a continuación.
Una fuente de reloj externa se puede utilizar para conducir Timer0 ;
sin embargo, debe cumplir con ciertos requisitos para garantizar
que el reloj externo se puede sincronizar con la
reloj de fase interna ( TOSC ) . Hay un retraso entre
la sincronización y el inicio de incrementar el
temporizador / contador .
al leer esto nose si estoy teniendo problemas con la sincronizacion del flanco en mi pulsador con el reloj interno...
Si pueden ayudarme se los agradeceria mucho... les deseo un feliz dia