Autor Tema: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(  (Leído 7189 veces)

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

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #15 en: 13 de Octubre de 2009, 02:26:43 »
Ademas la diferencia no esta en el orden de los µs sino en los milisegundos adelanta 6 min en 12 hs = se agradece la respuesta

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #16 en: 13 de Octubre de 2009, 02:34:56 »
Yo sigo pensando que ese programa debe retrasar. A ver si hay algún problema con las divisiones y los decimales que tienes en la función que reparte los segundos entre horas y minutos.

¿Puedes hacer una prueba?: no hagas ninguna operación con la variable "momento_actual". Déjala incrementarse indefinidamente y cuando pase una hora justa comprueba si su valor es 3600 justos. Apuesto a que la cifra va a ser menor a 3600.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #17 en: 13 de Octubre de 2009, 13:19:37 »
Analizando un poco como trabaja el sistema todo indica que debería de atrasar tal como comenta Nocturno!

Paso a paso seria, el timer1 cuenta la entrada de una señal externa de 32768Hz, osea un periodo de 30.5us. Entonces cuando se produce la interrupción por overflow se tiene 30us para actualizar el timer y así no perder un ciclo en la cuenta, y esto con un cristal de 4MHz vamos a estar un poco ajustados (Por experiencia el guardado de contexto ronda alrededor de los 50 ciclos) así que lo recomendable sería un cristal de 20 MHz. Luego para el timer0 cuando se realiza una escritura este se inhibe durante 2 ciclos, pero en el datasheet no encontré nada de esto referido al Timer1, pero igual me queda la duda  :?

Sería bueno que realices la prueba que comenta Nocturno, porque por mas vueltas que se le de no se ve porque adelante, y es raro que el cristal este fuera de frecuencia  :undecided:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #18 en: 13 de Octubre de 2009, 16:41:33 »
Hola.

Pues los cristales de 32k768Hz si que son sensibles al calor, hay que soldarlos rápido no mas para evitar estar cambiándolos jejeje. Coincido con Suky, sería mejor aumentar el valor del cristal del oscilador general, para no aumentar el error en tiempo en la gestión de la interrupción.

Saludos
El papel lo aguanta todo

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #19 en: 14 de Octubre de 2009, 12:38:56 »
Bien muchachos estoy enfermo hoy aguantenme un dia y si puse cristal de 20 MHz y lo que dice nocturno son 3 intrucciones de carga del timer que son

MOVLW  80
MOVWF  0F 
CLRF   0E
a 20 megas son 600 ns ahh y otra cosa y hablando a la ligera mire el asm y parece que solo al final de las interrupciones limpia las banderas y recupera los registros imp según creo pero no parece salvarlos,lo vi a la ligera no loestudie pero me parecio eso,mos vemos mañana.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #20 en: 14 de Octubre de 2009, 12:50:23 »
 :shock: No solo eso, esta el guardado de contexto. Buscar información sobre interrupciones, manejo de interrupciones, etc.  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #21 en: 14 de Octubre de 2009, 12:54:41 »
Efectivamente, lo que más consume es el guardado del contexto.

Que te recuperes

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #22 en: 14 de Octubre de 2009, 13:35:00 »
Gracias viejo era una migraña nomas y Suky ya se a lo que te refieres al salvado de los registros importantes como STATUS Y W solo que no le dimos ese nombre en mi escuela y son estas:
Código: [Seleccionar]
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   5A2
0003:  NOP
0004:  MOVWF  7F
0005:  SWAPF  03,W
0006:  CLRF   03
0007:  MOVWF  21
0008:  MOVF   0A,W
0009:  MOVWF  20
000A:  CLRF   0A
000B:  MOVF   04,W
000C:  MOVWF  22
000D:  MOVF   77,W
000E:  MOVWF  23
000F:  MOVF   78,W
0010:  MOVWF  24
0011:  MOVF   79,W
0012:  MOVWF  25
0013:  MOVF   7A,W
0014:  MOVWF  26
0015:  MOVF   7B,W
0016:  MOVWF  27
0017:  BCF    03.7
0018:  BCF    03.5
0019:  BTFSS  0B.3
001A:  GOTO   01D
001B:  BTFSC  0B.0
001C:  GOTO   036
001D:  MOVLW  8C
001E:  MOVWF  04
001F:  BTFSS  00.0
0020:  GOTO   023
0021:  BTFSC  0C.0
0022:  GOTO   039
0023:  MOVF   22,W
0024:  MOVWF  04
0025:  MOVF   23,W
0026:  MOVWF  77
0027:  MOVF   24,W
0028:  MOVWF  78
0029:  MOVF   25,W
002A:  MOVWF  79
002B:  MOVF   26,W
002C:  MOVWF  7A
002D:  MOVF   27,W
002E:  MOVWF  7B
002F:  MOVF   20,W
0030:  MOVWF  0A
0031:  SWAPF  21,W
0032:  MOVWF  03
0033:  SWAPF  7F,F
0034:  SWAPF  7F,W
0035:  RETFIE
asique son 53 + las 3 de carga del timer son 56/5 µs de retraso  11.2 µs de retraso por segundo y no se veria en el proteus porque tiene presición de 4 decimales pero con eso deben pasar casi 100.000 segundos para q retrase un segundo o sea un segundo de retraso cada un poquito mas de un dia y es aceptable tampoco podemos pretender perfeccion absoluta
ademas que si o si se tienen que ejecutar.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #23 en: 14 de Octubre de 2009, 15:34:59 »
mmm... mira el análisis que hice unos mensajes anteriores y te darás cuenta que si usas 20MHz, alcanzas a actualizar el timer antes de que llegue el siguiente pulso  :|
No contesto mensajes privados, las consultas en el foro

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #24 en: 14 de Octubre de 2009, 18:55:52 »
Hola  :) Nocturno:

Citar
Yo no creo que sea el cristal, jamás me he encontrado con un cristal que falle.

El hecho es que falla y esta adelantando como 300 Hz y es este,el de 20 MHz no tiene nada q ver o poco.
No hay otra forma de explicar que adelante!!.
Pero creo que estamos de acuerdo en algunos puntos:

Citar
desde que el micro salta a la interrupción hasta que ejecuta la precarga para la siguiente interrupción hay varios ciclos de reloj, especialmente lo referido al guardado de contexto y alguna operación más.

Citar
Una vez llegado a la precarga, tú le estableces un salto de 32768 ciclos y por lo tanto la duración será de 32768+el tiempo perdido anteriormente.

Asique como esto es inevitable (a menos que se pueda cambiar el orden de ejecución,o sea que primero se salve W y se cargue el timer y solo serian 1000 ns,pero el compilador realiza automaticamente esto asique es inmutable) con este método y si o si hay q cargar el timer porque no hay preescaler 1:2 en el mejor de los casos se logra que retrase 6 minutos por año y con este valor porque tampoco se puede compensar porque
Citar
el timer1 cuenta la entrada de una señal externa de 32768Hz, osea un periodo de 30.5us.
porque son 11 µs a 20 mHz y no podria poner por ejemplo set_timer1(32769) porque me paso y ya adelantaria salvo q use un cristal de 8 MHz entonces la perdida de tiempo ya estaria cerca de los 30,5 se perderia una cuenta y la compensaria sumandole a la carga del timer.
Ya emprolije todo y sigue = voy a hacer lo que planteas Nocturno y despues cuento
Citar
no hagas ninguna operación con la variable "momento_actual". Déjala incrementarse indefinidamente y cuando pase una hora justa comprueba si su valor es 3600 justos. Apuesto a que la cifra va a ser menor a 3600.

y sino de lutima pasare a lo que planteas Suky:
Citar
Se podría combinar el timer con el módulo CCP en modo captura y evento especial (Todo en conjunto funcionaria de la manera que trabaja el timer2 con PR2) para generar la interrupción automática sin recarga del timer logrando mayor precisión.-
Paro lo cual vendria bien que esboces un ejemplo
Todo esto biene despues que logre que atrase y no q adelante,Nos vemos  ;-)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #25 en: 14 de Octubre de 2009, 19:01:24 »
Todavía no logras entender como trabaja o no logre explicarme aquí:

Analizando un poco como trabaja el sistema todo indica que debería de atrasar tal como comenta Nocturno!

Paso a paso seria, el timer1 cuenta la entrada de una señal externa de 32768Hz, osea un periodo de 30.5us. Entonces cuando se produce la interrupción por overflow se tiene 30us para actualizar el timer y así no perder un ciclo en la cuenta, y esto con un cristal de 4MHz vamos a estar un poco ajustados (Por experiencia el guardado de contexto ronda alrededor de los 50 ciclos) así que lo recomendable sería un cristal de 20 MHz. Luego para el timer0 cuando se realiza una escritura este se inhibe durante 2 ciclos, pero en el datasheet no encontré nada de esto referido al Timer1, pero igual me queda la duda  :?

Sería bueno que realices la prueba que comenta Nocturno, porque por mas vueltas que se le de no se ve porque adelante, y es raro que el cristal este fuera de frecuencia  :undecided:

Saludos!

Los 30.5 us es el periodo de la señal que ingresa al timer1 y que cuenta, por eso con lo que detalle saco la conclusión de que es mejor un cristal de 20MHz.

Llegaste a hacer la prueba que indico Nocturno?

Después la opción del combinar CCP con el timer si el problema es la frecuencia del oscilador estamos en las mismas  :?

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #26 en: 14 de Octubre de 2009, 19:09:26 »
Y ahora que lo pienso, ¿porqué no usas el Timer2?
Si le pones un prescaler de 1:16 y un postcaler de 1:8 tendrás 32768 / 16 / 8 = 256 ticks por segundo.
El Timer2 es de 8 bits y desbordaría cada segundo sin tener que precargar nada.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #27 en: 15 de Octubre de 2009, 10:14:20 »
Yo estoy convencido que con el TIMER1 se puede hacer perfectamente.

Configurando correctamente el preescaler se pueden obtener tiempos de interrupción, para ese cristal de 32768 de:

Preescaler  Tint
  1:1              500ms
  1:2            1000ms
  1:4            2000ms
  1:8            4000ms

No hay que estar escribiendo en el registro del TIMER, cosa nada recomendable, ya que se presentan los siguientes problemas

Al escribir el registro, no se puede escribir en TMR1L porque esta acción implica la pérdida de dos ciclos de máquina completos en resincronizar el reloj del temporizador.
Se elimina el tiempo contado por el temporizador desde que se desbordó hasta que se escribió, porque el contador cuenta aún después de desbordarse y pedir INT, la latencia de la interrupción puede ser variable, así que este tiempo no podemos conocerlo a ciencia cierta.
Sería conveniente sólo escribir en TMR1H, tiempo antes que TMR1L se desborde, de modo que no haya problemas con la temporización. Recordemos que TMR1H se incrementa con cada desbordamiento de TMR1L.

Así que lo mejor es no tocar el timer, sino configurarlo correctamente.

Aquí un enlace a un trabajo que no he terminado, pero que puede aclarar algunas cosas:
TIMER1 en los microcontroladores PIC. Ajuste por software del periodo de desbordamiento

saludos
Reinier

« Última modificación: 15 de Octubre de 2009, 10:26:15 por reiniertl »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #28 en: 15 de Octubre de 2009, 10:45:26 »
Configurando correctamente el preescaler se pueden obtener tiempos de interrupción, para ese cristal de 32768 de:

Preescaler  Tint
  1:1              500ms
  1:2            1000ms
  1:4            2000ms
  1:8            4000ms

Estas cometiendo el mismo error mio, sin cargar el timer sería:
Preescaler  Tint
  1:1            2000ms
  1:2            4000ms
  1:4            8000ms
  1:8            16000ms

Ahora con respecto a escribir el timer se pierden 2 ciclos maquinas, si ese fuese el caso no habría problemas, pero se pierden en este caso que usa una fuente externa? (2 ciclos de la fuente externa) Igual si fuera el caso creo que no responde al adelanto que presenta el reloj  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #29 en: 15 de Octubre de 2009, 11:00:04 »
Si el TIMER1 es de 16 bits y el período de reloj para el cristal externo del que se habla es de 32768Hz, en un segundo se producen desbordamientos según la siguiente expresión (2^16)/32768 que da exactamente 2, lo que significa que el timer se desbordará dos veces en 1 segundo, por lo que su período es de 0.5s que es lo mismo que 500ms y así sucesivamente.

Saludos
Reinier

PD: He arreglado este post para que se entienda mejor
« Última modificación: 15 de Octubre de 2009, 11:30:04 por reiniertl »