Vamos a crear ahora un retardo de 1 segundo, para el parpadeo del led, esto puede realizarse de muchas formas, una de ellas será creando diferentes variables, iremos decrementando su valor hasta que lleguen a cero, de esta forma si sabemos a que velocidad están contando y cuando llegaron de un número a otro, podremos saber cuanto tiempo ha pasado; para esto son importantes diferentes conceptos.
Ciclo de reloj
El ciclo de reloj está dado por la frecuencia del oscilador que estemos utilizando, por ejemplo, con una frecuencia del oscilador de 8MHz, el ciclo de reloj está dado por:
Ciclo_reloj = 1/Fosc = 1 / 8MHz =125ns
Ciclo máquina o ciclo de instrucción
Es el tiempo que tarda nuestro CPU en ejecutar una instrucción en lenguaje máquina, esto es equivalente a 4 ciclos de reloj, por lo tanto:
Ciclo_máquina = 4 * ciclo_reloj = 125ns*4 = 500ns
La función que utilizaremos para decrementar el valor de los contadores es DECFSZ la cual según las hojas de especificaciones tarda 3 ciclos máquina en ejecutarse. Por lo tanto, considerando que la variable será de 8 bits, el tiempo que tardará en llegar de 255 a 0 estará dado por:
tiempo = 255 * (3*500ns) = 382.5us
Si utilizamos dos contadores el tiempo será:
tiempo = 255*255*(3*500ns) = 97.5375ms
Si colocamos un tercer contador que vaya del 11 al 0, el tiempo será:
tiempo = 11*255*255*(3*500ns) = 1.073 s
Entonces tendremos que crear tres variables a las que llamaremos retardos, dos iniciadas en 255 y la otra en 11, para que cuando las tres lleguen a 0 haya pasado aproximadamente 1 segundo.
Para reservar un espacio de memoria para las variables se utilizan las siguientes líneas:
CBLOCK 0x000
Ret1 ;Variables para los retardos de 1 segundo
Ret2
Ret3
ENDC
Posteriormente tenemos que darle a cada Retx (retardo) el valor indicado:
movlw D'255' ;Cargamos los valores de los retardos a las constantes
movwf Ret1 ;correspondientes
movlw D'255'
movwf Ret2
movlw D'11'
movwf Ret3
La función DECFSZ decrementará el valor, posteriormente, si el valor es 0 saltará la siguiente línea del código, si el valor es diferente de 0, seguirá con la siguiente línea de código, por ejemplo, utilizando el siguiente código:
Ret1sON
decfsz Ret1, F ;Decrementa el valor de Ret1 y salta si es igual a 0
bra Ret1sON ;Saltamos a Ret1sON
;Continuación del código
Se decrementa Ret1, si su valor es diferente de 0, se ejecuta la siguiente línea (bra Ret1sON) la cual nos lleva a la etiqueta “Ret1sON”, y vuelve a ejecutarse el decremente, en el momento en que el valor de Ret1 se vuelva 0, saltará la línea “bra” y seguirá con la continuación del código.
De esta forma crearemos una sección para el retardo de 1 segundo y encender el led, y otra para el retardo de 1 segundo y apagar el led. Siendo ambos similares: