Autor Tema: Como hacer un call a otra pagina de la memoria?  (Leído 2860 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bones18

  • PIC12
  • **
  • Mensajes: 54
Como hacer un call a otra pagina de la memoria?
« 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!!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #1 en: 14 de Marzo de 2007, 09:36:54 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado clafuente

  • PIC10
  • *
  • Mensajes: 9
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #2 en: 15 de Marzo de 2007, 09:40:31 »
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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #3 en: 15 de Marzo de 2007, 10:56:35 »
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
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado clafuente

  • PIC10
  • *
  • Mensajes: 9
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #4 en: 15 de Marzo de 2007, 11:23:30 »
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.

Desconectado Kedutpic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 219
    • Microelectronica
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #5 en: 15 de Marzo de 2007, 11:33:03 »
 :) Segun el datasheet del pic 16F876
Actel  -  VHDL un nuevo mundo por descubrir :D
Grupo de Microelectronica - CIDI - UTP
Visitanos en : http://ue.accesus.com

Desconectado clafuente

  • PIC10
  • *
  • Mensajes: 9
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #6 en: 15 de Marzo de 2007, 12:35:47 »
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?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como hacer un call a otra pagina de la memoria?
« Respuesta #7 en: 15 de Marzo de 2007, 12:46:38 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)