;definicion de directivas para microcontrolador
__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f84a
#include<p16f84a.inc>
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
endc
push1 equ d'0' ;identifica a RA0
cont equ d'0' ;indica el led a encender
;se configura el microcontrolador
org 0
bsf STATUS,RP0 ;cambiamos a BANCO1
clrf PORTB ;establece PORTB como salida
movlw b'11111111' ;establece PORTA como entrada
movwf PORTA
bcf STATUS,RP0 ;cambiamos a BANCO0
clrf PORTB ;estado inicial de PORTB (leds apagados)
;aqui inicia el programa del microcontrolador
push btfss PORTA,push1 ;testea si se ha pulsado el boton
goto push
call retardo ;ejecuta a retardo hasta que se estabilice la señal
incf cont,f
bsf PORTB,cont
goto push
;subrutina de retardo que evita rebote al pulsar boton (20 milisegundos)
retardo
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
retardo_0
decfsz d1,f
goto $+2
decfsz d2,f
goto retardo_0
goto $+1
nop
return
end
;aqui inicia el programa del microcontrolador
push btfss PORTA,push1 ;testea si se ha pulsado el boton
goto push
call retardo ;ejecuta a retardo hasta que se estabilice la señal
call retardo
incf cont,f
bsf PORTB,cont
goto push
push1 equ d'0' ;identifica a RA0
cont equ d'0' ;indica el led a encender
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
endcincf cont,fdefine constantes, nada mas, luego el compilador reemplaza la palabra por ese numero
Entonces si haces esto:
Código:
incf cont,f
Se reemplazaria por esto:
incf 0,f
El registro 0x00 es el INDF, es a lo que apunta el registro FSR. En fin NO es lo que vos queres hacer. fijate en el datasheet sobre la memoria y vas a notar que el rango de los registros de proposito general comienzan en la direccion 0x0C para el PIC16F84A.
Por eso cuando usas el Cblock pones el 0x0C, ya que el equivalente de ese cblock es:
d1 equ 0x0C
d2 equ 0x0D
Entonces cuando se usan
movwf d1
es igual a:
movwf 0x0C
es decir se guardan en esa direccion de memoria.
Otro problema. como estaba tu programa, si se mantenia presionado el boton, a pesar que existia un retardo de 20ms, este se iba a ejecutar continuamente, entonces seria MUY rapido el cambio y se veria casi como que todos estan prendidos a la vez.
Aunque el programa corra correctamente tenes un error de concepto, los registros que modificas para indicar si son salidas/entradas son los TRISA / TRISB (que se encuentran en el banco 1) que curiosamente comparten la ""misma"" direccion que los PORTA / PORTB y que por eso te funciona. PERO tenes que tenerlo en cuenta. por eso yo lo corregi en todos los codigos.
push2
btfsc PORTA,0 ;espero que suelte
goto push2
incf PORTB,F ;Incremento PORTB
goto push
En realidad no es un error ni un warning, es solo un mensaje.
Message[302] xxxx.asm 52: Register in operand not in bank 0. Ensure that bank bits are correct
Warning[205] xxxx.asm 4 : Found directive in column 1.
Error[113] xxxx.asm 525 : Symbol not previously defined (PCLATH)
Ahi tenes los 3 tipos de mensajes que podes recibir. Luego de compilarlo.
Un error es claramente algo que evita que se pueda compilar. Asi que si tenes un error tenes que solucionarlo
Un warning tambien, normalmente evita que se pueda compilar, un caso seria el de poner un END en la columna 1 donde irian las banderas.
Finalmente lo que recibis vos es un mensaje, es un "recordatorio" para que sepas que no estas en el banco 0 , y estas en el banco 1. Otro mensajes de estos suele aparecer cuando haces un INCF d1 sin poner a donde va destinado, y en el mensaje te "recuerda" que no esta definido y que se va a tomar como si fuera un INCF d1,F .
Si queres evitar ese "mensaje" pone al comienzo del programa:Código: ASM
errorlevel -302
Esto va a evitar que te aparezca el mensaje dejandote a vos el trabajo de asegurarte que no intentar cambiar un registro en el banco equivocado.
;definicion de directivas para microcontrolador
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f84a
#include<p16f84a.inc>
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
leds
endc
boton equ RA0
;se configura el microcontrolador
org 0
bsf STATUS,RP0 ;cambiamos a BANCO1
clrf TRISB ;establece PORTB como salida
movlw b'11111111' ;establece PORTA como entrada
movwf TRISA
bcf STATUS,RP0 ;cambiamos a BANCO0
clrf PORTB ;estado inicial de PORTB (leds apagados)
clrf PORTA ;estado inicial del PORTB (entradas a 0)
;aqui inicia el programa del microcontrolador
push1 btfss PORTA,boton ;testea si se ha pulsado el boton
goto push1
call retardo ;ejecuta a retardo hasta que se estabilice la señal
push2 btfsc PORTA,boton ;en caso de que se deje presionado el boton
goto push2 ;espera a que este se deje de pulsar
call retardo
call encendido_leds
goto push1
;subrutina de retardo que evita rebote al pulsar boton (20 milisegundos)
retardo
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
retardo_0
decfsz d1,f
goto $+2
decfsz d2,f
goto retardo_0
goto $+1
nop
return
encendido_leds
incfsz leds,f ;señala los leds a iluminar al incrementarse
;mediante una resta se determina el led a iluminar
;si el resultado de la resta es 0 se ilumina el led
;en caso contrario se salta si se testean los demas
;leds con el fin de iluminarlos uno a uno en forma
;secuencial
led1 movlw d'1'
subwf leds,w
btfss STATUS,Z
goto led2
bsf PORTB,RB0
goto fin
;-------------------------------------------------------------------
led2 movlw d'2'
subwf leds,w
btfss STATUS,Z
goto led3
bsf PORTB,RB1
goto fin
;-------------------------------------------------------------------
led3 movlw d'3'
subwf leds,w
btfss STATUS,Z
goto led4
bsf PORTB,RB2
goto fin
;-------------------------------------------------------------------
led4 movlw d'4'
subwf leds,w
btfss STATUS,Z
goto led5
bsf PORTB,RB3
goto fin
;-------------------------------------------------------------------
led5 movlw d'5'
subwf leds,w
btfss STATUS,Z
goto fin
bsf PORTB,RB4
goto fin
fin return
end