TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: bones18 en 14 de Marzo de 2007, 05:41:38
-
wuenas,
dentro de la pagina de memoria 01 de mi 16f876 he de hacer un call a una subrutina que se encuentra en la pagina 11 y luego volver con el return, pero no acaba de funcionarme.
Creo que aparte del pagesel he de guardar el contexto antes de hacer el call? Teneis algun ejemplo por ahi
gracias!!
-
wuenas,
dentro de la pagina de memoria 01 de mi 16f876 he de hacer un call a una subrutina que se encuentra en la pagina 11 y luego volver con el return, pero no acaba de funcionarme.
Creo que aparte del pagesel he de guardar el contexto antes de hacer el call? Teneis algun ejemplo por ahi
gracias!!
No, no hace falta guardar ningún contexto.
Es simplemente así
RUTINA_PAG1
pagesel RUTINA_PAG3
call RUTINA_PAG3
; aquí cuando vuelve, el PCLATH está apuntando a la página 3, debes cambiarlo si quieres hacer otro salto dentro de página 1.
RUTINA_PAG3
nop
return
Si siguen tus dudas, sube el código en lo posible en un .zip
Saludos
-
Hola a todos.
Estoy empezando a meterme en el tema de los Pic y la instrucción call me generaba una duda: Según había leído en algunos sitios, las subrutinas llamadas con call, debían estar forzosamente en la primera página de memoria. Pero según apunta el Maestro Maunix, si hacemos una selección de pagina primero la llamada se realizará aunque la subrrutina este en otra ¿Es esro correcto? Otra cosa que no me queda clara, es que en un codigo en asembler, según yo tenía entendido, es el ensamblador el que coloca las subrutinas donde el quiere, de forma que ¿Como saber donde ha puesto el ensamblador el código de la subrutina?
Si yo escrivo:
...
CALL NOSEQUE
...
NOSEQUE
NOP
NOP
RETURN
...
La subrutina noseque será puesta en huecos libres de la meroria ¿no? ¿como saber en que página? y otra mas (lo siento) ¿el ensamblador coloca subrutinas mas allá de la primera página?
Un saludo
-
Hola clafuente , maunix tiene razon para hacer llamadas a otra pagina puede seleccionarla usando pclath, otra cosa es que el ensamblador no pone las rutinas donde el quiere , comienza en la direccion 0x00 y va avanzando de acuerdo a las instrucciones que tienes. por ejemplo
org 0x00 ;defines el inicio
goto inicio ; comienzo del programa
nop
nop
nop
nop
nop
inicio
La instruccion goto inicio esta en 0x00 y como luego tienes 5 instrucciones la etiqueta inicio estara en la posicion 0x06 , si no quieres que inicio este en esta posicion puedes definir una nueva direccion usando la directiva org, por ejemplo
org 0x00 ;defines el inicio
goto inicio ; comienzo del programa
nop
nop
nop
nop
nop
org 0x10
inicio
En este caso la etiqueta inicio se encontrara en la posicion 0x10, por lo que entre el ultimo nop y la etiqueta inicio tendras 10 posiciones de memoria.
sobre tus otras preguntas , la cosa depende de la cantidad de instrucciones que tengas en la gama media el tamaño de la pagina es de 2048 posiciones y tienes un maximo de 4 paginas, es decir, 8192 posiciones de memoria de programa , entonces la pagina 1 va de 0x00 a 0x7FF, la pagina 2 va de 0x800 a 0xFFF, la pagina 3 de 0x1000 a 0x17FF y la pagina 4 de 0x1800 a 0x1FFF, entonces si tu quieres poner una subrutina en el inicio de la pagina 3, colocas
org 0x1000
LoQueSea
y para llamarla utilizas el procedimiento que explico maunix , que funciona de forma similar para el goto.
Saludos
-
Hola a todos.
Gracias por responder Sander. Vale, entiendo el forzar la posición del código mediante ORG, lo que pasa es que yo, asta ahora, sólo utilizaba ORG para el inicio del programa y vector de interrupción. El resto del código lo escribía si mas y que el compilador fuese colocandolo donde el quisiera. La verdad es que todavía no tengo tanto dominio del assembler como para ir fijandome en estos detalles.
Gracias y un saludo
Carlos.
-
:) Segun el datasheet del pic 16F876
-
Ok. Y después de ver esto la pregunta es ¿Que es mejor: poner instrucciones call a diestro y siniestro y ya saldrá el sol por Antequera. O posicionar manualmente todas las subrutinas en puntos específicos de la memoria mediante instrucciones ORG?
-
Ok. Y después de ver esto la pregunta es ¿Que es mejor: poner instrucciones call a diestro y siniestro y ya saldrá el sol por Antequera. O posicionar manualmente todas las subrutinas en puntos específicos de la memoria mediante instrucciones ORG?
En lo estrictamente técnico, da lo mismo. En lo que respecta a la forma de programar y si recién comienzas, no.
Me paso a explicar:
En la forma que programo, da lo mismo donde estén las rutinas, pero eso depende también de cuánto sepas y que tan robustas sean tus rutinas. Por ejemplo, si haces un call para leer una tabla, no es lo mismo que contemples que la tabla esté ubicada solamente al principio de un bloque de 256 bytes a que hagas el código de forma que no importe esta cuestión.
Si recién comienzas a programar en assembler, te sugiero sepas bien que haces y donde tienes tu código así no te encontrarás con sorpresas por un desbordamiento del PCL por ejemplo. Entonces mi consejo es : Si recién comienzas, usa el ORG.
Saludos