Autor Tema: Leer Dirección de Memoria de Programa  (Leído 3810 veces)

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

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Leer Dirección de Memoria de Programa
« en: 28 de Agosto de 2010, 22:05:35 »
Quisiera saber si hay alguna forma de obtener la dirección en memoria de programa de una etiqueta, para su uso con las directivas de MPLAB.

Se que se puede obtener la dirección mediante assembler, de la siguiente manera:

Código: ASM
  1. ETIQUETA
  2.  
  3.         ;Codigo
  4.         ;
  5.         ;
  6.  
  7.         movlw   HIGH ETIQUETA
  8.         movwf   VAR_01
  9.         movlw   LOW ETIQUETA
  10.         movwf   VAR_02
  11.  
  12.         ;Codigo
  13.         ;
  14.         ;

Pero lo que busco es ensamblar una sección de código en función de la dirección de la etiqueta, así:

Código: ASM
  1. ETIQUETA
  2.  
  3.         ;Codigo
  4.         ;
  5.         ;
  6.  
  7. #IF     ETIQUETA == H'0298'
  8.         nop
  9.         nop
  10. #ENDIF
  11.  
  12.         ;Codigo
  13.         ;
  14.         ;

Esto último obviamente no funciona...

Alguna Idea???

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Leer Dirección de Memoria de Programa
« Respuesta #1 en: 29 de Agosto de 2010, 04:39:57 »
no se si te entiendo :? pero hallá va, si quieres poner una etiqueta en determinada direccion utiliza org por ej:
org 0x800
ETIQUETA
cada vez que uses etiqueta pondra la direccion 0x800
ahora que si lo que quieres es ver en que direccion de programa te esta poniendo ETIQUETA puedes mirarlo en la ventana view/program view (que alguien me corrija que no tengo el mplab delante) una vez compilas el programa en esta ventana se ve como queda el programa compilado en la memoria
del micro con la direccion donde esta cada linea. espero haberme enterao, pá que esto te sirva

un saludo

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Leer Dirección de Memoria de Programa
« Respuesta #2 en: 29 de Agosto de 2010, 10:59:05 »
He compilado un ejemplo para ver si la directiva del compilador IF puede leer la dirección de memoria de la etiqueta y si la toma. El problema es que debes saber en que lugar va a estar la etiqueta para saber con que valor comparar, en tu caso la etiqueta debes colocarla en 0x298, para que el if sea verdadero y en otro lugar para que sea falso.
Lo que si tienes que tener en cuenta es que la etiqueta debe estar definida antes que ser usada en el IF, sino te va a dar error.
 
Código: ASM
  1. org 0
  2.         goto inicio
  3.        
  4.  
  5.         org 5
  6. inicio
  7.         org 0x298
  8. ETIQUETA
  9.         ;codigo
  10.         ;
  11.  
  12. #IF     ETIQUETA == H'298'
  13.         nop
  14.         nop
  15. #ENDIF
  16.  
  17. end

También puedes hacer

#define variable ETIQUETA.

Con esto variable va a tener el valor de la dirección donde se encuentra ETIQUETA.

Como te dice alogic, si no le asignas un lugar del programa donde va a ir ETIQUETA, puedes verla en View/Program Memory. O con View/Disassemply Listing
« Última modificación: 29 de Agosto de 2010, 11:14:14 por pablomanieri »

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Re: Leer Dirección de Memoria de Programa
« Respuesta #3 en: 30 de Agosto de 2010, 05:44:30 »
Muchas gracias por tu excelente respuesta pablomanieri.

El problema es que la dirección de ETIQUETA varia cada vez que modifico el programa, ya sea para agregar o eliminar código antes de la tabla.


Les planteo un ejemplo:

Tengo Varias Tablas como esta, con diferentes valores:

Código: ASM
  1. TABLA
  2.         PAGESELW        $
  3.         movfw   POINTER
  4.         addwf   PCL,F
  5.         retlw 00H
  6.         retlw   01H
  7.         retlw   02H
  8.         retlw   03H
  9.         retlw   04H
  10.         retlw   05H
  11.         retlw   06H
  12.         retlw   07H
  13.         retlw   08H
  14.         retlw   09H
  15. FIN_TABLA

Imaginense lo que pasa si TABLA está en la posicion h'02FA' (por ejemplo).
El resultado es que el PC me va a saltar hacia otra sección del programa cuando debería saltar a la instrucción retlw 02H en adelante.

La idea es no tener que ubicar las tablas en posiciones específicas de la memoria de programa, sino crear un programa en base a directivas que me ajuste automaticamente la dirección de TABLA a h'0300' (para este caso), y usando la dirección de FIN_TABLA como referencia para definir si dicha TABLA sobrepasa la dirección h'02FF'

Espero haberme hecho entender.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Leer Dirección de Memoria de Programa
« Respuesta #4 en: 30 de Agosto de 2010, 09:18:10 »
No entiendo muy bien que es lo que intentas hacer. Soy medio duro. Si no especificas las direcciones donde van a ir las tablas, el compilador las acomoda automáticamente.

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Re: Leer Dirección de Memoria de Programa
« Respuesta #5 en: 30 de Agosto de 2010, 14:15:14 »
Te Coloco otro ejemplo, ahora un poco más gráfico:

Veamos que la parte enmarcada en rojo utiliza la intrucción PAGESELW para colocar el valor H'03' en el PCLATH.
Al momento de sumar POINTER_LOW al PCL, el PCLATH deberia tener cargado el valor H'04' y NO H'03'.

Lo que busco es hacer un programa en base a directivas que lea la dirección de FIN_ETIQUETA y defina si es mayor
a H'0400' (para este caso), para ajustar ETIQUETA automáticamente a esta dirección (H'0400') , y que rellene el espacio
vacio con NOP, tal y como se ve en la segunda imagen (sección enmarcada en verde)

IMAGEN 1


IMAGEN 2


Espero que alguien me pueda ayudar, Gracias.

Dejo la sección de código, por si quieren hacer la prueba:

Código: ASM
  1. ;Codigo
  2.         ;
  3.         ;
  4.         ;
  5.  
  6. ETIQUETA       
  7.         PAGESELW        $
  8.         movfw   POINTER_LOW
  9.         addwf   PCL,F
  10.         GOTO    LABEL_1
  11.         GOTO    LABEL_2
  12.         GOTO    LABEL_3
  13.         GOTO    LABEL_4
  14. FIN_ETIQUETA
  15.        
  16.         ;Codigo
  17.         ;
  18.         ;
  19.         ;
  20.  
  21.  
  22. LABEL_1
  23.         nop
  24.         nop
  25.         GOTO    END_LABEL
  26. LABEL_2
  27.         nop
  28.         nop
  29.         GOTO    END_LABEL
  30. LABEL_3
  31.         nop
  32.         nop
  33.         GOTO    END_LABEL
  34. LABEL_4
  35.         nop
  36.         nop
  37.         GOTO    END_LABEL
  38. END_LABEL


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Leer Dirección de Memoria de Programa
« Respuesta #6 en: 30 de Agosto de 2010, 16:21:12 »
Hola Andres.

Me parece que te estas complicando mucho sin mayor motivo.

Acá: http://www.todopic.com.ar/foros/index.php?topic=12918.0 tenés una solución sencilla y elegante a lo que buscás.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Re: Leer Dirección de Memoria de Programa
« Respuesta #7 en: 30 de Agosto de 2010, 16:39:00 »
Gracias BrunoF.

Este método ya lo tenia implementado con las tablas, por eso coloque otra situación en el último mensaje (la de los múltiples GOTO consecutivos).

Debido a que son GOTO y no valores a retornar, la rutina no puede ser llamada mediante CALL o LCALL.

Y pues si, me estoy complicando un poco :?,  pero la idea es encontrar la forma de hacerlo así.


Espero más ideas...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Leer Dirección de Memoria de Programa
« Respuesta #8 en: 30 de Agosto de 2010, 16:47:57 »
Lo que te pasé es perfectamente aplicable aún a GOTOs, sin requerir de una subrutina...
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Leer Dirección de Memoria de Programa
« Respuesta #9 en: 30 de Agosto de 2010, 16:52:17 »
Código: ASM
  1. ETIQUETA
  2.         movlw   HIGH    LABELS
  3.         movwf   PCLATH
  4.         movlw   LOW     LABELS
  5.         addwf   POINTER_LOW,W
  6.         btfsc   STATUS,C
  7.         incf    PCLATH,F
  8.        
  9.         movwf   PCL
  10.        
  11.         ;ORG    0x1FE
  12. LABELS  GOTO LABEL_1                    ;no importa donde estan ubicados en la FLASH...
  13.         GOTO LABEL_2
  14.         GOTO LABEL_3
  15.         GOTO LABEL_4
  16.         ;...                            ;MAX 256 elementos en la tabla
  17. FIN_ETIQUETA
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Re: Leer Dirección de Memoria de Programa
« Respuesta #10 en: 30 de Agosto de 2010, 16:59:41 »
:shocked: No me habia fijado en el detalle del incremento del PCLATH !

¡ QUE BUÉN MÉTODO !

Muchas Gracias BrunoF, aprecio bastante tu interés en el tema.

 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Leer Dirección de Memoria de Programa
« Respuesta #11 en: 30 de Agosto de 2010, 17:43:48 »
Me alegro que te haya servido.

Enjoy ;)

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything