TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: wromerob en 14 de Mayo de 2012, 12:57:06
-
Estimados Foristas
Tengo el siguiente problema:
Cuando estoy trabajando con las subrutinas en el DSPIC30F4013, no puedo anidadar mas de tres subrutinas porque el programa se pierde y se resetea. No se si deba ubicar las subrutinas en cierta parte del programa para que el PC del programa no se pierda.
Por favor cualquier ayuda o sugerencia se las agradecería mucho, porque tener que ingresar el codigo completo en vez de trabajar con la subrutina me esta empleando mucha memoria de programa.
Muchas Gracias por su colaboración ¡¡
Saludos
William
-
Seria conveniente que coloques tu codigo para que se te ayude mejor.
saludos
-
Estimado KALLITOS
Gracias por responder, el codigo es algo así:
;/////////////////////////////////////
LEER_APUNTADOR:
CLRWDT
CALL LEER_DIRECCION
.
.
.
.
.
.
.
.
.
GOTO LEER_APUNTADOR
;/////////////////////////////////////
LEER_DIRECCION:
MOV ADDRESS_H,W0
MOV W0,DATO
CALL TX_DATO
RETURN
;/////////////////////////////////////
TX_DATO:
BCLR LATB,#0
CALL RETARDO
BCLR LATB,#1
CALL RETARDO
CALL RETARDO
BSET LATB,#0
RETURN
;/////////////////////////////////////
RETARDO:
MOV #0X0004,W0
MOV W0,TEMP
LOOP_RETARDO:
NOP
DEC TEMP
BTSS SR,#Z
GOTO LOOP_RETARDO
RETURN
;/////////////////////////////////////
De esta forma el programa se me pierde y se resetea, ahora si lo hago de la siguiente manera si me funciona bien:
;/////////////////////////////////////
LEER_APUNTADOR:
CLRWDT
LEER_DIRECCION:
MOV ADDRESS_H,W0
MOV W0,DATO
CALL TX_DATO
.
.
.
.
.
.
.
.
.
GOTO LEER_APUNTADOR
;/////////////////////////////////////
TX_DATO:
BCLR LATB,#0
CALL RETARDO
BCLR LATB,#1
CALL RETARDO
CALL RETARDO
BSET LATB,#0
RETURN
;/////////////////////////////////////
RETARDO:
MOV #0X0004,W0
MOV W0,TEMP
LOOP_RETARDO:
NOP
DEC TEMP
BTSS SR,#Z
GOTO LOOP_RETARDO
RETURN
;/////////////////////////////////////
En conclusión y a mi entender el problema es que estoy anidando más subrutinas de lo que es permitido.
Por favor gracias por cualquier ayuda al respecto.
Saludos,
William
-
Para ahorrarte una llamada, lo que puedes hacer es meter el retardo no desde una subrutina si no como interrupción y testear una bandera en el código que se active cuando transcurra el tiempo que desees. Así quitarías el anidamiento del retardo, aunque no se si solucionará tu problema.
La otra opción que puedes tener, bastante tediosa, es la de guardar tu el estado del STATUS en cada llamada, de esta forma devolverlo al final de los anidamientos, aunque no se si funcionará, nunca lo he hecho para trabajar con subrutinas (sólo con las interrupciones).
-
Estimado NpSepComo
La primera opción podría ser valida, pero la idea es buscar una solución sin tener que eliminar alguna subrutina. Con respecto a tu segunda opción espero entenderte bien, a lo que te refieres es que guarde el estado del PC (Program Counter) para poder tener el control sobre el en cada subrutina, si es así, voy a trabajar en ello y me parece una opción viable. Por lo demás quisiera saber si existe alguna forma de saber con certeza hasta cuantas subrutinas puedo anidar en este DSPIC, o si esto es relativo, o siempre son 2 (que me parece muy poco) o de que depende realmente.
Muchas gracias por tu colaboración
Cordial saludo
William