Autor Tema: Sobre el inicio del timer0  (Leído 1955 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Sobre el inicio del timer0
« en: 03 de Mayo de 2016, 14:45:18 »
Me e fijado que cada vez que inicio timer0 mediante enable_interrupts(INT_TIMER0);
Este se mete directamente en su void timer0(){ ... }

No me conviene. Lo que me interesa es que empieze a contar nada mas y solo se meta por primera vez en su void timer0(); en cada desbordamiento como hace el resto de las veces.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Sobre el inicio del timer0
« Respuesta #1 en: 06 de Mayo de 2016, 11:50:43 »
Hola Berto!

Respuesta corta:
Pon a 0 el flag TMR0IF antes de habilitar la interrupcion. Si trabajas con CCS puedes usar clear_interrupt(int_timer0)

Respuesta larga:
Las interrupciones tienen unos registros asociados, en el caso del timer 0, normalmente tienes:
-INTCON: Registro de control de interrupciones
  *TMR0IE: Bit que habilita o no la interrupcion por TIMER 0
  *TMR0IF: Bit de interrupcion que indica si ha ocurrido un desbordamiento del registro TMR0
  *GIE: Bit que habilita o no las interrupciones globales

-TMR0: Registro con el valor del TIMER 0. Ocurre un desbordamiento cuando pasa del valor 255 (0xFF) al valor 0 (0x00).
-Hay algun otro registro asociado al timer 0, pero no es pertinente en este caso.

El Timer 0 esta corriendo constantemente, sin importar si la interrupcion esta habilitada. Y cuando desborda activa el bit de interrupcion TMR0IF. Si la interrupcion no esta activada, no interrupira, pero el bit seguira activo. En el momento que tu activas la interrupcion el programa comprueba que tiene TMR0IF activado y ejecuta la interrupcion.

Eso nos lleva a la solucion de la respuesta corta  :mrgreen:
Por cierto, como el timer siempre esta corriendo, en el momento que activas la interrupcion quizas tambien te interese ponerlo a 0.

Creo que algunos compiladores se encargan de borrar el el flag de interrupcion cuando la habilitas, pero a veces mejor no fiarse y hacerlo por tu cuenta para estar seguro.

Un saludo!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Sobre el inicio del timer0
« Respuesta #2 en: 07 de Mayo de 2016, 05:47:29 »
Valla Hace dias que adacte el programa a lo que me hacia el timer por defecto, pero esto tengo que guardarmelo.
 
deduzcion corta:
si pongo antes clear_interrupt(int_timer0) antes de avilitar el timer ¿me ara lo que pedia al principio, empezar a contar nada mas? ¿este comando es similar a clear_interrupt(INT_RB); de int_rb?

El resto parece AXM tengo que estudiarlo:
INTCON: Puede darme el numero de desbordamientos que a tenido el timer me seria muy util, otras interrupciones tienen prioridad son largas y no pasan por varios void_timer1(); con un solo TMR1IF no es suficiente, tambien necesitaria ponerlo a cero cada vez que le pido este numero o acabe void_timer1().
¿GIE es lo mismo que enable_interrupts(global); como se invoca? veo que el compilador acmite -GIE:- pero las interrupciones no funcionan.

Gracias por el aporte.
Saludos.


Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Sobre el inicio del timer0
« Respuesta #3 en: 12 de Mayo de 2016, 07:11:20 »
si pongo antes clear_interrupt(int_timer0) antes de avilitar el timer ¿me ara lo que pedia al principio, empezar a contar nada mas? ¿este comando es similar a clear_interrupt(INT_RB); de int_rb?

Si, deberia hacer lo que pedias al principio.
clar_interrupt(INT_RB) lo que hace es limpiar el flag de interrupcion por cambio de estado en el puerto B.

INTCON: Puede darme el numero de desbordamientos que a tenido el timer me seria muy util, otras interrupciones tienen prioridad son largas y no pasan por varios void_timer1(); con un solo TMR1IF no es suficiente, tambien necesitaria ponerlo a cero cada vez que le pido este numero o acabe void_timer1().
INTCON no puede darte el numero de desbordamientos. Mirate el datasheet para entender mejor el funcionamiento del PIC. En especial la seccion de interrupciones.
Para saber el numero de desbordamientos puedes hacer:
Código: C
  1. #define VUELTAS_TIMER1    10    //cuantas interrupciones de timer 1 tienen que ocurrir
  2. int Contador = 0;    //variable global
  3.  
  4. #int_TIMER1
  5. void Timer1_isr(void){
  6.     Contador++;    //incrementa uno el contador de interrupciones
  7. }
  8.  
  9. void main (void){
  10.     ...
  11.    
  12.     if(Contador == VUELTAS_TIMER1){
  13.         Contador = 0;
  14.         ...lo que quieras hacer
  15.     }
  16.  
  17.     ...
  18. }

¿GIE es lo mismo que enable_interrupts(global); como se invoca? veo que el compilador acmite -GIE:- pero las interrupciones no funcionan.
GIE es el bit que habilita las interrupciones globales. Poner a 1 este bit es lo mismo que hacer enable_interrupts(global).
Repito, echa un vistazo al datasheet.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Sobre el inicio del timer0
« Respuesta #4 en: 14 de Mayo de 2016, 10:30:01 »
No esto tan bien es lo primero que se me ocurrio a mi, pero no vale Martyyn

#int_TIMER1
void Timer1_isr(void){
   opera++;    //incrementa uno el contador de interrupciones
}
#priority int_ext,timer1

Cualquier otra interrupcion con prioridad se alarga a 1sg y el Timer esta hecho para desbordar cada 0.02sg. Solo el contador(del timer) parece que es el que trabaja en paralelo sin parar. Pero abra un monton de veces que no opera void timer1_isr() y esto ara a su vez que opera este un monton de veces sin incrementar.

¿Alguna sugerencia de paginas pic18-16  datasheet en castellano escepto que se refiera tipo NAME-sentencias,pines?

Esto ya lo e hecho, pero de lo mejor que e encontrado respecto a un 16f877 me encuentro con estos innetenimientos
PORT_E es puerto I/O bidireccional ¿dice ¿paralelo? pero para el caso son 3 como en SPI?
RE0: puede ser control de lectura para el puerto esclavo
RE1: puede ser RW de control para el puerto paralelo
RE2: selector de control paralelo

Interesante Me pregunto si pudieran optimizar la comunicacion de pic a pic, pero no esplica nada mas ni hay ejemplo, tampoco me parece haber visto a nadie utilizarlos.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Sobre el inicio del timer0
« Respuesta #5 en: 18 de Mayo de 2016, 08:24:01 »
No deberias tener interrupciones largas, sino se pierde la utilidad de una interrupcion.
La interrupcion deberia hacer unas pocas instrucciones y salir.
Algo asi:

Código: C
  1. short flagInterrupcion = FALSE;    //variable global
  2.  
  3. #int_TIMER1
  4. void Timer1_isr(void){
  5.     flagInterrupcion = TRUE;    //indica que ha ocurrido una interrupcion
  6. }
  7.  
  8. void main (void){
  9.     ...
  10.    
  11.     if(flagInterrupcion == TRUE){
  12.         flagInterrupcion = FALSE;
  13.         ...lo que antes estaba dentro de la interrupcion
  14.     }
  15.  
  16.     ...
  17. }

Si no puedes hacer esto, puedes comprobar el el bit de si ha ocurrido la interrupcion cada poco tiempo. Cuando entras en una interrupcion las interrupciones globales se deshabilitan, pero siguen ocurriendo, por lo que cuando ocurra la interrupcion deseada su bit se pondra a 1, aunque no interrumpira hasta que termine la interrupcion actual.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.


 

anything