Ya, ya, quise decir que no me hacía falta sincronizar el bucle con las interrupciones, jiji.
Bueno, vamos que nos vamos. Sean:
c(p) los ciclos que lleva cada iteración del bucle de pausa
c(i) los ciclos que lleva cada interrupción
N el número de iteraciones que hace el bucle
f la frecuencia del Z80 (3,5E6)
50 el número de interrupciones por segundo (en USA y otros este número es 60)
Entóns, el tiempo que tarda la pausa si no hubiera interrupciones sería:
Durante ese tiempo, se habrá interrumpido el tema 50 veces cada segundo, es decir
De este modo, el tiempo total que la CPU atiene a la interrupción será:
Este tiempo hay que adicionarlo al tiempo que la CPU está en el bucle de pausa, así que el tiempo total es:
Código: Seleccionar todo
T = t(p) + t(i) = N*c(p)/f + (50*N*c(p)/f) * c(i)/f =
[N*c(p)/f]*(1 + 50*c(i)/f)
Y ahora vamos a usar el sentido común. ¿Acaso no es 50*c(i) << f? Téngase en cuén que f es 3 millones y medio, haría falta una rutina megatecnotrónica para que afectara en algo. Así que lo vamos a despreciar, y la fórmula se queda simplemente en su vertiente "sin interrupciones":
Así las cosas, veamos cuánta N hace falta para generar 1 segundo de pausa:
Nos sale que hacen falta 135000 iteraciones para 1 segundo de pausa. Pero los registros de 16 bits dan para la mitad, ya que llegan hasta 65535 aprox. Así que podemos concluir con una regla muy básica y prástica:
1 registro de 16 bits da para medio segundo
Así que si alguien quiere una pausa de p.ej. 40 segundos, pues llámese 80 veces a la rutina de pausa.
¡¡¡YIIIHAAAA!!!
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!