Autor Tema: [SOLUCIONADO]¿Donde guardar arrays largos?  (Leído 6081 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
[SOLUCIONADO]¿Donde guardar arrays largos?
« en: 11 de Septiembre de 2014, 14:28:35 »
Hola a todos, hay cosas que todavía se me escapan de la programación de los pics, estoy programando en C18 y en un PIC18F2455

resulta que estoy trabajando en un proyecto que quiero desplegar en un display 16x2 unos arrays largos, ejemplo.

char Array1[] = "Estoy probando una visualización de un array en un display muy laaaaaarrrrrgo";

y como este tengo varios, llega un momento que el compilador me dice que no hay más memoria y la verdad no sé como gestionar este tipo de datos ni en que lugar, he leído varias cosas sobre la rom, la ram y la eeprom pero me confunde un poco.

no se si será mejor poner todos estos arrays en la eeprom de pic, crear un array en blanco lo suficiente largo e ir cargando las cadenas según me hagan falta o utilizar una eeprom externa (por cierto, ¿que tipo de datos se pueden guardar en una eeprom?), y hacer este tipo de cosas o que..... pido perdón por mi falta de conocimientos sobre el tema. :oops:
« Última modificación: 20 de Septiembre de 2014, 08:31:16 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Donde guardar arrays largos?
« Respuesta #1 en: 11 de Septiembre de 2014, 14:42:32 »

Si son textos que nunca cambia debes colocarle el modificador const. En C18 creo que también además podías asignarle rom, ya ni me acuerdo  :mrgreen:

Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Donde guardar arrays largos?
« Respuesta #2 en: 11 de Septiembre de 2014, 14:48:31 »

Si son textos que nunca cambia debes colocarle el modificador const. En C18 creo que también además podías asignarle rom, ya ni me acuerdo  :mrgreen:

Saludos

Ese es el problema que tengo, que no me queda claro eso del rom ni qn que memoria se guarda ni las sentencias a poner ni nada de nada, no encuentro documentos que me lo expliquen pero para tontos  :)
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Donde guardar arrays largos?
« Respuesta #3 en: 11 de Septiembre de 2014, 15:10:16 »
Tienes una opción por ahí que se llama "large stack" o algo así que te deja poner hasta 256bytes en vez de 128bytes dentro de las funciones. Si no lo que dice Suky: pon constantes (bytes que te guarda en flash). Creo que era algo así:

static const rom unsigned char [] = "blablabla".

Y lo declaras global (fuera del main()).

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Donde guardar arrays largos?
« Respuesta #4 en: 11 de Septiembre de 2014, 15:37:22 »
Vale, de esa manera ya me deja y no da el error de espacio pero ahora no sale nada por el lcd, resulta que tengo unas funciones que utilizan punteros hacia esos arrays, ¿hay alguna manera de hacer punteros a esos arrays globales?

por ejemplo:

declaro el array global

static const rom unsigned char Array[] = "bla bla ......";

el main.....
main(){
   
       mi_funcion(Array);
}

donde esa función en una librería la hago a si:


       void mi_funcion(static const rom unsigned char *String){

   }
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Donde guardar arrays largos?
« Respuesta #5 en: 11 de Septiembre de 2014, 15:42:31 »
No puedes poner punteros a ROM porque necesitas funciones especiales para extraer los datos de la flash (para grabar las constantes no hay problema porque lo genera el compilador solo y lo guarda en el archivo .hex).

Tienes que crearte una variable RAM y copiar los contenidos desde rom. Creo que la función era memcpypgm2ram: busca mejor en el manual de C18.

Un saludo!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Donde guardar arrays largos?
« Respuesta #6 en: 11 de Septiembre de 2014, 15:44:42 »
Por cierto. Esta forma de guardar datos es muuuuy lenta para lectura: deberías utilizarla como último recurso. Yo me empollaría como modificar el archivo del linkador, crear secciones y declarar variables globales grandes en ram.

Un saludo!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: ¿Donde guardar arrays largos?
« Respuesta #7 en: 11 de Septiembre de 2014, 18:23:38 »
  Recuerdo que en HiTech C sí se podía utilizar punteros a ROM y creo recordar haberlos utilizado también en XC8.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ¿Donde guardar arrays largos?
« Respuesta #8 en: 11 de Septiembre de 2014, 18:35:24 »
Hola a todos, hay cosas que todavía se me escapan de la programación de los pics, estoy programando en C18 y en un PIC18F2455

resulta que estoy trabajando en un proyecto que quiero desplegar en un display 16x2 unos arrays largos, ejemplo.

char Array1[] = "Estoy probando una visualización de un array en un display muy laaaaaarrrrrgo";

y como este tengo varios, llega un momento que el compilador me dice que no hay más memoria y la verdad no sé como gestionar este tipo de datos ni en que lugar, he leído varias cosas sobre la rom, la ram y la eeprom pero me confunde un poco.

no se si será mejor poner todos estos arrays en la eeprom de pic, crear un array en blanco lo suficiente largo e ir cargando las cadenas según me hagan falta o utilizar una eeprom externa (por cierto, ¿que tipo de datos se pueden guardar en una eeprom?), y hacer este tipo de cosas o que..... pido perdón por mi falta de conocimientos sobre el tema. :oops:


Hola
Me parece que tendrias que guardar el mensaje en la EEPROM y luego ir leyendo de a tramos he ir guardandolos en memoria RAM en una lista. La EEPROM del PIC te permite tener 256 datos, si estos no son suficientes tendrias que utilizar una EEPROM externa.
Esta forma te da mas flexibilidad porque no tenes que volver a compilar el programa por cada nuevo mensaje que quieras implementar. Tambien te da la posiblidad de tener varios mensajes guardados y seleccionar el que mas te convenga o necesites. Por ejemplo, podrias tener un mensaje cuando arranca el programa del PIC como bienvenida o referente al producto (version de firmware, modelo, etc) o fabricante y luego si mostrar el mensaje que tiene que ser visto.

Saludos.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Donde guardar arrays largos?
« Respuesta #9 en: 11 de Septiembre de 2014, 18:48:26 »
Hola a todos, hay cosas que todavía se me escapan de la programación de los pics, estoy programando en C18 y en un PIC18F2455

resulta que estoy trabajando en un proyecto que quiero desplegar en un display 16x2 unos arrays largos, ejemplo.

char Array1[] = "Estoy probando una visualización de un array en un display muy laaaaaarrrrrgo";

y como este tengo varios, llega un momento que el compilador me dice que no hay más memoria y la verdad no sé como gestionar este tipo de datos ni en que lugar, he leído varias cosas sobre la rom, la ram y la eeprom pero me confunde un poco.

no se si será mejor poner todos estos arrays en la eeprom de pic, crear un array en blanco lo suficiente largo e ir cargando las cadenas según me hagan falta o utilizar una eeprom externa (por cierto, ¿que tipo de datos se pueden guardar en una eeprom?), y hacer este tipo de cosas o que..... pido perdón por mi falta de conocimientos sobre el tema. :oops:


Hola
Me parece que tendrias que guardar el mensaje en la EEPROM y luego ir leyendo de a tramos he ir guardandolos en memoria RAM en una lista. La EEPROM del PIC te permite tener 256 datos, si estos no son suficientes tendrias que utilizar una EEPROM externa.
Esta forma te da mas flexibilidad porque no tenes que volver a compilar el programa por cada nuevo mensaje que quieras implementar. Tambien te da la posiblidad de tener varios mensajes guardados y seleccionar el que mas te convenga o necesites. Por ejemplo, podrias tener un mensaje cuando arranca el programa del PIC como bienvenida o referente al producto (version de firmware, modelo, etc) o fabricante y luego si mostrar el mensaje que tiene que ser visto.

Saludos.

¿como seria?, ¿te creas un array como un almacén o buffer de tamaño suficiente en la ram del pic y luego cargar el mensaje que deseas desde la eeprom cargando ese array creado en la ram y luego trabajar con el o cómo?

otra cosa, si quisiera utilizar una eeprom externa ¿cómo sería la manera de grabar al eeprom?, ¿crearía un archivo rom con toda esa información y luego grabar la eeprom con un willem? Y ¿cómo crearía esa rom? o ¿ grabar la eeprom desde el pic?.

 tengo dudas en esto porque nunca lo he hecho, si he grabado la eeprom interna pero desde el programa del pic y con un teclado pero no más allá, a ver si me orientan porque lo otro que me dicen los compañeros no tengo ni idea y no sé ni por donde empezar, de todas maneras toda la información que me faciliten bienvenida será
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ¿Donde guardar arrays largos?
« Respuesta #10 en: 11 de Septiembre de 2014, 19:18:27 »
¿como seria?, ¿te creas un array como un almacén o buffer de tamaño suficiente en la ram del pic y luego cargar el mensaje que deseas desde la eeprom cargando ese array creado en la ram y luego trabajar con el o cómo?
Podrias armar un vector de 16 posicione y si tenes 256 datos haces 16 lecturas de 16 valores (16x16=256), por lo tanto estas utilizando menos memoria RAM. Sobre todo porque vos queres mostrar datos y eso es un proceso lento (muy lento) en comparacion a los tiempos que maneja el microcontrolador.

Citar
otra cosa, si quisiera utilizar una eeprom externa ¿cómo sería la manera de grabar al eeprom?, ¿crearía un archivo rom con toda esa información y luego grabar la eeprom con un willem? Y ¿cómo crearía esa rom? o ¿ grabar la eeprom desde el pic?.
Podrias utilizar un programador externo o implementar una funcion en el mismo hardware que por medio de, por ejemplo, un teclado, interfase serie RS232 o USB te permita ingresar el mensaje y almacenarlo en la memoria.

Citar
tengo dudas en esto porque nunca lo he hecho, si he grabado la eeprom interna pero desde el programa del pic y con un teclado pero no más allá, a ver si me orientan porque lo otro que me dicen los compañeros no tengo ni idea y no sé ni por donde empezar, de todas maneras toda la información que me faciliten bienvenida será
Bueno, ya te respondi algo .... Google y a buscar informacion....

Saludos.


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Donde guardar arrays largos?
« Respuesta #11 en: 11 de Septiembre de 2014, 20:47:10 »
Para trabajar con array en rom también tienes que crear punteros a rom... Adjunto librería que utilizaba en su momento, fíjate que hay una función especial que recibe un puntero a rom... Y yo diría que este caso no seria importante el tiempo de acceso a este tipo de variables..


Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado donvalles

  • PIC10
  • *
  • Mensajes: 35
Re: ¿Donde guardar arrays largos?
« Respuesta #12 en: 12 de Septiembre de 2014, 00:21:03 »
Hola ya te respondierón los moderadores que son los que se ganan todas las cervezas apostadas.  Pero te voy a explicar lo que tengo entendido y no se si es la respuesta a la que buscas y espero no estar errado conceptualmente pero esto es así:

char vector[1000];   Este variable char de 8 bit es almacenada o creada en la memoria RAM, la hoja de datos de los pic en su diagrama en bloque lo llama DATA MEMORY
                              (cuando creas la variable el compilador ocupa memoria RAM y memoria ROM)

const char vector [1000], es creado en la memoria de programa del pic que es la ROM
                                     (cuando creas const ocupa memoria de programa y nada de RAM)

ahora en mi libro de c no dice nada donde es creada o almacenada la variable con el modificador const , si es almacenada o creada en la RAM o en la ROM. Pero esto que explico arriba de  las diferencias la saque del ccs compilando y viendo la cantidad de memoria ocupada al compilar.

si ves como es utilizado la función glcd_update() en ccs que es para imprimir en display de 128x64 GLCD, usa el concepto de guardar en ROM la imagan con const y antes de imprimir pasa la imagen a un buffer en la RAM que luego con la funcion glcd_update la imprime al display, esto es porque al imprimir pixel por pixel tenes que acesar a la ROM luego pasar a la RAM  y luego imprimis demora tiempo que cargando primero toda la imagen de la ROM para la RAM y una vez en la RAM imprimis todo a mayor velocidad y en el display se imprime la imagem completa y no notas que va cargando pixel por pixel como en el caso de leer pixe por pixel de la ROM.

cuando usas const podes trabajar con punteros normalmente
const char buffer[10];
void funcion( const char *p)
main()
{
funcion(buffer);
}

« Última modificación: 12 de Septiembre de 2014, 00:44:50 por donvalles »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Donde guardar arrays largos?
« Respuesta #13 en: 13 de Septiembre de 2014, 17:28:02 »
Hola a todos, pues he intentado meter esos arrays en rom pero..... se me queda sin memoria, el tema es que me hacen falta esos arrays porque quiero hacer un menú de configuración del sistema y no quiero conectarlo vía remoto a ningún pc ni nada, quiero que sea autónomo, con lo cual voy a probar a meter esos arrays en una memoria externa pero tengo algún problema que otro a la hora de hacerlo.

Estoy utilizando una memoria 24LC256 que tenía por aquí en casa.

me ha costado hacer el driver, no sé el porque de esto ya que no es complicado pero el mplab se resistía al final ya me funciona tanto por software como por hardware, pero solo en proteus, al implementarlo por hardware no me camina.

Me pasa también una cosa curiosa, en el MPLAB IDE utilizo el protocolo I2C por software ( tengo que utilizar esto porque estoy utilizando el protocolo SPI por hradware) pues fuerzo los puertos de salida a rb4 y rb5 y no me los cambia.
cierro el mplab ide y abro el mplabx compilo el proyecto y si me cambia de pines, no entiendo la razón a ver si alguien me lo puede explicar, en el proyecto estoy utilizando las librerías incluidas en el proyecto, nada más.

Una vez me está funcionando en proteus, paso el proyecto a mi chip y en este no funciona, no sé si será una cosa de tiempos o que ¿que puedo hacer para que funcione?, ¿que puedo comprobar?.

gracias por vuestra ayuda de ante mano me están ayudando mucho  :-/ :)

Por cierto tengo resistencias pull-up de 10k en las líneas i2c
« Última modificación: 13 de Septiembre de 2014, 17:40:05 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Donde guardar arrays largos?
« Respuesta #14 en: 20 de Septiembre de 2014, 08:30:53 »
Hola a todos, pues he implementado una memoria eeprom externa y he creado un array de tamaño suficiendo donde almaceno el array a desplegar en el lcd y una vez salgo de esa opción el array se borra y lo cargo de nuevo con otro array desde la memoria y al parecer va todo bien, seguiré continuando con el proyecto, vamos a ver con que escollo me topo de nuevo  :5]

en otro post que pregunto algo relacionado con el tema he colgado un manual para el estudio del protocolo con la memoria, si a alguien le interesa el hilo es este:

Ayuda con tiempos en las librerías por software
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...