Autor Tema: problema utilizando TIMER0 como interrupcion en pic18f4550  (Leído 3998 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fernandogomav

  • PIC10
  • *
  • Mensajes: 32
problema utilizando TIMER0 como interrupcion en pic18f4550
« en: 16 de Enero de 2016, 13:23:07 »
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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema utilizando TIMER0 como interrupcion en pic18f4550
« Respuesta #1 en: 16 de Enero de 2016, 13:33:04 »
Un par de cosas. Y luego veremos cual es el problema:

- No deberias usar el Timer para hacer eso.. Para eso tenes interrupcion por flanco RB0 o por cambio Rb4-Rb7 ( esto es lo normal en lso pics, no recuerdo si en ese varia)
- Deberias primero modificar los registros del timer (el timer0 esta siempre corriendo), habilitar la interrupcion del timer, limpiar la bandera, setear la prioridad del timer y luego recien ahi habilitar las prioridades/interrupciones
- Si quisieras que cuente si o si 1.. Al timer deberias cargarlo con 0xFF, para que cuando exista 1 solo pulso active la interrupcion por overflow ( es decir cuando pasa a 0x00) en tu interrupcion deberias cargarlo de nuevo.
- Tene cuidado por que si no me equivoco la rutina de interrupcion es la de alta prioridad. Asi que tene ojo cuando vayas a activar una con baja prioridad si no tenes definido el la rutina para este.

Desconectado fernandogomav

  • PIC10
  • *
  • Mensajes: 32
Re:problema utilizando TIMER0 como interrupcion en pic18f4550
« Respuesta #2 en: 16 de Enero de 2016, 13:57:37 »
Un par de cosas. Y luego veremos cual es el problema:

- No deberias usar el Timer para hacer eso.. Para eso tenes interrupcion por flanco RB0 o por cambio Rb4-Rb7 ( esto es lo normal en lso pics, no recuerdo si en ese varia)
- Deberias primero modificar los registros del timer (el timer0 esta siempre corriendo), habilitar la interrupcion del timer, limpiar la bandera, setear la prioridad del timer y luego recien ahi habilitar las prioridades/interrupciones
- Si quisieras que cuente si o si 1.. Al timer deberias cargarlo con 0xFF, para que cuando exista 1 solo pulso active la interrupcion por overflow ( es decir cuando pasa a 0x00) en tu interrupcion deberias cargarlo de nuevo.
- Tene cuidado por que si no me equivoco la rutina de interrupcion es la de alta prioridad. Asi que tene ojo cuando vayas a activar una con baja prioridad si no tenes definido el la rutina para este.

SOLUCIONADOOO =) era justo lo qe me dijsite KILLERJC muchisimas gracias...

les cuento lo que hice... primero organice las habilitaciones y registro de esta manera: (tambien de asigne como dijo KILLERJC el valor al timer de comienzo)

T0CON=0xFA; // registro TIMER0
    INTCONbits.TMR0IE=1; // habilitamos interrupcion del timer0
    INTCONbits.TMR0IF=0; // inicializamos la bandera en 0
    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
    TMR0=0xFF; // le damos el valor inical al timer

luego en la interrupcion tambien cargue el valor del timer 0xFF

void interrupt isr (void)
{
    if (TMR0IF==1)
    {
        act_alarma[0] = 0;
       
        TMR0IF=0;
        TMR0=0xFF;
    }

}

aprovecha para comentarte KILLERJC, no utilizo las interrupciones por flanco RB0, RB1 Y RB2 porque quiero colocar un rtc y necesito esas patas y de RB4 a RB7 ya las tengo funcionando y bueno no queria mover tanto, en si estoy haciendo esto porque tenia la interrupcion en RB2 pero la necesitare para el rtc.... pero e su efecto si alguien necesita hacer lo mismo es mas facil en el puerto B..

problema solucionado

gracias de nuevo KILLERJC

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema utilizando TIMER0 como interrupcion en pic18f4550
« Respuesta #3 en: 16 de Enero de 2016, 14:46:36 »
Por si necesitas mas "interrupciones" de estas.

Por ahi te conviene usar el Timer0 como un "timer" por ejemplo de 100ms, y cada 100ms vigilas si cambio o no cualquier entrada. Y si cambio que realize lo que debe. y tendrias tu:

- "Interrupcion" enrte comillas por que no es rapido, pero 100ms para la persona que presiona un boton no es nada
- Antirebote, el efecto de los 100ms entre timer y timer hace que deba estar 100ms presionado el boton, sino no hace nada.

Es decir matas 2 pajaros de 1 tiro.

Desconectado fernandogomav

  • PIC10
  • *
  • Mensajes: 32
Re:problema utilizando TIMER0 como interrupcion en pic18f4550
« Respuesta #4 en: 19 de Enero de 2016, 00:00:37 »
Chevere KillerJC, aun mejor=) muchas gracias!!


 

anything