Mi problema es que hace poco que estoy con esto de programar PICS (1 semana) y he hexo un programa para realizar un experimento en el trabajo. El problema es que me he mirado ya como 10 veces el codigo y no le veo ningun fallo.
Cuando lo emulo con el mplab me funciona correctamente, pero cuando lo grabo pues no funciona. Os pongo el codigo a ver si es que tengo algun error y alguien me lo puede decir. Gracias
;----------Encabezado----------
List p=16f84 ;usaremos el PIC16F84
radix hex ;numeraci¢n que usamos hexadecimal
;-------mapa de memoria--------
estado equ 0x03 ;asigna la etiq. estado al registro status
trisa equ 0x05 ;asigna la etiq. trisa al estado I/O puertas A
trisb equ 0x06 ;asigna la etiq. trisb al estado I/O puertas B
porta equ 0x05 ;asigna la etiq. porta al nivel de las puertas A
portb equ 0x06 ;asigna la etiq. portb al nivel de las puertas B
opera equ 0x0A ;asigna la etiq. opera para usar la direcci¢n 0x0A como operando a
operb equ 0x0B ;asigna la etiq. operb para usar la direcci¢n 0x0B como operando b
operc equ 0x0C ;asigna la etiq. operc para usar la direcci¢n 0x0C como operando c
cont equ 0x0D ;asigna la etiq. cont para usar la direc. 0x0D como contador
cont2 equ 0X10 ;asigna la etiq. cont2 para usar la direc. como retorado arranque
ret1 equ 0x0E ;asigna la etiq. ret1 para usar la direc. 0x0E como oper. 1 de la rutina de retardo
ret2 equ 0x0F ;asigna la etiq. ret2 para usar la direc. 0x0f como oper. 2 de la rutina de retardo
ret3 equ 0x09 ;asigna la etiq. ret3 para usar la direc. 0x09 como oper. 3 de la rutina de retardo
;---Configuraci¢n de puertos---
reset org 0x00 ;origen del prog. cada vez que haya un reset
goto inicio ;salta a "inicio" (principio configuracion)
inicio bsf estado,5 ;pone el bit 5 del STATUS a "1" para pasar al banco de mem. 1 y config. las puertas
movlw 0x01 ;pone 1 en el W
movwf trisa ;configura la puerta RA0 como entrada y las demás como salidas
clrf trisb ;configura las puertas B como salidas
bcf estado,5 ;vuelve a poner a 0 el bit 5 del STATUS para trabajar en el banco de mem. 0
clrf porta ;pone todas las salidas A a 0
clrf portb ;pone todas las salidas B a 0
bsf cont2,5 ;pone el contador 2 a "0010000"
;--Espera para funcionamiento--
espera btfss porta,0 ;si en la pata RA0 hay un 1 salta una instr. si hay un 0 sigue
goto espera ;salta a la rutina "espera" hasta que hay un 1 en RA0
decfsz cont2 ;decrem. uno el cont2, si se pone a 1 sigue, si 0 salta instr.
goto espera ;salta a la rutina "espera" hasta que hay un 1
bsf portb,1 ;pone la puerta RB1 a 1 para led de power-on
movlw 0X06 ;carga el dato 0x06 en W
movwf cont ;pone el contador a 0x06
;-----Inicializacion Cuenta----
ini movlw 0xFF ;carga el W con todos los bits a 1
movwf opera ;pone el operador a a "11111111"
movlw 0xC8 ;carga el W con el decimal 200
movwf operb ;pone el operador b a "11001000"
movlw 0x02 ;carga el W con el 2
movwf operc ;pone el operador c a "00000010"
;---Deteccion pulsos de SMAP---
detect btfsc porta,0 ;si en la pat. RA0 hay un 0 salta una instr. si hay 1 sigue
goto ini ;salta a la rutina "ini" para resetear el contador
decfsz opera,1 ;decrem. uno el oper. a, si se pone a 0 salta una instr. sino sigue
goto detect ;salta al principio de la rutina "detect"
movlw 0X02 ;carga el dato 0xFF en W
movwf opera ;carga el dato 0xFF en el operador a
decfsz operb,1 ;decrem. uno el oper. b, si se pone a 0 salta una instr. sino sigue
goto detect ;salta al principio de la rutina "detect"
movlw 0X02 ;carga el dato 0xC8 en W
movwf operb ;carga el dato 0xC8 en el operador b
decfsz operc,1 ;decrem. uno el oper. c, si se pone a 0 salta una instr. sino sigue
goto detect ;salta al principio de la rutina "detect"
goto disp ;salta a la rutina "disp"
;-------Rutina de retardo------
retardo movlw 0x07 ;carga el dato 0x07 en W
movwf ret3 ;carga el dato 0x07 en el operador de retardo 3
tres movlw 0xFF ;carga el dato 0xFF en W
movwf ret2 ;carga el dato 0xFF en el operador de retardo 2
dos movlw 0xFF ;carga el dato 0xFF en W
movwf ret1 ;carga el dato 0XFF en el operador de retardo 1
uno decfsz ret1,1 ;decrem. 1 el oper. de ret. 1, si se pone a 0 salta una instr. sino sigue
goto uno ;vuelve a la rutina "uno"
decfsz ret2,1 ;decrem. 1 el oper. de ret. 2, si se pone a 0 salta una inst. sino sigue
goto dos ;vuelve a la rutina "dos"
decfsz ret3,1 ;decrem. 1 el oper. de ret. 3, si se pone a 0 salta una inst. sino sigue
goto tres ;vuelve a la rutina "tres"
retlw 00 ;regresa al lugar donde se llamo a la rutima "retardo"
;------------Disparo-----------
disp bsf portb,0 ;mantiene la puerta RB1 a 1 y pone a 1 la RB0
call retardo ;llama a la rutina de "retardo"
bcf portb,0 ;pone a 0 la RB0 y mantiene RB1 a 1
decfsz cont,1 ;decrem. el cont. en uno, si se pone a 0 salta una instr. sino sigue
goto ini ;vuelve a la rutina "ini" y vuelve a la deteccion de datos
bsf portb,2 ;pone a 1 la salida RB2 y mantiene la salida RB1
sleep ;se pone en bajo consumo
end ;se acabo