Autor Tema: Temporización con el TMR2  (Leído 4675 veces)

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

Desconectado Datasol

  • PIC10
  • *
  • Mensajes: 29
Temporización con el TMR2
« en: 15 de Septiembre de 2004, 11:51:00 »
hola a tod@s:

Pretendo conseguir un retardo de 1 segundo, utilizando para ello el TMR2, el prescaler y postscaler y el PR2, utilizando la interrupción de overflow.

la formula que he utilizado para conseguir 1 segundo es la siguiente,utilizo un oscilador de 4 Hhz.
Codigo:
Tiempo Overflow= 4 * Tosc *PRESCALER * POSTESCALER * PR2
62464 useg = 4 * 0,25 useg*16 * 16 * 244

contando 16 overflows obtenemos un valor muy cercano a 1 segundo:
Codigo:
62464 useg * 16 = 999424 useg   ~  1 seg

El CODIGO para configurar el TMR2 que he utilizado es este:

Codigo:

;............................. TMR2 .........................................
;tempOvF= 4 x Tosc x PR2 x preescale x postescale
;1/16 seg  = 0.5 useg  x  16   x  16  x    244            
BANK0              ;BANCO 0
MOVLW   b"11111011"     ;preecale 1:16, postescale 1:16, TMRON 0 (stop)
MOVWF   T2CON
BANK1               ;BANCO 1
movlw   d"244"
movwf   PR2                 ;timer2 period register: 244   
bsf   PIE1,TMR2IE     ;activamos interrupción TMR2
   BANK0
bsf   T2CON,TMR2ON; Activamos el Timer 2   

Mi problema es que al simular en Proteus, los 16 overflows se completan en unos 17 minutos.

Se que el simulador Proteus no puede reproducir el programa a tiempo real, como lo hace el propio microcontrolador, pero esta diferencia de tiempo me parece excesiva.
Mi pregunta es ¿hay algún error en el codigo? o bien ¿el Proteus deja mucho que desear?

GRasias...

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Temporización con el TMR2
« Respuesta #1 en: 15 de Septiembre de 2004, 13:12:00 »
Temporizaciones usando el TMR2 por interrupción fué uno de los "bugs" que me encontré hace tiempo con un programa escrito en ensamblador:

No se disparaba la interrupción por igualación del TMR2 con el registro PR2 , debido a que el bit TMR2IF en PROTEUS no pasaba a 1 (¡me apunté el bug!).

Compruebalo en MPLAB, allí tiene que subir ese bit y de hecho sube.

Las temporizaciones por interrupción con el TMR0 y TMR1 van bien.

De todas formas ¿no te has olvidado en el programa de habilitar las interrupciones?:

movlw  b"11000000"
movwf  INTCON

Un saludo




Desconectado Datasol

  • PIC10
  • *
  • Mensajes: 29
RE: Temporización con el TMR2
« Respuesta #2 en: 15 de Septiembre de 2004, 15:50:00 »
thx pocher..

El codigo que habilita las interrupciones está en mi programa, aunque no aparece en el post.

Las interrupciones de los timers TMR1 y TMR2, que son las que utilizo, funcionan correctamente, tanto en MPLAB como en Proteus 6.2 SP5. El inconveniente es que tardan muchisimo tiempo (unos 17 minutos) en contar lo que debería ser 1 seg.

Como sabeis, la preescala que marca en número de oscilaciones de reloj que han de producirse para incrementar en 1 el temporizador.
La postescala marca el número de veces que ha de encontrarse el TMR2 con el valor del registro PR2 para activar el TMR1IF y originar una interrupción (si esta estuviera habilidada).
Si algo de esto no es correcto, espero me lo digan.

he comprobado que todo esto sucede en mi programa pero a una velocidad muy lenta. Así que he empezado a dudar de si los valores de preescala postescala y PR2 que he utilizado son los correctos. Si no me he equivocado,  debe ser que el proteus va muy muy lento con los timers.. ¿no?




Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Temporización con el TMR2
« Respuesta #3 en: 16 de Septiembre de 2004, 12:48:00 »
Oye pués tienes razón, sí se dispara la interrupción, pero cuando quiere dispararse ya me han salido canas. Por eso no me dí cuenta en su momento no fuí tan paciente como tú.

De todas formas hay que adjudicarle al PROTEUS en cuanto al disparo de la interrupción usando el TMR2 un "bug" como una casa.

Dices que con el TIMER1 también te pasa? A mí si la única neurona memorística que tengo no me falla no me daba problemas en cuanto a los tiempos por interrupción.

Un saludo