Autor Tema: ¿Como ubico una variable en una posicion especifica en la RAM?  (Leído 3363 veces)

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

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
¿Como ubico una variable en una posicion especifica en la RAM?
« en: 27 de Junio de 2006, 01:08:04 »
Hola a todos, tengo una duda, si bien el CCS ubica las variables que creamos donde mejor le parece, como puedo decirle yo al compilador que la ponga en un lugar especifico. Si yo quiero tener una variable llamada "X" en la posicion 0x35h del banco 0 de la memoria de datos del PIC, ¿Que es lo que debo de declarar en el CCS? Lo pregunto pues mi intension es hacer un direccionamiento indirecto en ASM dentro de una interrupcion en el CCS.

Por otro lado no se como puedo poner valores manualmente en un vector en una linea de codigo(de preferencia sin usar un bucle) Algo asi como esto:

Posicion[26]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};

Gracias de antemano :-/ :-/ :-/ :-/
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #1 en: 27 de Junio de 2006, 02:03:23 »
1o del Manual del CCS C

#ORG
Syntax: #org start, end
or
#org segment
or
#org start, end {}
or
#org start, end   auto=0 38
C Compiler Reference Manual
Pre-Processor
Elements: start is the first ROM location (word address) to use, end is the last ROM location, segment is the start ROM location from a previous #org
Purpose: This directive will fix the following function or constant declaration into a specific ROM area. End may be omitted if a segment was previously defined if you only want to add another function to the segment.
Follow the ORG with a {} to only reserve the area with nothing inserted by the compiler.
The RAM for a ORG’ed function may be reset to low memory so the local variables and scratch variables are placed in low memory. This should only be used if the ORG’ed function will not return to the caller. The RAM used will overlap the RAM of the main program. Add a AUTO=0 at the end of the #ORG line.
Examples:
#ORG 0x1E00, 0x1FFF
MyFunc() {
//This function located at 1E00
}
#ORG 0x1E00
Anotherfunc(){
// This will be somewhere 1E00-1F00
}
#ORG 0x800, 0x820 {}
//Nothing will be at 800-820
#ORG 0x1C00, 0x1C0F
CHAR CONST ID[10}= {"123456789"};
//This ID will be at 1C00
//Note some extra code will
//proceed the 123456789
#ORG 0x1F00, 0x1FF0
Void loader (){
.
.
.
}
Example Files: loader.c

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #2 en: 27 de Junio de 2006, 13:15:33 »
Hola RedPic gracias por responder, pero aun no me queda claro mi pregunta, pues lo que esta en el manual (que tambien le di una hojeada antes de preguntar) es acerca de como posicionar funciones  o mejor dicho codigo de programa dentro de la ROM del PIC. Y lo que yo quiero saber es como posicionar una variable en un lugar especifico en la RAM (y si se puede posicionar un vector).

Ademas, queria saber si se puede cargar los valores de un vector en una linea de codigo, algo como lo siguiente:
Código: CSS
  1. int8 vector[26];  // No es una constante sino una variable
  2. main()
  3. {......}
  4.  
  5. void Funcion()
  6. {
  7. vector[26]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
  8. .....
  9. for (i=0;i<26;i++)
  10.                vector[i]= x&vector[i];
  11. }

No se si me deje entender. Igualmente agradezco tu ayuda RedPic.

 :-/ :-/ :-/ :-/
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #3 en: 27 de Junio de 2006, 16:31:05 »
Artifox si bien no te puedo ayudar con el CCS, te quería comentar que en el C18 esto se hace por defecto, es decir, uno trabaja sobre el linker file y puede definir donde ubicar cada región de código y cada las variables en la memoria RAM.

Tal vez en el CCS haya una forma similar y sea ese el camino a seguir.

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 RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #4 en: 27 de Junio de 2006, 17:17:42 »
Voy a investigar porque tambien me va ha hacer falta para una cosa que tengo en mente. Quiero poner una tabla de strings de longitud variable en RAM y sería importante poder posicionarla a partir de una dirección conocida en ésta.

Vamos a ver que encuentro. :P

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #5 en: 29 de Junio de 2006, 06:58:48 »
No podia acceder al compilador CCS para buscar la respuesta, pero bueno nunca es tarde si la dicha es buena.
La directiva que permite colocar una variable en una determinada posición de la ram es, copiado literalmente de la ayuda: #LOCATE

#locate id=x
 
Elements:
 id is a C variable, x is a constant memory address
 
Purpose:
 #LOCATE works like #BYTE however in addition it prevents C from using the area.
 
Examples:
 // This will locate the float variable at 50-53
// and C will not use this memory for other
// variables automatically located.
float x;
#locate x=0x50

Example Files:
 ex_glint.c

Saludos
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #6 en: 29 de Junio de 2006, 23:03:55 »
Gracias Jfh900 :-/ :-/ :-/ :-/ Voy a probarlo.... pero seguro q si funciona...

Verdad y como logro cargar valores en un vector en una sola instruccion, asi como:

vector[26]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};

Gracias :mrgreen:
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #7 en: 30 de Junio de 2006, 04:40:10 »
Esto esta extraido del manual de CCS:

byte const FACTORS [4] = {8, 16, 64, 128};

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #8 en: 30 de Junio de 2006, 12:51:07 »
Claro, eso lo vi tambien en el manual, pero es cuando haces la declaracion del vector, ademas es un vector de constantes y mi vector es de variables... Ago como esto:
Código: CSS
  1. int8 vector[26];  // No es una constante sino una variable
  2.  
  3. main()
  4. {......}
  5.  
  6. void Funcion()
  7. {
  8. vector[26]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
  9. .....
  10. for (i=0;i<26;i++)
  11.               vector[i]= x&vector[i];
  12. }

Nos vemos :-/ :-/ :-/ :-/
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #9 en: 30 de Junio de 2006, 14:10:16 »
La unica forma de colocar valores en la memoria del PIC es mediante pograma. Por eso la unica forma de declarar un vector de forma implicita es declarandolo constante, por que de esa forma se pone el vector en le EEPROM de programa y el compilador la puede situar como código. Solo se puede declarar la variable y hay que rellenarla a mano (por programa).

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #10 en: 30 de Junio de 2006, 14:20:23 »
Artifox:

CCS C te permitirá hacer la misma asignación pero a una variable, aunque sólamente en el momento de declararla.  :mrgreen:

Es perfectamente válido escribir:

int vector[26]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};  // No es una constante sino una variable e inicializada con los valores ...

Incluso podrías escribir :

int vector[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};  // No es una constante sino una variable dimensionada dinamicamente con el número de valores iniciales declarados.

Pero no te lo permitirá dentro de ninguna función ya que vector[26] no es una declaración sino el vigésimo sexto elemento de la tabla y vector[] no puedes usarlo ya que es imprescindible un valor de índice para poder usarlo.

Esta declaración es traducido a ensamblador por el compilador como:

int vector[26]={1, 2, 3, 4, 5, 6, ...

01B0:  MOVLW  01 -> Primer valor
01B2:  MOVWF  1A -> Primera direccion en la RAM
01B4:  MOVLW  02 -> Segundo valor
01B6:  MOVWF  1B -> Segunda direccion en la RAM
01B8:  MOVLW  03 -> etc. etc. etc
01BA:  MOVWF  1C
01BC:  MOVLW  04
01BE:  MOVWF  1D
01C0:  MOVLW  05
01C2:  MOVWF  1E
01C4:  MOVLW  06
01C6:  MOVWF  1F
01C8:  ...

Si has utilizado el #LOCATE entonces la primera direccion de la RAM deber ser la que has establecido y las demás correlativamente las siguientes.

Un saludo.  :P



« Última modificación: 30 de Junio de 2006, 14:26:56 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #11 en: 30 de Junio de 2006, 14:25:28 »
Pues tienes toda la razón del mundo. Sin embargo si primero declaras la variable y despues le asignas el vector no funciona, que es lo que yo prove.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #12 en: 30 de Junio de 2006, 16:12:52 »
Hola pues tengo un problemita pues yo debo usar esa variable en todo mi codigo y el lugar donde pongo esa declaracion es dentro de una funcion, por lo que si hago lo que dice nuestro amigo RedPic de "volver"a declarar el vector, este lo ubica en otra posicion de memoria:

Código: [Seleccionar]
int8 vector[26];
#locate  vector=0x20;

main()
      {......}
void Funcion()
      {
      int8 vector[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
      .....
      }

Si no encuentro una solucion lo hago en ASM :(

Gracias  :mrgreen:
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #13 en: 30 de Junio de 2006, 16:22:08 »
Por que no la declaras global y la sacas fuera de la función.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: ¿Como ubico una variable en una posicion especifica en la RAM?
« Respuesta #14 en: 30 de Junio de 2006, 18:06:11 »
Bueno, pues la verdad di lo declare al inicio de TODO el programa, pero igual me lo sigue redefiniendo en otro espacio de memoria. Ya me canse de pelear con eso, asi que caballero a la antigua  :2]

Si encuentro la solucion, les comunico ;)

Gracias :mrgreen:
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)


 

anything