Autor Tema: Lio con directiva EQU y su significado  (Leído 10305 veces)

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

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Lio con directiva EQU y su significado
« en: 22 de Noviembre de 2010, 09:54:12 »
Hola a todos

Desde hace unos años programe con ASM, cosas basicas para la uni, luego me pase a C, pero recientemente he tenido que retomar el ASM.

El caso es que tengo un poco de confusion al leer programas en los que veo que se emplea la directiva EQU para crear una constante, cuando en mi cabeza yo la tenia como una directiva que simplemente asigna posiciones en la memoria.

Es decir, si por ejemplo defino una constante1 EQU 0x21 y luego la uso en el programa, solo se tomara el valor contenido en esa direccion 0x21 y se operará con ese valor (que puede ser cualquiera si no se inicializa, o incluso puede ser un registro importante en uso, si no se tiene cuidado de usar uno libre) ¿Es cierto?

Luego tambien veo programas que por ejemplo dicen Constante_timer EQU d'125'  y ahi ya me descolocan en cuanto a la forma de uso

Se que es una pregunta un poco chorra, que directamente inicializando mas adelante en el programa con el valor deseado se soluciona todo, pero me surge la duda de como se usa EQU parqa definir e inicializar constantes.

Muchisimas gracias por adelantado, seguro que para ustedes es algo sencillo :D
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Lio con directiva EQU y su significado
« Respuesta #1 en: 22 de Noviembre de 2010, 10:00:29 »
Podes utilizarlo para los dos casos, establecer una constante o una dirección. Después dependerá de como lo uses con las instrucciones:

Código: ASM
  1. DATA equ  0x20
  2.  
  3.  
  4. movlw  DATA; // Mueve 0x20 ->W
  5. movwf  DATA; // Mueve W-> al registro ubicado en 0x20.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Lio con directiva EQU y su significado
« Respuesta #2 en: 22 de Noviembre de 2010, 10:04:34 »
Muchas gracias!!

Parece que era eso :D, Por tanto entiendo que no debo de preocuparme al asiginar posiciones ocupadas, si luego se tiene cuidado de no modificiarlas, y por ejemplo solo usar instrucciones de uso "literal"

Creo que va a ser que sí

Muchas gracias!!! que eficiencia
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Lio con directiva EQU y su significado
« Respuesta #3 en: 22 de Noviembre de 2010, 10:28:35 »
Hola,

Pues funciona muy bien, Incluso se pueden poner en la directiva el nombre de diversos registros en uso, sin que al renombrarlos con el nobre de tu constante se vean afectados

Es decir, que quiero constante1=0x03, pues puedo poner constante1 EQU STATUS  (Status en este caso ocupa la posicion 3 de la memoria del micro, se puede ver en el archivo .inc del pic en cuestion) y no se ve afectado al tener dos nombres con la misma direccion.

Muvhas gracias amigo, me has resuelto la duda completamente ;-)
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Lio con directiva EQU y su significado
« Respuesta #4 en: 24 de Noviembre de 2010, 12:39:50 »
No puedes saignarle un nombre al registro STATUS porque sino escribiras sobre el y eso puede ser muy malo.
Fijate que Suki te puso la direccion 0X20 porque ahi acaban los reg. propios del PIC (en los 16fxxx) y empieza la zona de memoria que puede usar el programador.
Si pones asi:

    CBLOCK  0X20
REG_1
REG_2
...
REG_N
   
    ENDC

El MPLAB ya te los asigna el solo a partir de la posicion 20h.

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Lio con directiva EQU y su significado
« Respuesta #5 en: 24 de Noviembre de 2010, 15:05:13 »
No puedes saignarle un nombre al registro STATUS porque sino escribiras sobre el y eso puede ser muy malo.
Fijate que Suki te puso la direccion 0X20 porque ahi acaban los reg. propios del PIC (en los 16fxxx) y empieza la zona de memoria que puede usar el programador.
Si pones asi:

    CBLOCK  0X20
REG_1
REG_2
...
REG_N
  
    ENDC

El MPLAB ya te los asigna el solo a partir de la posicion 20h.

Hola tapi8

Hasta donde entendí todo depende de el uso que se haga de esa variable (que instrucciones se empleen con ella). Si lo que comentas es cierto, creo que no seria posible emplear directivas EQU para declarar constantes, ya que el valor de dichas constantes se toma apartir del valor de su posicion. Es decir si uso tu variable REG_1 como constante tiene valor 20. Pero que pasa si quiero usarla como constante de valor 8 (ocupada por registros internos del pic) pues no puedo.

Otra cosa es utilizar posiciones libres (como lo que tu haces) y luego inicializarlas con el valor que deseas. Eso es lo que venia haciendo hasta ahora, pero desconocia el  procedimiento con el uso de la directiva EQU (que me aclaro Suki) de emplear como constante "el numero" de la posicion del registro, y no su contenido

Si estoy equivocado ruego que me lo hagais saber. Mis notas dependen de ello :D :D :D

Un afectuoso saludo
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Lio con directiva EQU y su significado
« Respuesta #6 en: 24 de Noviembre de 2010, 15:13:07 »
Estas en lo correcto Diego Gonzalez. Todo depende de como se use, pero no sería adecuado usar un nombre que ya esta declarado y cambiar su valor, por ejemplo STATUS, PORTA, ect...

Por ejemplo es útil para definir donde se usar un led por ejemplo:

LED1 equ 5

Entonces se puede usar:

bsf PORTB,LED1 // Enciendo led.

Entre otras tantas cosas  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything