Autor Tema: Problemas al programar  (Leído 1859 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado spqp

  • PIC10
  • *
  • Mensajes: 2
Problemas al programar
« 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

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Problemas al programar
« Respuesta #1 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

Desconectado spqp

  • PIC10
  • *
  • Mensajes: 2
RE: Problemas al programar
« Respuesta #2 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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: Problemas al programar
« Respuesta #3 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
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.