Problema en asm con la funcion return

Buenas, estaba termiando un programa en asm usando mplab para el pic16f84. Lo que hace el programa es sencillo, toma 4 entradas del puerto a, para elejir una secuencia de salida en el puerto b. Depende del numero binario que coloques en el puerto a es lo que va a salir, espero que se entienda.

El problema esta en que cuando creo una mascara (para que solo me lea ra0,ra1,ra2,ra3) y coloco una entrada, por ejemplo el 0010, que seria el 2, ahi llamo a una tabla a traves del "call" y busco la posicion 2 y de ahi llamo nuevamente con "call" a la secuencia2, por ejemplo, el tema esta en que cuando cambio el estado en el puertob, por ejemplo a todos en 0, me muestra todas las secuencias que estan en la tabla, osea me llama a todos los call hasta que llega al return que esta en la tabla y ahi vuelve a lo que seria el inicio del programa.
Trate de solucionarlo poniendo un return debajo de cada call en la tabla, pero no puedo por que ocupo la linea que estaria "reservada" para los llamados de la mascara.

Alguna idea? La verdad es que me estoy quemando las pestañas tratando de pensarlo y estoy encerrado, no voy ni para atras ni para delante.

Muchas Gracias, y espero que se alla entendido, si lo necesitan, puedo postear el codigo! (y)
 
y el codigo?? asi es imposible ayudarte, coloca el codigo con la herramienta abajo usada para ello para que en el mensaje salga prolijo y haya como analizarlo, chaooo

por lo poco que se lee no sales bien de la subrutina, debes salir si o si con return, esperemos ver el codigo, chaooo
 
Código:
         __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
        #include <p16f84a.inc>
        list p=16f84a
status    equ 0x03
trisa    equ 0x85
trisb     equ 0x86
porta    equ 0x05
portb    equ 0x06    
pcl          equ 0x02
uno        equ    0x10
dos        equ    0x11
tres    equ    0x12
          org 0x00
          bsf status, 0x05
          movlw 0x1f
          movwf trisa
          movlw 0x00
          movwf trisb
          bcf status, 0x05
inicio
    movf    porta,0
    andlw    0x0f    
    call    tabla
    movwf    portb    
    goto    inicio
tabla
    addwf    pcl,1
    retlw    0x00
    call    secuenciaa
    call    secuenciab
    call    secuenciac
    call    secuenciad
    call    secuenciac
    call    secuenciad
    call    secuenciae
    call    secuenciaf
    call    secuenciag
    retlw    0x80
    return
secuenciaa
        movlw    0xaa
        movwf    portb
        call    demora
        movlw    0x55
        movwf    portb
        call    demora
        return
secuenciab
        movlw    0x80
        movwf    portb
        call    demora
        movlw    0x40
        movwf    portb
        call    demora
        movlw    0x20
        movwf    portb
        call    demora
        movlw    0x10
        movwf    portb
        call    demora
        movlw    0x08
        movwf    portb
        call    demora
        movlw    0x04
        movwf    portb
        call    demora
        movlw    0x02
        movwf    portb
        call    demora
        movlw    0x01
        movwf    portb
        call    demora
        return    
secuenciac
        movlw    0x01
        movwf    portb
        call    demora
        movlw    0x02
        movwf    portb
        call    demora
        movlw    0x04
        movwf    portb
        call    demora
        movlw    0x08
        movwf    portb
        call    demora
        movlw    0x10
        movwf    portb
        call    demora
        movlw    0x20
        movwf    portb
        call    demora
        movlw    0x40
        movwf    portb
        call    demora
        movlw    0x80
        movwf    portb
        call    demora
        return
secuenciad
        movlw    0x80
        movwf    portb
        call    demora
        movlw    0x40
        movwf    portb
        call    demora
        movlw    0x20
        movwf    portb
        call    demora
        movlw    0x10
        movwf    portb
        call    demora
        movlw    0x08
        movwf    portb
        call    demora
        movlw    0x04
        movwf    portb
        call    demora
        movlw    0x02
        movwf    portb
        call    demora
        movlw    0x01
        movwf    portb
        call    demora
        movlw    0x02
        movwf    portb
        call    demora
        movlw    0x04
        movwf    portb
        call    demora
        movlw    0x08
        movwf    portb
        call    demora
        movlw    0x10
        movwf    portb
        call    demora
        movlw    0x20
        movwf    portb
        call    demora
        movlw    0x40
        movwf    portb
        call    demora
        movlw    0x80
        movwf    portb
        call    demora
        return
secuenciae
        movlw    0x81
        movwf    portb
        call    demora
        movlw    0x42
        movwf    portb
        call    demora
        movlw    0x24
        movwf    portb
        call    demora
        movlw    0x18
        movwf    portb
        call    demora
        return
secuenciaf
        movlw    0x18
        movwf    portb
        call    demora
        movlw    0x24
        movwf    portb
        call    demora
        movlw    0x42
        movwf    portb
        call    demora
        movlw    0x81
        movwf    portb
        call    demora
        return
secuenciag
        movlw    0x81
        movwf    portb
        call    demora
        movlw    0x42
        movwf    portb
        call    demora
        movlw    0x24
        movwf    portb
        call    demora
        movlw    0x18
        movwf    portb
        call    demora
        movlw    0x24
        movwf    portb
        call    demora
        movlw    0x42
        movwf    portb
        call    demora
        movlw    0x81
        movwf    portb
        call    demora
        return
demora
        movlw    0x15
        movwf    tres
salto3    movlw    0x15
        movwf    dos
salto2    movlw    0x15
        movwf    uno
salto1    decfsz    uno,1
        goto    salto1
        decfsz    dos,1
        goto    salto2
        decfsz    tres,1
        goto    salto3
        return
        end

Aquí está el código.
El error sé que está en la subrutina tabla, pero no sé como solucionarlo!
Quizás podría multiplicar x2 el resultado de la mascara y ahí poder poner returns debajo de cada call, ¿no?
 
Última edición por un moderador:
El error esta en que al llamar la subrutina TABLA debes terminar esa subrutina y regresar donde estabas, pero en ella tu tambien llamas de nuevo otra subrutinas secuenciaX y es ahi donde se pierde, lo que yo hago es en la tabla incluir GOTO que desvian el programa y ya no necesito regresar, asi entonces no debes usar el call tabla si no GOTO tabla y luego dentro de la tabla colocar GOTO secuenciaX y te liberas del regreso obligado de las subrutinas con return, chaoooo

Claro que las tablas se deben usar para retornar un valor con otro cargado en W previamente y ser usado inmediatamente, eso para no desvirtuar y desordenar tu manejo en ASM, chaoooo
 
Última edición:
El error sé que está en la subrutina tabla, pero no sé como solucionarlo!
Lo que estás creando no es una tabla, más bien es una sub rutina con llamadas a las secuencias.
Nota que ni tienes la forma correcta de llamar a una tabla, ni la "tabla" es una tabla correcta.

Cuando llamas a esa supuesta "tabla", al llegar a al primer retlw, se retornará con 0 en W y esto se repetirá siempre.
Así que, el código debajo debajo del primer retlw nunca se ejecutará.

Si quitaras los retlw y también el addwf pcl,1, así si funcionaría el programa.
Sería otra sub rutina, y no una tabla, pero con llamadas a las secuencias.
 
El tema es que si agrego tantos GOTO como tu dices desbordaria la pila, no?

Los retlw los tengo que dejar si o si, por que cuando esten todas las entradas en 0, el programa muestra las salidas en 0. Y cuando tengo las entradas en 1010 tengo que ver en el puerto B el 10000000 vendria a ser.

Y el tema del addwf esta para que me sume en el pcl el literal que agrego en el puerto a asi voy a la hubicacion que yo quiero acceder en "tabla"

Edit: Asi como esta el programa funciona, no me muestra 0 siempre, el tema esta en que cuando cambio el literal de entrada, si estaba en el 2 y pongo el 8, el puerto B me muestra el 3,4,5,6,7 hasta que llega al 8 y me muestra la secuencia correcta,es como si nunca retornaria a "inicio" por que el return lo tengo debajo de todo y como vuelvo al inmediato mas abajo me muestra esas secuencias indeciadas
 
Última edición:
Noooooooooo los GOTO no usan la pila pues solo son desviaciones del programa, los call SI porque son llamados a subrutinas y se debe guarda el valor del PC en la PILA, ademas estas equivocado en tu programa no veo el RETLW solo veo RETURN, creo debes repasar un poco mas el ASM, pq estas muy confundido, chaooooo

has las correciones y seguimos mirando el codigo.

Yo lo harias mas sencillo asi:

Leo el PORTA
aplico mascara
Sumo ese valor al PC
voy a un GOTO ubicado segun el valor sumado al PC
llego a la secuencia
ejecuto la secuencia
termino y regreso a leer el PORTA de nuevo y ahi queda en un bucle

Debes aclara si la secuencia se ejecuta 1 sola vez o si se debe estar pendiente de cambios en el PORTA
 
Última edición:
Si, disculpa es que soy estudiante y bueno, hago estas cosas para poder aprender :p

Dale, voy a probar cambiando los call de "tabla" por goto y los return de las secuencias por "goto inicio" a ver si puedo crear ese bucle, a experimentar! jaja.

Cualquier duda edito, muchas gracias!
 
Listo, funciona como debe ser! Lo probe en proteus y funca, mañana lo quemo y lo pruebo en proto. Muchisimas gracias, aqui el codigo modificado.

Código:
 		__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
		#include <p16f84a.inc>
		list p=16f84a
status	equ 0x03
trisa	equ 0x85
trisb 	equ 0x86
porta	equ 0x05
portb	equ 0x06	
pcl	  	equ 0x02
uno		equ	0x10
dos		equ	0x11
tres	equ	0x12
      	org 0x00
      	bsf status, 0x05
      	movlw 0x1f
      	movwf trisa
      	movlw 0x00
      	movwf trisb
      	bcf status, 0x05
inicio
	movf	porta,0
	andlw	0x0f	
	call	tabla
	movwf	portb	
	goto	inicio
tabla
	addwf	pcl,1
	retlw	0x00
	goto	secuenciaa
	goto	secuenciab
	goto	secuenciac
	goto	secuenciad
	goto	secuenciac
	goto	secuenciad
	goto	secuenciae
	goto	secuenciaf
	goto	secuenciag
	retlw	0x80
secuenciaa
		movlw	0xaa
		movwf	portb
		call	demora
		movlw	0x55
		movwf	portb
		call	demora
		goto inicio
secuenciab
		movlw	0x80
		movwf	portb
		call	demora
		movlw	0x40
		movwf	portb
		call	demora
		movlw	0x20
		movwf	portb
		call	demora
		movlw	0x10
		movwf	portb
		call	demora
		movlw	0x08
		movwf	portb
		call	demora
		movlw	0x04
		movwf	portb
		call	demora
		movlw	0x02
		movwf	portb
		call	demora
		movlw	0x01
		movwf	portb
		call	demora
		goto inicio	
secuenciac
		movlw	0x01
		movwf	portb
		call	demora
		movlw	0x02
		movwf	portb
		call	demora
		movlw	0x04
		movwf	portb
		call	demora
		movlw	0x08
		movwf	portb
		call	demora
		movlw	0x10
		movwf	portb
		call	demora
		movlw	0x20
		movwf	portb
		call	demora
		movlw	0x40
		movwf	portb
		call	demora
		movlw	0x80
		movwf	portb
		call	demora
		goto inicio
secuenciad
		movlw	0x80
		movwf	portb
		call	demora
		movlw	0x40
		movwf	portb
		call	demora
		movlw	0x20
		movwf	portb
		call	demora
		movlw	0x10
		movwf	portb
		call	demora
		movlw	0x08
		movwf	portb
		call	demora
		movlw	0x04
		movwf	portb
		call	demora
		movlw	0x02
		movwf	portb
		call	demora
		movlw	0x01
		movwf	portb
		call	demora
		movlw	0x02
		movwf	portb
		call	demora
		movlw	0x04
		movwf	portb
		call	demora
		movlw	0x08
		movwf	portb
		call	demora
		movlw	0x10
		movwf	portb
		call	demora
		movlw	0x20
		movwf	portb
		call	demora
		movlw	0x40
		movwf	portb
		call	demora
		movlw	0x80
		movwf	portb
		call	demora
		goto inicio
secuenciae
		movlw	0x81
		movwf	portb
		call	demora
		movlw	0x42
		movwf	portb
		call	demora
		movlw	0x24
		movwf	portb
		call	demora
		movlw	0x18
		movwf	portb
		call	demora
		goto inicio
secuenciaf
		movlw	0x18
		movwf	portb
		call	demora
		movlw	0x24
		movwf	portb
		call	demora
		movlw	0x42
		movwf	portb
		call	demora
		movlw	0x81
		movwf	portb
		call	demora
		goto inicio
secuenciag
		movlw	0x81
		movwf	portb
		call	demora
		movlw	0x42
		movwf	portb
		call	demora
		movlw	0x24
		movwf	portb
		call	demora
		movlw	0x18
		movwf	portb
		call	demora
		movlw	0x24
		movwf	portb
		call	demora
		movlw	0x42
		movwf	portb
		call	demora
		movlw	0x81
		movwf	portb
		call	demora
		goto inicio
demora
		movlw	0x15
		movwf	tres
salto3	movlw	0x15
		movwf	dos
salto2	movlw	0x15
		movwf	uno
salto1	decfsz	uno,1
		goto	salto1
		decfsz	dos,1
		goto	salto2
		decfsz	tres,1
		goto	salto3
		return
		end
 
Por ahi te sobran unas cosas despues del primer llamado de la tabla

movwf portb
goto inicio

ademas si usas #include <p16f84a.inc> no necesitas declarar ningun registro ni puerto pues ya estan declarados en el mismo archivo .inc , te sobraria esto:

status equ 0x03
trisa equ 0x85
trisb equ 0x86
porta equ 0x05
portb equ 0x06
pcl equ 0x02

me alegro vaya bien el circuito, chaooooo
 
movwf portb
goto inicio

En realidad no me sobra por que me sirven para mostrar en el puerto b los retlw de la tabla!

Lo de declarar los registros no lo sabia.

Muchas gracias por tu ayuda!
 
movwf portb
goto inicio
creo te sobra porque dentro de cada secuencia tienes esto
call demora
movlw 0x10
movwf portb
call demora
movlw 0x20
movwf portb

chaoooo

PD: revisando un poco mas yo cambiaria ese CALL tabla al incioi por un GOTO, asi no quedas condicionado a regresar ahi, chaoooo
 
Última edición:
Atrás
Arriba