Así que estoy revisando este excelente libro Patrones para sistemas integrados con activación de tiempo y tengo una pregunta sobre el cálculo de valores para los temporizadores de hardware con precisión. Consulte el patrón de "Retardo de hardware" en el libro anterior.
Mi entendimiento es que, una "fuente de reloj" (también conocida como "Reloj del sistema") genera una serie constante de tics (por ejemplo, f1 khz) que luego se alimenta a través de una unidad de "Prescaler" que la divide (por un factor n que puede ser 1) dando otra frecuencia (digamos f2 = f1 / n khz) que luego se alimenta al procesador. Por lo tanto, el "Reloj del procesador" tiene una frecuencia f2 y un período de tiempo t2 = 1 / f2 ms. Para calcular un intervalo de tiempo preciso (por ejemplo, un temporizador de 100 ms), solo calculamos el número de tics en 100 ms como 100 / t2 = f3 "tics de reloj del procesador". Por lo tanto, debemos configurar los registros de temporizador apropiados para los valores correspondientes a f3 para generar un tick de 100 ms.
Sin embargo, no parece ser tan sencillo (al menos para el 8051) debido a la cantidad de tics requeridos para un "ciclo de instrucciones del procesador". Un procesador realiza su ciclo de instrucción, es decir, "Fetch- > Decode- > Execute- > Interrupt" (las interrupciones se comprueban al final de la instrucción actual) que toma una serie de tics. Lo ideal es que todo el ciclo de instrucciones tome solo 1 tic (p. Ej., Un procesador canalizado) y así pueda usar el cálculo anterior para configurar los temporizadores. Sin embargo, aparentemente en el 8051 original, el reloj del sistema funcionó a 12 mhz y cada ciclo de instrucción tomó 12 tics. Dado que las interrupciones se verifican solo al final del ciclo de instrucciones, ahora necesitamos una división adicional por 12 para obtener la marca de reloj correcta del "temporizador", que es "reloj del procesador" / 12, es decir, f2 / 12.
¿Mi comprensión anterior es correcta? Si es verdadero, ¿cómo puedo calcular los tiempos precisos cuando las instrucciones pueden tener diferentes tics de ciclo (por ejemplo, instrucciones mixtas de 32 y 16 bits)? Además, ¿los temporizadores deben incrementarse a través de un ciclo de instrucciones del procesador o hay una manera en HW de incrementar un registro de temporizador estrictamente sincronizado con la salida de la unidad "Prescaler"?