Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Artifox en 27 de Junio de 2006, 01:08:04
Título: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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:
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: RedPic 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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
int8 vector[26]; // No es una constante sino una variable
No se si me deje entender. Igualmente agradezco tu ayuda RedPic.
:-/ :-/ :-/ :-/
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: maunix 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: RedPic 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: jfh900 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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:
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: jfh900 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.
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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
int8 vector[26]; // No es una constante sino una variable
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: jfh900 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: RedPic 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: jfh900 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
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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:
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: jfh900 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.
Título: Re: ¿Como ubico una variable en una posicion especifica en la RAM?
Publicado por: Artifox 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]