Autor Tema: declarar una etiqueta en función de otra  (Leído 2764 veces)

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

Desconectado norak

  • PIC10
  • *
  • Mensajes: 33
declarar una etiqueta en función de otra
« en: 18 de Febrero de 2010, 12:42:17 »


Hola,

Porqué da error al compilar la siguiente expresión?

ETIQUETA EQU 0x800
ETIQUETA1 EQU 0x863

ETIQUETA2 EQU (ETIQUETA1 - ETIQUETA + 11)

me da error en ETIQUETA2 --> : Duplicate label ("ETIQUETA2" or redefining symbol that cannot be redefined)

Pd. estaría bien la expresión al sumarle el 11 ¿?
quiero sumarle 11 en decimal; o tendría que escribirla así:

 ETIQUETA2 EQU (ETIQUETA1 - ETIQUETA + .11)

gracias

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: declarar una etiqueta en función de otra
« Respuesta #1 en: 18 de Febrero de 2010, 14:40:35 »
.


¿Que tal? Podrías probar usando la directiva SET en lugar de EQU, así:
Código: ASM
  1. ETIQUETA        EQU     0x800
  2. ETIQUETA1       EQU     0x863
  3. ETIQUETA2       SET     (ETIQUETA1-ETIQUETA+11)

O incluso multiplicarlas:
Código: [Seleccionar]
...
ETIQUETA2 SET ETIQUETA*ETIQUETA1

Tiene el mismo efecto que EQU, solo que puede redefinirse a gusto y asignársele expresiones aritméticas con otras etiquetas (como en este caso). Según el archivo de ayuda del MPASM, no debería haber problemas con esto. Te recomiendo que le des una ojeada para que quede más clara la aplicación de SET   :smiley:
¡Saludos!


« Última modificación: 18 de Febrero de 2010, 14:43:08 por mtristan »
When you see a good move, look for a better one (Emanuel Lasker)

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: declarar una etiqueta en función de otra
« Respuesta #2 en: 18 de Febrero de 2010, 16:38:12 »
para que pic estas programando eso :shock: si es un pic de la gama 12xx, 16xx... creo que hasta pic 24xx admiten solo valores hasta 0xff=.255 por lo que mplab grabará otro dato. es por que el registro es de 8bits, solo para que lo tengas en cuenta. si necesitas variables de mayor numero de bits tienes que tratarlos por separado, no se si me explico. en C es otra historia el compilador coge los registros que necesite
para operaciones tipo a+b prueba a hacer asi ((a+b)) ademas el 11 tendrias que ponerle el punto .  ((a-b+ .11)) pero no usando equ
o como te dice mristan usando SET
o con #define, o alguno mas. que seguro tambien lo hay
   etiqueta equ   0x800
   etiqueta1   equ   0x860
#define   etiqueta2   ((etiqueta - etiqueta1 + .11))

mirate este hilo que hay algunos ejemplos

un saludo



Desconectado norak

  • PIC10
  • *
  • Mensajes: 33
Re: declarar una etiqueta en función de otra
« Respuesta #3 en: 19 de Febrero de 2010, 04:27:03 »

Efectivamente con la directiva SET el compilador no da ningún problema!

además según el MPASM USER´s GUIDE ese parece ser su cometido.
muchas gracias.

el pic que utilizo es de la familia 18F, en el que como comentas
los registros son de 8bits, por lo que tienes razón que solo pueden
almazenar hasta un valor de 255 en decimal;

pero entiendo que las etiquetas pueden almacenar un valor superior,
supongo que tanto, como memoria de programa o memoria RAM tengas,
por ejemplo si quires utilizar el direcionamiento indirecto para direccionar
la dirección de memoria 0x800 (.2048) (este pic tiene una RAM superior a 3k)
y quires cargar el registro FSR con esa dirección de memoria, supongo que
no habrá ningún problema en hacer lo siguiente:

ETIQUETA EQU 0x800

lfsr FSR0,ETIQUETA

o por ejemplo cuando haces un salto de un sitio a otro en la memoria del programa

bra   OTRO_SITIO_MEMORIA_PROGRAMA

la etiqueta OTRO_SITIO_MEMORIA_PROGRAMA supongo que se traducirá a su dirección
correspondiente que para un pic con memoria de programa grande será superior a 255

OTRO_SITIO_MEMORIA_PROGRAMA = 0x0FFF x ejemplo

Si esto no es así, porfavor que alguien lo comente

saludos

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: declarar una etiqueta en función de otra
« Respuesta #4 en: 19 de Febrero de 2010, 12:24:46 »
.


Tanto EQU como SET sirven para asignar un nombre a un valor. En la etapa de compilación, el MPASM se encarga de sustituir todas las etiquetas que usaste en tu programa por los valores que les diste al principio. Por eso podés poner, por ejemplo:

Código: ASM
  1. ETIQUETA        EQU     0x3F
  2. ...
  3.         ORG     ETIQUETA        ; SALTA A LA DIRECCION 0x3F DE LA MEMORIA DE PROGRAMA
  4.         SUBLW   ETIQUETA        ; RESTA 0x3F A W
  5.         MOVWF   ETIQUETA        ; COPIA W EN LA DIRECCION 0x3F DE LA RAM

Si alguna de las direcciones que estás usando no son accesibles, el compilador te va a largar el error "Dirección fuera del mapa de memoria". Así que no tengas miedo en usar etiquetas de esta forma.
Espero se entienda  :tongue:. Saludos.


When you see a good move, look for a better one (Emanuel Lasker)

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: declarar una etiqueta en función de otra
« Respuesta #5 en: 19 de Febrero de 2010, 16:44:12 »
Citar
supongo que
no habrá ningún problema en hacer lo siguiente:

ETIQUETA EQU 0x800

lfsr FSR0,ETIQUETA
nop se, aun no se me quedo corto el 16f por lo que no necesite un pic mayor, pero tratandose de registros de 8 bits, supongo que pasara lo mismo, el salto ha de ser de 255 en 255 y deberias cambiar algun bit/s a mano, para seleccionar la pagina de memoria ram a la que apunta el fsr1,2... pues no se le puede cargar un valor mayor a 255. la directiva "BANKISEL" lo hace. aunque ya digo que todavia no le di a los 18f, no se como se usara para varios fsr en los 18f. que no digo que no este bien, solo que le falta un pequeño detalle. al ser de 8 bits no carga el valor 0x800 por lo que el programa no direcciona a ese registro de ram. comprueba en el datasheet los bits que completan la direccion de los fsr. creo se llaman BSR

Desconectado norak

  • PIC10
  • *
  • Mensajes: 33
Re: declarar una etiqueta en función de otra
« Respuesta #6 en: 22 de Febrero de 2010, 04:25:27 »
En este caso no hay problema con la instrucción "lfsr"
ya que utilizar un valor de 12bits (es decir direcciona todo el mapa de memoria)
sin necesidad de cargar el registro BSR como bien apuntas.

Pd, buen consejo con lo de que el compilador te avisa cuando cargas un valor fuera
del mapa de memoria! ;p

gracias