Escribiendo en el contador del temporizador mientras el temporizador está funcionando

Estoy usando PIC16F1947 para un proyecto. El proyecto requiere un seguimiento en tiempo real, por lo que se conecta un cristal estable de 32768 Hz con el oscilador Timer1. El circuito del oscilador Timer1 y el cristal proporcionarán un reloj estable para nuestro proyecto.

Timer1 solo puede proporcionar una interrupción cuando el contador del temporizador se desborda. Es un contador de 16 bits, por lo que se dará una interrupción cada vez que el contador pase de 0xFFFF a 0x0000.

Dado que el temporizador se usará para medir el tiempo desde el principio hasta el final del producto, el temporizador 1 no se puede detener. Además, debe ejecutarse mientras el procesador está en reposo. Entonces necesitamos usarlo en modo asíncrono.

En nuestro proyecto también necesitamos interrupciones cada 0,5 segundos. Entonces planeamos inicializar el contador Timer1 a 0xC000 y luego iniciarlo. Cada vez que se dé una interrupción, planeamos hacer un OR bit a bit 0xC0 al byte alto del registro.

Según la hoja de datos:

La lectura de TMR1H o TMR1L mientras el temporizador está funcionando desde un reloj asíncrono externo garantizará una lectura válida (cuidado en el hardware). Sin embargo, el usuario debe tener en cuenta que la lectura del temporizador de 16 bits en dos valores de 8 bits plantea ciertos problemas, ya que el temporizador puede desbordarse entre las lecturas.

Para escrituras, se recomienda que el usuario simplemente detenga el temporizador y escriba los valores deseados. Puede ocurrir una contención de escritura al escribir en los registros del temporizador, mientras el registro se incrementa. Esto puede producir un valor impredecible en el par de registros TMR1H:TMR1L.

¿Está bien bit a bit O 0xC0 con el byte alto mientras se ejecuta el temporizador? ¿O deberíamos usar otro temporizador para una interrupción de 0,5 segundos?

Gracias.

Respuestas (1)

En los PIC con dos temporizadores de 32 KHz (TMR1 y TMR3) mi recomendación sería usar uno de los temporizadores 'en ejecución libre' (nunca escribir en él) y usar el otro para generar eventos de activación. Si solo tiene un temporizador disponible, será muy difícil obtener un funcionamiento confiable sin errores acumulativos. Las diferentes revisiones de partes tienen diferentes comportamientos cuando se trata de escribir el temporizador 1, por lo que un enfoque que funcionaría con una revisión puede verse afectado por una revisión futura. Hubiera sido bueno que Microchip hubiera permitido que el temporizador cambiara entre los modos síncrono y asíncrono sin perder la cuenta (fácil de hacer: en lugar de usar un multiplexor para cambiar entre el modo sincronizado y el asíncrono, agregue el ajuste/borrado asíncrono al pestillo de sincronización, y cuando esté en modo asíncrono, utilícelos para forzar que la salida siga a la entrada). Ninguna de sus partes está, hasta donde yo sé, documentada como haciendo tal cosa. En consecuencia, esperaría que el cambio entre el modo síncrono y asíncrono pueda ganar o perder aleatoriamente un conteo.