TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: spqp en 15 de Junio de 2005, 12:11:00

Título: Problemas al programar
Publicado por: spqp en 15 de Junio de 2005, 12:11:00
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
Título: RE: Problemas al programar
Publicado por: antoniof en 15 de Junio de 2005, 13:29:00
Aqui tienes unas modificaciones recomendadas

Codigo:
;----------Encabezado----------

List p=16f84 ;usaremos el PIC16F84
radix hex ;numeraci¢n que usamos hexadecimal

;PALABRA DE CONFIGURACIÓN:

_CP_OFF         equ     H"3FFF"   ;Protección de código OFF
_PWRTE_OFF      equ     H"3FFF"   ;Temporizador "Power up" OFF
_PWRTE_ON       equ     H"3FF7"   ;Temporizador "Power up" ON
_WDT_ON         equ     H"3FFF"   ;Perro guardián ON
_WDT_OFF        equ     H"3FFB"   ;Perro guardián OFF
_XT_OSC         equ     H"3FFD"   ;Oscilador XT

   __CONFIG   _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

;La palabra de configuración le indica al programador los fusibles que
;debe programar en el PIC. Sin ella lo tendrás que hacer a mano.

;-------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 0x20 ;asigna la etiq. opera para usar la direcci¢n 0x0A como operando a
operb equ 0x21 ;asigna la etiq. operb para usar la direcci¢n 0x0B como operando b
operc equ 0x22 ;asigna la etiq. operc para usar la direcci¢n 0x0C como operando c
cont equ 0x23 ;asigna la etiq. cont para usar la direc. 0x0D como contador
cont2 equ 0X24 ;asigna la etiq. cont2 para usar la direc. como retorado arranque
ret1 equ 0x25 ;asigna la etiq. ret1 para usar la direc. 0x0E como oper. 1 de la rutina de retardo
ret2 equ 0x26 ;asigna la etiq. ret2 para usar la direc. 0x0f como oper. 2 de la rutina de retardo
ret3 equ 0x27 ;asigna la etiq. ret3 para usar la direc. 0x09 como oper. 3 de la rutina de retardo


;Recomiendo definir las variables a partir de la dirección 0x20. Así guardarás
;compatibilidad con otros PICs

;---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
movlw b"0010000"
movwf cont2
; con esto si que puedes asegurar que el valor del registro
;es el que dices. Si no el registro sólo tendrás seguro el bit 5 a uno. El resto
;depende del valor que tenga después de unreset, que es aleatorio.

;--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


Por lo demás lo veo todo correcto. Prueba lo del CONFIG y luego nos cuentas
Título: RE: Problemas al programar
Publicado por: spqp en 15 de Junio de 2005, 14:01:00
Antonio te daria y beso ahora mismo. Ahora lo estoy probando y perfecto. Lo unico que tengo que mirar son los tiempos de los retardos. Eres un crack muchas gracias
Título: RE: Problemas al programar
Publicado por: BrunoF en 25 de Septiembre de 2005, 06:57:00
Spqs, veo que tu error estaba en la asignacion de posiciones de memoria a tus GPR, recuerda que en el 16F84 la primer posicion que le puedes asignar a un GPR es la 0x0C.
Por ahi el WDT tambien estaba hechando broma con los reset. bueno. exitos.RebotadoRebotadoRebotadoRebotado