El retardo mas facil y comun es el que se hace mediante bucles anidados. un ejemplo sencillo:
cblock 0x20
CONT1
endc
movlw k
movwf CONT1
Bucle:
decfsz CONT1,F
goto Bucle
.
.
.
END
para calcular el tiempo del retardo entonces:
operacion num ciclos
movlw k 1
movwf 1
decfsz CONT1,F k-1 (mientras CONT1 no llegue a 0)
decfsz CONT1,F 2 (por el salto al llegar CONT1 a 0)
goto Bucle 2*(k-1)
total (3*k) + 1 ciclos
cada ciclo maquina toma 1 microsegundo si el XTAL es de 4mhz.
como k no puede ser mayor que 255 el numero obtendras un maximo de
766 microsegundos con este retardo basico.
para 1 segundo se necesitan 1 millon de ciclos, asi que se debe anidar este retardo a su maximo en uno mayor entonces:
cblock 0x20
CONT1
CONT2
endc
movlw k2
movwf CONT2
Bucle_2:
movlw k1
movwf CONT1
Bucle:
decfsz CONT1,F
goto Bucle
decfsz CONT2,F
goto Bucle_2
.
.
.
END
asi
operaciones ciclos
movlw k2 1
movwf CONT2 1
movlw k1 k2-1
movwf CONT1 k2-1
decfsz CONT1,F (k2-1)*(k1-1) (mientras no llegue a 0)
decfsz CONT1,F 2 * (k2-1) (al llegar a 0)
goto Bucle 2 * (K2-1)*(k1-1)
decfsz CONT2,F k2-1 (mientras no llegue a 0)
decfsz CONT2,F 2 (al llegar a 0)
goto Bucle_2 2* (k2-1)
TOTAL 4 + ((k2-1)*(4 + 3k1)) ciclos
si reemplazamos k1 =255 y k2 =255 tenemos un total de 195330 microsegundos, aproximadamente 0.2 segundos, sera necesario hacer un 3 bucle.
Bien, siguiendo este ejemplo yo creo que ya podras acabar 3 el bucle tu mismo para completar el de 1, 2 o tantos segundos como quieras.
por otro lado cabe aclarar que el "perro guardian" se usa como medida de seguridad, ya que por X o Y circunstancia el programa de nuestro PIC puede dejar de operar (por ejemplo entrar en un bucle infinito), esto seria catastrofico en un sistema de control. al usar el perro guardian se le configura un tiempo de acción, despues del tiempo programado, el "Perro guardian" realiza un "Reset" del programa. para evitar que el perro guardian reinicie nuestro programa a cada instante, hay que "patearlo" (kick the dog) es decir colocar en segmentos del codigo la funcion "clrwdt" para que se ejecute y no permita que el contador del perro guardian alcance el limite.
espero que esto te sea de alguna ayuda.