Autor Tema: Precisión del reloj  (Leído 10741 veces)

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

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
Precisión del reloj
« en: 27 de Noviembre de 2003, 14:59:00 »
Hola a todos.

Estoy intentando hacer un temporizador.
Uso un cristal de 4Mhz y haciendo la cuenta 4000000/(4*256*256)
da 15.2 y pierdo precision.
Cada un minuto se adelanta aproximadamente 1 seg.
Que es lo que deberia hacer para hacer un reloj tatalmente preciso.
Cambiar el cristal?

Saludos. Gracias nuevamente.
Pablo.

Desconectado solid84

  • PIC12
  • **
  • Mensajes: 56
RE: Precisión del reloj
« Respuesta #1 en: 27 de Noviembre de 2003, 18:58:00 »
que tal yo te comento que si puedes cambiar el cristal por 1 de 4.096mhz

con el preescaler a 4 y usando la interrupcion del tmr0

tendras interrupciones cada 1milisegundo exactos esta es una buena base de tiempos saludos

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Precisión del reloj
« Respuesta #2 en: 28 de Noviembre de 2003, 08:19:00 »
Hola
Si uso el cristal de 4.096MHz que capacitores uso. (cambia en algo?)
Que es el prescaler 4?
Y por ultimo si podes decime que cuenta deberia hacer para sacar las repeticiones.
Esta era la cuenta que me daba con el cristal de 4MHz

#fuses XT,NOWDT
#use delay (clock=4000000)
#define INTS_PER_SECOND 15.2 // (4000000/(4*256*256))


Muchas gracias.
Saludos.
Pablo

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Precisión del reloj
« Respuesta #3 en: 28 de Noviembre de 2003, 08:44:00 »
El prescaler es un divisor que se puede asignar al Tmr0 o al WatchDog, uno por vez.
El Tmr0 desborda a la cuenta de 255, produciendo una interrupcion.
Si el prescaler esta en 4 entonces cada 4 instrucciones el timer avanza en uno, por lo cual el desborde es a 255 x 4 = 1020 microsegundos, equivalente a 1,02 milisegundos.
para que la interrupcion sea exacta debes poner el Tmr0 en 5 luego de cada interrupcion.
de todos modos influyen otras cosas, como por ejemplo si utilizas instrucciones de mas de un microsegundo el tiempo deriva, pero seria muy raro que te meta mucha diferencia en el tiempo deseado.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Precisión del reloj
« Respuesta #4 en: 28 de Noviembre de 2003, 10:36:00 »
A ver si no me equivoco, que lo hago de memorieta.

La fórmula general puede ser:

t=(256-Recarga) * Preescalar * (4/Fcristal)

Osea, por ejemplo si tenemos un cristal de 4,096Mhz, el máximo que podremos temporizar  por cada interrupción será:

t=(256-0)*256*(4/4096000)=0.064segundos

Si por ejemplo quieres temporizar 1 segundo, pues tendrás que ir incremetado un registro cada, por ejemplo 50ms, que está dentro de máximo que puede contar el timer (64ms).
Por tanto tendrás que hacer una recarga de:

Recarga=256-(0.05*4096000)/(256*4)=56

Por tanto, con un cristal de 4.096MHz, escogiendo predivisor de 256 para el timer0 y haciendo una recarga de 56 tendrás una interrupción cada 50ms.
Ahora 1seg=50ms*20. Osea 20 interrupciones. Ahora pues coges un registro, lo cargas con el número 20 y lo vas decrementando cada interrupción y comprobando si llegó a cero. Cuando llegue a cero pues tienes tu preciado segundo. Vuelves a poner a 20 el registro y vuelta a empezar.
Ten en cuenta que las instrucciones también necesitan un tiempo en ejecutarse. Por lo que es error que se suma. Lo ideal es que cuando salte la interrupción, lo primero a hacer es realizar la recarga.

uff... ya está.

Saludos!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Precisión del reloj
« Respuesta #5 en: 28 de Noviembre de 2003, 10:59:00 »
Yo utilizo para calcular el Valor a cargar en el TMR0 para una determinada temporización, la siguiente fórmula (cosecha propia):

Valor a cargar en TMR0=256 - (Temp · fosc) / (4 · Preescaler)

Yo creo que hay que poner 256, no 255 ya que el TMR0 produce la interrupción (se activa el flag) al  "pasar de 255", no al llegar a 255.

Con esta fórmula si usas una fosc=4MHz, Preescaler=4, Temp=1ms ---> Valor a cargar en TMR0 = 6

Con esta fórmula si usas una fosc=4,096MHz, Preescaler=4, Temp=1ms ---> Valor a cargar en TMR0 = 0

Un saludo

 

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Precisión del reloj
« Respuesta #6 en: 28 de Noviembre de 2003, 11:06:00 »
No me acuses de espionaje pocher
jejeje
Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Precisión del reloj
« Respuesta #7 en: 28 de Noviembre de 2003, 11:10:00 »
Caray Jimy el rápido a tu lado era una sombra. Me has ganado por un pelo.

Saludos Cuca.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Precisión del reloj
« Respuesta #8 en: 28 de Noviembre de 2003, 12:13:00 »
Llevan razon ambos, el overflow es en 256, no en 255.
Pido mis disculpas a ambos, y con mas razon a Pablo si es que pude confundirlo...
Estaba y no me di cuenta de mi error, gracias por corregirme.

Se ve que al pasar de las cuatro decadas empezas a perder neuronas, je.. je..
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Precisión del reloj
« Respuesta #9 en: 28 de Noviembre de 2003, 13:30:00 »
Espero sepan disculpar pero no se realmente mucho del tema.
Estuve tratando de conseguir cristales de 4,096MHz pero solo consegui de 4MHz
Me podrian explicar cual de todos estos es el prescalar y que es lo que tendria que cambiar para que el segundo sea exacto con un cristal de 4MHz

respueta anterior
Con esta fórmula si usas una fosc=4MHz, Preescaler=4, Temp=1ms ---> Valor a cargar en TMR0 = 6
Valor a cargar en TMR0=256 - (Temp · fosc) / (4 · Preescaler)
no entendi muy bien la cuenta seria
TMR0=256-(1000*4000000)/(4*4) (no me dan las cuentas)
Perdon estoy un poco confundido.

#include <16F84A.h>

#use delay (clock=4000000)
#fuses XT,NOWDT
#define INTS_PER_SECOND 80     // (4000000/(4*256*256))

byte int_count;

#int_rtcc                          
clock_isr() {                      
    if(--int_count==0) {          
      segundos1++;
      int_count=INTS_PER_SECOND;
    }

}

void main(void) {
   int_count=INTS_PER_SECOND;
   set_timer0(6);
   setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   for(; {
        // codigo
   }
}

Gracias saludos.
Pablo

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Precisión del reloj
« Respuesta #10 en: 28 de Noviembre de 2003, 14:01:00 »
RE: Precisión del reloj[/b]

<

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Precisión del reloj
« Respuesta #11 en: 29 de Noviembre de 2003, 01:59:00 »
Hola Pablo.

Como tu proyecto debe ser muy exacto. Al usar la fórmula anterior, el Valor a cargar en TMR0 no te debe dar un número decimal, ya que si así fuera tendrías que redondear, produciéndose un pequeño error, que sería exponencial al aumentar el tiempo.

Para que te hagas una idea, mirando los números de Cucaracha:

Usando un cristal de 4MHz, un Preescaler de 256 y deseando una temporización de 50ms sale: Valor a cargar en TMR0=256-(0,050 · 4000000) / (4 · 256) = 256 - 195,3 = 60,7 Aproximaremos entonces a 61.

Si ahora de la fórmula te despejas la Temp y sustituyes el valor 61 en el TMR0 sale Temp = 49,92ms (no 50ms como hubiesemos deseado). Si este número lo multiplicas por 20 (50ms · 20=1000ms=1s) sale 998,4ms con lo que el error que se comete es de 1,6ms cada segundo. Retrasaría 1,6ms

Cada minuto el error sería de 96ms.

Cada hora el error sería de 5,7s.

Cada 24h el error sería de 2,28 minutos (retrasaría esos minutos).

Para una frecuencia de 4MHz los únicos Preescalers que dan números exactos son el Preescaler=4 y Preescaler=8 Por ejemplo con el Preescaler de 8 quedaría:

Valor a cargar en TMR0=256-(Temp·4000)/(4·8)=256-Temp·125 con lo que la Temporización máxima que se podría conseguir sería:

Temp(max)=(256-0)/125=2,048ms El problema es que para conseguir 1s, sale: 1000ms/2,048=488,28 ¡¡¡decimal!!! Se tendría que aproximar a 488 dando ya error en las temporizaciones.

Lo mejor es que te consigas un cristal con el que los números salgan exactos, sin decimales, con el de 4,096MHz salen exactos.

Copiando los números de Cucaracha:

Para fosc=4,096MHz, Preescaler=256, Temp=50ms ---> Valor a cargar en TMR0 = 56 ---> Nº de interrupciones para 1s=20 (50ms·20=1000ms=1s)

Pablo te has equivocado aquí: TMR0=256-(1000*4000000)/(4*4) (no me dan las cuentas) Para 1ms no tienes que poner 1000 sino 0,001, de esa forma sale Valor TMR0=6

Otra cosa que viene del error anterior: en el programa cargas el TMR0 con 6, esta carga es para un Preescaler=4 no de 256 .

Lo dicho creo que lo mejor es agenciarse un cristal con el cual los números sean exactos.

Espero Pablo no haberte liado y no haberme equivocado después de estar pensando, haciendo números y escribiendo durante más de 1 hora.

Un saludo





Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Precisión del reloj
« Respuesta #12 en: 30 de Noviembre de 2003, 10:31:00 »
Agradesco a todos por la explicacion, creo que me quedo bastante claro.
El problema es que en Argentina no consigo ese cristal, si alguien sabe donde puedo conseguirlo, le estare muy agradecido.

Saludos.
Gracias nuevamente.
Pablo

Desconectado solid84

  • PIC12
  • **
  • Mensajes: 56
RE: Precisión del reloj
« Respuesta #13 en: 01 de Diciembre de 2003, 16:06:00 »
que tal disculpa el que tarde en contestar pero me encontraba ausente retomando el tema del cristal te comento si usas el cristal de 4.096Mhz utilizas unos capacitores de 22pf que el valor nominal

ahora con la formula es la siguiente

Fosc/1*4*(Tmr0)*(preescaler)
esto es la freecuencia del reloj es 4096,000 su inversa o la division sobre 1 resultando

000000244140625 o sea 244 nano segundos esto * 4 que es el  reloj del pic que quiere decir esto cada 4 ciclos de reloj se ejecuta una instruccion del micro;

ejemplo;

4096000/1=000000244140625*4=0000009765625 nano segundos
esto es el valor de una instruccion del pic

espero ser claro ahora ya tenemos el valor de la instruccion

siguiendo la formula 4096000/1=000000244140625*4=0000009765625nS*256=
.00025 (250microsegundos)*4=.001(1milisegundo)

esto por el valor de tmr0 que este caso sera el desborde de 00 a ff
son 256

por ultimo el preescaler configuras los bits PS0 a PS2 con el valor 2
esto es 010;

o sea el divisor esta en la escala de division entre 4  
esto lo puedes checar en el datasheet del pic en la seccion del registro opcion

asi tienes una base de tiempo exacta de 1 milisegundo si tu quieres un segundo entonces tendras que contar 1000 incrementos supongamos

void interrupt timer0()
{
     conta1++;
     if(conta1==1000)
     {
        conta1=0;
        segundos++;  
}
en lo personal es muy buena base de tiempo ya que si es exacta puedes probar con la ayuda de un osciloscopio y veras que no se le va nada saludos y espero haber sido claro

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Precisión del reloj
« Respuesta #14 en: 04 de Diciembre de 2003, 10:57:00 »
A ver si con este cristal tienes más suerte en encontrarlo: 32,768 KHz

Cálculos:

Para una temporización de 1s:

Valor a cargar en TMR0 = 256 - (1s · 32768Hz) / (4 · 256) = 256 - 32 = 224

Nº de interrupciones = 1

PD Se me olvidaba los condensadores: 2 de 27p