Este tipo de retardo se escala de forma lineal inversa con la velocidad del reloj siempre y cuando no haya interrupciones o ejecuciones similares (es decir, doble velocidad de reloj y mitades de retardo).
-
Si una demora toma 1 mS en Z Mhz, tomará Y / Z mS en Y Mhz.
-
Si necesita un conteo de bucles X para retrasar, por ejemplo, 1 ms en Z MHz
entonces necesitará X * Y / Z bucles en Y MHz.
Esto es útil: Rutinas de retardo de PIC .
Para calcular cuántos bucles se necesitan, primero debe saber el número de ciclos de reloj o de Estados Unidos por instrucción a la velocidad de reloj utilizada.
Para el PIC que has mostrado, la mayoría de las instrucciones toman una "unidad" de tiempo.
Esto variará entre las familias de procesadores.
Algunos toman 4 ciclos de reloj de cristal por instrucción, otros toman 1, otros toman más.
Supongamos que sabe Tw = tiempo de unidad de instrucción básica en W Mhz.
En un PIC, la mayoría de las instrucciones se ejecutan en Tw en W Mhz donde Tw es generalmente 4 / F_Mhz en los PIC de 14 bits de estilo más antiguo. .
PERO compruebe esto para el procesador que está utilizando.
En un PIC, la instrucción de salto de decfsz toma una unidad de tiempo si la prueba falla (el registro no es cero) y dos unidades de tiempo si la prueba pasa, el registro es cero y se produce un salto.
Algunos procesadores pueden tomar una unidad si la prueba falla o pasa uno o dos si falla o pasa o ... - verifique qué se aplica al procesador que está utilizando.
Así que aquí el bucle de tiempo principal es 3 unidades de tiempo generalmente y 4 unidades solo cuando el registro llega a cero.
Calcule el tiempo de la unidad básica (por ejemplo, para la instrucción nop) a la velocidad de reloj W Mhz y una mS necesita un conteo de x en 'movlw x' de
Si un NOP tomó 0.5 uS entonces
- Cuenta = 1000 / 0.5 / 4 = 500.
Como un contador de 8 bits solo puede contar hasta 255, si variable_temp es de 8 bits, esta cuenta es demasiado grande y se necesita un contador de doble byte.
Algo más parecido a continuación.
Aquí tienes loops internos y externos.
Cada bucle interno se ejecuta para K_Count_Low y el bucle interno se llama K_Count_High times. Los contadores son de 8 bits, por lo que se deben establecer en < = 255.
El retraso máximo es ~~~ = 255 x 255 x 3 x Tw.
Manejo de bucles externos, nops incluidos, etc., cambian esto. Ver exactamente cómo es parte de aprender cómo funciona todo esto.
movlw K_count_High
movwf Counter_High
LoopOuter:
movlw K_count_Low
movwf Counter_Low
LoopInner:
nop
decfsz CounterLow, 1
goto LoopInner
decfsz CounterHigh, 1
goto LoopOuter
Call "We are the Borg of Pentium. Division is futile! We will approximate you"
E & OE.