Problemas con Ensamblador para encender LEDs con RAs

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
 
pues antes no lo tenia y hacia o mismo, despues lo escribi por que pense que se quedaba guardado algo y por eso hacia esa cosa rara, se lo escribi y siguio haciendo lo mismo, por eso lo deje, en todo caso RB tambien tiene algo parecido y no hace lo mismo que RA.

que podria ser lo que lo causa?
 
en todo caso RB tambien tiene algo parecido y no hace lo mismo que RA.
en estas partes del programa :
Código:
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
no las tiene.

Intenta borrando los clrf PORTA ; limpia puerto A de aqui
Código:
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
 
Bien, pues las instrucciones de clrf PORTA ; limpia puerto A ya las habia puesto y quitado y hacia lo mismo, es que he modificado con varias instrucciones para RA por que creia que tlavez se quedaba algo guardado (estoy aprendiendo por mi cuenta y no se del todo lo que pueda estar pasando) pero alguien me dijo que podria ser eso. pero lo intentare de nuevo, tal vez no me di cuenta antes, lo tomare en cuenta, en cuanto a el archivo que adjuntaste Fernandoae. se ve muy bien, solo que no entiendo un par de cosas, por ejemplo:

que es lo que tengo que definir y donde lo defino? en cada #DEFINE y como, es decir el lenguaje acepta los # o para qe sirven?

en los enciende todo y apaga todo, para definirlos puedo usar la instruccion
movlw b'00000'
movwf TRISA
movlw b'00000000'
movwf TRISB
ya sea para encenderolos todos o apagarlos todos (como instruccion de CALL)?

una pregunta mas, podria usar hasta RA7 si quisiera programarlos para encender leds?

intentare programar como se me ocurra basandome en tu ejemplo, espero poder hacerlo.
muchas gracias me ha servido de mucho todos sus aportaciones.
 
fernandoae.
vaya, no vi todo el archivo, solo vi hasta donde me indicas donde comienze mi secuencia basado en todo lo que usas tu. no vi la parte de los retardos.

lo intentare ahora, por eso me marcaba errores y no entendia que deberia hacer.

gracias , te avisare lo que pase
 
bien. ya lo programe pero no funciona.

al parecer solo obedece a la primer instruccion que le doy. y cuando me marca las advertencias y dos mensajes en donde dice dice:

DECFSZ CUENTA2 y DECFSZ CUENTA1, dice using default destination of 1 <file> todo esto en la pantalla del C:\ comando prompt tiene algo que ver?
 
Lo que le falta a los DECFSZ es que le definas si lo guardas en W o en tu registro.
y despues fijate si tenes algun registro especial trabajando en forma oculta, comparador o algo. por que es raro.
yo lo estoy probando a tu codigo en el proteus y hace cualquier cosa, ya de por si la secuencia es rara pero igualmente borra el puerto sin pedirselo.

consejo, si es solo mostrar 13 leds, usa un 16f84a. y si podes usa el mplab para programar

#include <p16f627.inc>

con esta linea te carga todos los registros del micro en el mplab. los que aparecen en la hoja de datos.

aunque no creo que te ayude, algo es algo

nos vemos
 
Hey hermano!
Es importante que leas la documentación acerca del chip que estés usando
Nunca he usado los PICs de la serie 16F62X, pero si los de la 16F87X y en ellos los pines del portA además de comportarse como I/O digitales también son canales analógicos, por lo que que se debe configurar adecuadamente para que se comporte de un modo u otro.
Mirando en el datasheet de la serie 16F62X veo que en el portA, se tienen comparadores, funciones de voltaje de referencia, Schmitt Triggers, relojes, etc; y el RA5 solo es de entrada. Y te da un ejemplo de un segmento de código para configurar el portA como entradas digitales:

Código:
	CLRF PORTA	;Initialize PORTA by
			;setting output data latches
	MOVLW 0x07	;Turn comparators off and
	MOVWF CMCON	;enable pins for I/O
			;functions
	BCF STATUS, RP1
	BSF STATUS, RP0	;Select Bank1
	MOVLW 0x1F 	;Value used to initialize
			;data direction
	MOVWF TRISA 	;Set RA<4:0> as inputs
			;TRISA<5> always
			;read as ‘1’.
			;TRISA<7:6>
			;depend on oscillator mode

Buena Vibra!
 
Atrás
Arriba