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.