La familia PIC de 8 bits (estoy trabajando con pic18f46k22) ofrece algunos temporizadores (timers1/3/5) que pueden funcionar tanto en modo asíncrono como síncrono cuando se sincronizan desde una fuente externa.
Las diferencias obvias son:
y en cuanto a las ventajas de sincronizar la fuente de reloj externa... bueno, no veo ninguna. Una desventaja a tener en cuenta es la posible corrupción de datos si la CPU intenta leer el contador mientras se incrementa, pero la hoja de datos establece:
12.5.1 LECTURA Y ESCRITURA DEL TEMPORIZADOR 1/3/5 EN MODO DE CONTADOR ASINCRÓNICO: La lectura de TMRxH o TMRxL mientras el temporizador está funcionando desde un reloj asíncrono externo garantizará una lectura válida (cuidado en el hardware).
¿Alguien puede explicar por qué agregaron la posibilidad de sincronizar la fuente del reloj externo con los relojes de fase internos? Siento que me falta algo. Muchas gracias
Algunas operaciones en el temporizador no funcionan cuando podría cambiar en medio de un ciclo. Este temporizador también se utiliza junto con los módulos CCP. Lea la sección de la hoja de datos sobre los módulos CCP y probablemente encontrará restricciones sobre cuándo debe ejecutarse en modo síncrono.
Por ejemplo, la comparación con un valor particular puede ser inestable si el valor del temporizador puede cambiar en medio de la operación de comparación, o puede incrementarse más allá del punto de comparación entre comprobaciones.
Si necesita un temporizador para operar en modo de suspensión, debe configurarse en modo asíncrono, y si el temporizador está configurado en modo asíncrono, cualquier cambio para cambiar su estado bajo el control del procesador (incluido el cambio entre modo síncrono y asíncrono) que ocurre en el al mismo tiempo que un pulso entrante puede causar que su estado se corrompa de manera arbitraria.
Si tiene dos temporizadores con capacidad asíncrona, le sugiero que configure uno de ellos para que se ejecute continuamente y nunca haga nada con él excepto leer su valor. Dichas lecturas deben realizarse leyendo el byte bajo, luego el byte alto y luego el byte bajo nuevamente. Si el byte bajo cambió entre las dos lecturas, repita el proceso. El otro temporizador puede configurarse para eventos de activación, pero con algunas advertencias:
Escriba el byte bajo del temporizador antes de hacer cualquier otra cosa para cambiarlo y léalo después. Si el byte bajo ha cambiado, suponga que el temporizador podría haberse corrompido arbitrariamente y comience de nuevo desde cero.
En al menos algunas partes, la interrupción del temporizador ocurre en el borde del reloj después de un borde del reloj que avanza el temporizador de 0xFFFE a 0xFFFF. Programar el temporizador con un valor de 0xFFFF no provocará una interrupción en el primer tic que sigue a dicha acción, sino en el tic 65.537. No sé si hay una manera de configurar el temporizador para que se interrumpa en el siguiente tic.
Usando estas técnicas juntas, es posible combinar lógicamente los dos temporizadores con capacidad asíncrona para producir la funcionalidad que estaría disponible en un temporizador con una función de comparación asíncrona.
supercat mencionó leer las erratas del microchip... mire la errata de silicio PIC18(L)F26/46K22 Rev. A2/A4 y la aclaración de la hoja de datos (este microcontrolador que está usando):
- Módulo: Temporizador 1/3/5
Cuando Timer1, Timer3 o Timer5 se opera en el modo de entrada externa asíncrona, puede ocurrir una generación de bandera de interrupción inesperada si un borde de reloj externo llega demasiado pronto después de una escritura de firmware en los registros TMRxH:TMRxL. También puede ocurrir un evento de indicador de interrupción inesperado cuando se habilita el módulo o se cambia del modo síncrono al modo asíncrono.
Solución alterna:
Este problema solo se aplica cuando se opera el temporizador en modo asíncrono. Siempre que sea posible, opere el módulo del temporizador en modo síncrono para evitar interrupciones falsas del temporizador.
Una búsqueda rápida en Google también muestra otros problemas con el modo de temporizador asíncrono con otros microcontroladores (ejemplo: errata pic18f4550: falla del mecanismo de lectura en búfer y la errata de la familia pic18f97j60), por lo que probablemente sea un buen punto para no confiar demasiado en el temporizador asíncrono y agregue las dos líneas adicionales de código para verificar cualquier lectura/escritura. y no olvide el código de muestra proporcionado en la fe de erratas para borrar la generación de bandera de interrupción inesperada en una escritura de temporizador
fhlb