Autor Tema: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)  (Leído 6695 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« en: 08 de Octubre de 2008, 14:40:30 »
Hola,

He bajado esta herramienta, muy útil por lo que parece, para calcular Timers y demás cosas pero tengo un problema: ¿Cómo demonios calcula los tiempos?

Me explico: para un reloj de 4MHz, un timer de 8 bits, un escaler de 2 y sin precarga me da un valor de 516,0us y aplicando la formulita típica eso debería ser:

4/4MHz * 2 * 256 = 512us ¿De dónde sale la diferencia? Tiene que ver con el reload (lo tengo a 4 ciclos para u PIC16F)?

Lo mismo pasa para el resto de temporizaciones, siempre hay diferencia entre lo teórico y lo que da el programa, que se supone debería ser lo teórico también.

Gracias por la ayuda.

« Última modificación: 10 de Octubre de 2008, 04:09:45 por DarkVect »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: PIC Multi Calc
« Respuesta #1 en: 08 de Octubre de 2008, 15:40:26 »
Es por el reload, ponlo al mínimo.

En realidad "asumo" que el reload incluye el tiempo en el que entra y sale de la interrupción (y también el momento a partir del cual se carga el timer de nuevo)


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PIC Multi Calc
« Respuesta #2 en: 09 de Octubre de 2008, 04:02:49 »
Sí, yo también creo que es el reload. Lo tengo puesto a 4 porque al lado pone Cycle Inst. y es lo que dura en el PIC. No tengo el programa a mano ahora, pero si lo cambio diría que me cambiará también el 4 de la fórmula teórica para los ciclos de instrucción, no?

De todos modos, si debido a la entrada y salida los tiempos no son exactos, para que usar un rleoj de 3,2768MHz para lograr un segundo si al fin y al cabo con el reload no será un tiempo exato. Mientras tanto con un 4MHz que en principio no da el segundo exacto, con este retardo se consigue una aproximación muy muy cercana ¿?

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: PIC Multi Calc
« Respuesta #3 en: 09 de Octubre de 2008, 14:04:39 »
la mejor prueba es simular el código (mplab ó proteus) y ajustar los tiempos si se da el caso.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PIC Multi Calc
« Respuesta #4 en: 10 de Octubre de 2008, 04:08:56 »
SOLUCIONADO:

Del Datasheet: Cuando se escribe, es decir cuando se utiliza el preload, del Timer0 la cuenta se retrasa siempre 2 ciclos de rleoj por la lógica interna del PIC. De ahí que SIEMPRE que se utilice un set_timer0 hay que tener en cuenta esos dos ciclos adicionales.

Por ejemplo:

A 4MHz el ciclo de instrucción es de 1MHz, utilizando un divisor de 8 tenemos un periodo de 8us. Imagines que sólo queremos contar 100 veces dicho periodo, esto impleicaría realizar una precarga en el timer de 156. Sin embargo y debido al "problema" del retraso, el valor real que se debe cargar es de 158, para que realmente cuente sólo 98 en lugar de 100.

Aquí hay un muy buen link (ver imagen del programa):

http://www.best-microcontroller-projects.com/pic-timer-0.html


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5495
    • Picmania by Redraven
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #5 en: 10 de Octubre de 2008, 06:47:57 »
Hummmmm .... very insteresting.  :shock:

Muchas gracias por la nota. :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #6 en: 10 de Octubre de 2008, 07:22:50 »
La verdad es que sí...  :shock:

Aquí está el Datasheet de un 16F818 donde se explica claramente en la sección 6.1 Timer0 Operation:

http://ww1.microchip.com/downloads/en/DeviceDoc/39598e.pdf

Se puede leer que "si el registro del timer es escrito la interrupción se dehabilita durante los 2 ciclos de reloj siguientes" cosa que genera el comentado problema de precisión. La solución es o no escribir xDDDDD o cargar el timer con +2 ciclos.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17907
    • MicroPIC
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #7 en: 10 de Octubre de 2008, 08:38:39 »
Yo hasta ahora siempre ajustaba de manera empírica, pero gracias a esta investigación  ya sé porqué nunca me cuadraba a la peseta.
Gracias.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #8 en: 10 de Octubre de 2008, 12:40:10 »
Me alegro de que solucionaras el "misterio"

Dichosos Datasheet!! Mira que viene todo, todito, todo!!!

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #9 en: 10 de Octubre de 2008, 12:48:25 »
Eso ya lo tenía visto en el datasheet cuando hice el tema del sincronismo de tv, todo esto viene a que no hay mejor cosa que imprimir y encuadernarlo para tenerlo a mano, sobre todo cuando voy al baño!!!  :D
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #10 en: 10 de Octubre de 2008, 12:52:57 »
Ya que el tema empezaba con el PIC Multi Calc voy a decir que es la re-ostia, con perdón!!

Cuando nos hace las cuentas YA tiene en cuenta todo esto!! Por ejemplo:

Reloj de 4MHz y queremos 1ms en la interrupción:

Solución:

Pre-escaler=4
Pre-load=7
Error=0,00%

El cálculo: 4/4MHz * 4 * (256-7)= 0,996ms -> con los dos ciclos de retraso del timer por usar pre-load (2 * 4/4MHz * 4) = 1ms EXACTO!!

Fascinante!!!  :-/ :-/

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #11 en: 10 de Octubre de 2008, 14:01:11 »
Que bueno que lo solucionaras, yo uso mucho ese programa, por la flojera de estar sacando cuentas y como siempre le hago pruebas de tiempo al programa principal, entonces siempre tengo mi tiempo requerido.  :)

por cierto la página principal del PIC Multi Calc está caida  :(

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17907
    • MicroPIC
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #12 en: 11 de Octubre de 2008, 01:58:54 »
¿Cuál es la página?
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1531
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #13 en: 11 de Octubre de 2008, 02:05:45 »
Hola manolo

es esta: http://www.mister-e.org/

saludos

Hernán
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problema Precisión Timer0 - SOLUCIONADO (INTERESANTE)
« Respuesta #14 en: 15 de Octubre de 2008, 04:50:29 »
No tengo muy claro que la reducción de 2 ciclos en la precarga del TMR0 consiga hacer ir bien a un reloj. Habría que probarlo, personalmente creo que lo mejor para conseguir una base de tiempos exacta es no hacer precargas con el set_timer0.


 

anything