hola, estoy aprendiendo lenguaje ensamblador como autodidacta y se me presento un problema con los RA's espero pudan ayudarme. mi problema es el siguiente:
estoy intentando encender 13 leds 8 RB's y 5 RA's, el programa que realize es que encienda uno por uno hasta el final, termine y regrese a hacer lo mismo.
se supone que deberia encender el primero, despues el segundo, y asi consecutivamene, pero todos deberian quedar encendidos, cosa que solo sucede con los RB's, los RA's enciende el primer RA y es el turno del siguiente, pero cuando enciende (el siguiente) , se apaga el anterior y asi consecutivamente. lo raro es que solo sucede con RA's por que los RB's funcionan tal cual los programo y no se por que.
aqui dejo el programa que hice, conozco poco de este lenguaje, me dijeron que leyera el valor existente en el registro del puerto A por que posiblemente este haciendo un reset en el registro interno y eso porvoca que se apaguen. espero que puedan ayudarme por que no se a que se refeian con eso.
gracias.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST p=16f627 ; define el micro a utilizar
radix hex ; define la raiz numérica
__config 0x3D18 ; palabra de configuración del pic
; Declaración de constantes
RP0 equ 5
RP1 equ 6
CMCON equ 0x1F
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
TRISA equ 0x05
TRISB equ 0x06
CNT1 equ 0x20 ; registros utilizados en
CNT2 equ 0x21 ; la rutina de retardo
;;;;;;;;;;;;;;;;;;;; Termina la declaración de constantes;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reset org 0x00 ; origen del programa, aquí comenzaré
; siempre que ocurra un reset
goto inicio ; salto a "inicio"
org 0x05 ; origen del código de programa
inicio bsf STATUS,5 ; pongo rp0 a 1 y paso al banco1
movlw b'00000' ; cargo W con 00000
movwf TRISA ; y paso el valor a trisa
movlw b'00000000' ; cargo W con 00000000
movwf TRISB ; y paso el valor a trisb
bcf STATUS,5 ; pongo rp0 a 0 y regreso al banco0
Ciclo
clrf PORTB ; LIMPIA PUERTO B y A
clrf PORTA
bsf PORTB,3 ; bit 3 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
bsf PORTB,2 ; bit 2 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,1 ; bit 1 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,0 ; bit 0 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,7 ; bit 7 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,6 ; bit 6 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,5 ; bit 5 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,4 ; bit 4 del puerto B en alto
call Retardo ; llama a la rutina de retardo
clrf PORTA ; limpia puerto A
bsf PORTA,2 ; bit 2 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,3 ; bit 3 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,4 ; bit 4 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,1 ; bit 1 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,0 ; bit 0 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
goto Ciclo ; vuelve a iniciar el ciclo
; Rutina de retardo de 250ms
Retardo
movlw 0x4E
movwf CNT1
movlw 0xC4
movwf CNT2
Retardo_0
decfsz CNT1, f
goto $+2
decfsz CNT2, f
goto Retardo_0
goto $+1
nop
return
end
estoy intentando encender 13 leds 8 RB's y 5 RA's, el programa que realize es que encienda uno por uno hasta el final, termine y regrese a hacer lo mismo.
se supone que deberia encender el primero, despues el segundo, y asi consecutivamene, pero todos deberian quedar encendidos, cosa que solo sucede con los RB's, los RA's enciende el primer RA y es el turno del siguiente, pero cuando enciende (el siguiente) , se apaga el anterior y asi consecutivamente. lo raro es que solo sucede con RA's por que los RB's funcionan tal cual los programo y no se por que.
aqui dejo el programa que hice, conozco poco de este lenguaje, me dijeron que leyera el valor existente en el registro del puerto A por que posiblemente este haciendo un reset en el registro interno y eso porvoca que se apaguen. espero que puedan ayudarme por que no se a que se refeian con eso.
gracias.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST p=16f627 ; define el micro a utilizar
radix hex ; define la raiz numérica
__config 0x3D18 ; palabra de configuración del pic
; Declaración de constantes
RP0 equ 5
RP1 equ 6
CMCON equ 0x1F
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
TRISA equ 0x05
TRISB equ 0x06
CNT1 equ 0x20 ; registros utilizados en
CNT2 equ 0x21 ; la rutina de retardo
;;;;;;;;;;;;;;;;;;;; Termina la declaración de constantes;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reset org 0x00 ; origen del programa, aquí comenzaré
; siempre que ocurra un reset
goto inicio ; salto a "inicio"
org 0x05 ; origen del código de programa
inicio bsf STATUS,5 ; pongo rp0 a 1 y paso al banco1
movlw b'00000' ; cargo W con 00000
movwf TRISA ; y paso el valor a trisa
movlw b'00000000' ; cargo W con 00000000
movwf TRISB ; y paso el valor a trisb
bcf STATUS,5 ; pongo rp0 a 0 y regreso al banco0
Ciclo
clrf PORTB ; LIMPIA PUERTO B y A
clrf PORTA
bsf PORTB,3 ; bit 3 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
bsf PORTB,2 ; bit 2 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,1 ; bit 1 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,0 ; bit 0 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,7 ; bit 7 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,6 ; bit 6 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,5 ; bit 5 del puerto B en alto
call Retardo ; llama a la rutina de retardo
nop
nop
bsf PORTB,4 ; bit 4 del puerto B en alto
call Retardo ; llama a la rutina de retardo
clrf PORTA ; limpia puerto A
bsf PORTA,2 ; bit 2 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,3 ; bit 3 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,4 ; bit 4 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,1 ; bit 1 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
clrf PORTA ; limpia puerto A
bsf PORTA,0 ; bit 0 del puerto A en alto
call Retardo ; llama a la rutina de retardo
nop ; los nop se usan para igualar el
nop ; tiempo usado por el ultimo goto
goto Ciclo ; vuelve a iniciar el ciclo
; Rutina de retardo de 250ms
Retardo
movlw 0x4E
movwf CNT1
movlw 0xC4
movwf CNT2
Retardo_0
decfsz CNT1, f
goto $+2
decfsz CNT2, f
goto Retardo_0
goto $+1
nop
return
end