Te pongo abajo los fallos de tu programa. Lo he probado corregido y ya funciona.
Codigo:
list p=16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; Línea nueva.
temp0 equ 0x0C
.... .... .... ; Hasta aquí todo igual que el original.
btfss STATUS, 2
goto ampre1 ; Línea cambiada.
return
anid2:
movlw d"100"
movwf temp2
ampre2:
decf temp2, 1
btfss STATUS, 2
goto ampre2 ; Línea cambiada
return
end
De todas formas este programa es un poco "tortuoso", te envio el procedimiento que yo utilizo sacado de un libro, que pienso es mucho más eficaz.
Codigo:
;************************************ Retardo_01.asm ************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; El LED conectado a la línea 0 del puerto de salida se enciende durante 400 ms y se
; apaga durante 300 ms.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.
ENDC
#DEFINE LED PORTB,0
; ZONA DE CÓDIGOS *******************************************************************
ORG 0
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bcf LED ; Línea del LED configurada como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
bsf LED ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
call Retardo_200ms
bcf LED ; Lo apaga durante la suma de los siguientes
call Retardo_200ms ; retardos.
call Retardo_100ms
goto Principal
; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------
;
CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
ENDC
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d"200" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d"100" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d"1" ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d"249" ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto de retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
END
Buenas.
Aqui va otra forma de hacer un retardo con bucles anidados. Este dura un segundo.
Codigo:
;DELAY1S Retardo de 1 seg @ 4MHz
;Retardo = ((256*3+3)*256+3)*5 = 0.986895 seg
delay1s clrf contador1
clrf contador2
movlw 0x05
movwf contador3
dly1 decfsz contador1,f
goto dly1
decfsz contador2,f
goto dly1
decfsz contador3,f
goto dly1
return