El mensaje/error que me tira dice así: [PIC16 CORE] PC=0x0053. Stack underflow executing RETURN instruction.
Te lo voy a explicar en algunos ejemplos cual es tu problema. Pero antes necesitas saber como es que funciona el PIC.
El PIC ejecuta las instrucciones una detras de otra, las unicas instrucciones capaces de quebrar esto son aquellas que proveen un salto, tales como BTFSS/BTFSC , DECFSZ/INCFSZ , GOTO/CALL
Cada una funciona de distinta manera. Como sabe el micro que instruccion esta ejecutando ? Bueno el micro tiene un registro que se llama PC ( contador de programa - tiene otro nombre PCL ) Ahi es donde va guardando la direccion de la instruccion a ejecutarse.
Esas instrucciones modifican el PC, pero hay algunas instrucciones como el CALL que guardan ese valor en una pila ( stack ) para saber de donde se lo llamo, Asi cuando se ejecuta el RETURN se saca esto del stack y se pone nuevamente en el PC
MAIN
NOP ;Intruccion 1
CALL ALGO ;Instruccion 2
SUBLW 0x01 ; Instruccion 3
ALGO
SUBLW 0x10 ;Instruccion 4
RETURN ;Instruccion 5
Este este ejemplo es algo muy parecido a tu programa donde tenes tu error, si seguis la logica secuencial, comenzarias por la instruccion 1, luego se ejecutaria la 2, al ejecutarse la 2 se guarda en el stack la proxima direccion (instruccion 3) y salta a la instruccion 4, ejecuta la 5 y esta saca la direccion de la pila y la pone en el PC, por lo cual la proxima instruccion a ejecutar es la 3, pero ahi no termina tu main, sino que sigue ejecutando instrucciones, sigue con la 4 y luego la 5, pero cuando llego a la 5 ocurrio un problema, que es el que tenes, Ya antes se habia ejecutado un CALL - RETURN, por lo tanto se puso algo en la pila y se saco. y ahora estas haciendo un RETURN pero sin un CALL, entonces la pila esta VACIA, no tiene ningun lugar a "volver" y se libera ese error
Mira si le agrego un GOTO a mi main haciendo un bucle cerrado
MAIN
NOP ;Intruccion 1
CALL ALGO ;Instruccion 2
SUBLW 0x01 ; Instruccion 3
GOTO MAIN ; Instruccion 4
ALGO
SUBLW 0x10 ;Instruccion 5
RETURN ;Instruccion 6
Despues de la instruccion 3, ahora la instruccion 4 es el GOTO MAIN, el cual me lo vuelve al comienzo, haciendo que para entrar a ALGO solo pueda hacerlo con el CALL.
El stack son como 8 registros puestos uno encima de otro y se van llenando desde el fondo hasta arriba, siempre se saca la ultima cosa que se puso, es decir lo que esta mas arriba de todo
Puede ocurrir 2 cosas, cuando intentas meter mas cosas de las que puede contener (overrflow) como por ejemplo si se ejecutan muchos CALL y no se ejecutan la misma cantidad de RETURN, o cuando se quita mas de lo que se puso (underflow) como en tu caso que se ejecutan mas RETURN que CALL, Esto lleva a una conclusion simple como que si existe un CALL deberia existir un RETURN, aun asi no es suficiente para evitar errores, si te fijas en mi primer ejemplo ocurre eso pero no se tomaron las precauciones necesarias para que la subrutina no se ejecute 1 sola ves.
Sinceramente te pido disculpas assembler es el lenguaje que más me va a costar aprender bien y para esta materia que me tengo que sacar sabiendo el lenguaje sino a fin de año no tengo mi título.
No es dificil, lo que si tenes que tener en cuenta mucho como funciona el microcontrolador, esto es asi para todo sea microcontrolador o microprocesador.
Bien como dice elreypic2 es comenzar haciendo programas simples.
Una de mis ideas cuando comenzaste con esto fue hacer esto:
MAIN
CALL TOMAR_DATOS
CALL ENVIAR
CALL MOSTRAR_DISPLAYS
CALL ANIMACION
GOTO MAIN
Parece que la estoy complicando no?, pero en realidad lo que estoy haciendo es dividir mi programa en programitas simples, entonces lo que podrias hacer es tratar de crear una funcion para cada una de las tareas y verificar que funcione correctamente. Una ves que tenes todas las tareas hechas tratar de juntarlas poco a poco y ver que funcione todo el conjunto de las mismas.
Por ejemplo en mi codigo habia realizado que TOMAR_DATOS tomara el dato del PORTA lo guardara en un registro y luego lo pasara a BCD, lo hice, lo simule en el MPLAB y funciono correctamente. Listo, ya tengo esa parte lista, segui con lo siguiente en la lista. y asi con todo.
Yo te puedo decir que hacen las instrucciones, en que te equivocaste, pero no voy a poder cambiar tu cabeza con respecto a la programacion. La unica forma que cambies la forma de pensar y entres a la programacion es haciendo ejemplos simples y si te equivocas, preguntas y te corrigen ver exactamente el por que de eso y no simplemente aceptarlo "por que es asi".