Autor Tema: consejo para definir una constante con valor de eeprom  (Leído 2498 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
consejo para definir una constante con valor de eeprom
« en: 18 de Agosto de 2019, 23:22:01 »
hola a todos,
estos días ando programando en c con ccs y estoy jugando con una memoria eeprom. la interacción con la memoria va de lo mas bien, pero ahora quede con una inquietud, y quería pedir su consejo.
al iniciar el programa tengo que leer la eeprom y asignar algunos valores a unas variables, estas variables están en distintas partes del código, pero solo requiero que tomen el valor de la eeprom al inicio del programa y nada más ya que son valores que no cambiaran... mi problema es que no quiero llenarme de variables globales, ni desparramar la lectura de la eeprom por doto el código. lo otro también que no quiero es estar leyendo todo el tiempo la eeprom, sino solo cuando se inicie el programa.... no se si me explico bien.... pero en resumen quiero que los valores almacenados en la eeprom asignarlos varias variables esto solo al inicio de la ejecución del programa de una forma ordenada y limpia, sin llenarme de variables globales por montones....

espero que me entiendan  :oops:

Saludos
« Última modificación: 18 de Agosto de 2019, 23:40:23 por japifer_22 »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:consejo para definir una constante con valor de eeprom
« Respuesta #1 en: 19 de Agosto de 2019, 03:34:14 »
Tal y como lo describes lo que se me ocurre es que te hagas un array y luego desde el main llenes el array con lo que hay en la eeprom mediante una interacción for. 

Algo parecido a esto:

Código: C
  1. for(i=0;i<256;i++) array[i] = read_eeprom(i);

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consejo para definir una constante con valor de eeprom
« Respuesta #2 en: 19 de Agosto de 2019, 07:52:03 »
Hagas como lo hagas vas a ocupar el espacio global.

Una de las formas es como dice remi04, usando un array. Si esto te queda confuso, ya que luego no vas a saber que es cada cosa. Podes usar un struct con los distintos nombres de las variables. Pero significa copiarlo uno a uno, debido que la disposicion de memoria es de implementacion especifica a cada compilador. Y mejor tener algo general que exclusivo para XC8.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re:consejo para definir una constante con valor de eeprom
« Respuesta #3 en: 19 de Agosto de 2019, 15:45:41 »
Mis variables están  en distintas funciones por lo que hacer el for en el main no me serviría y el caso de un array como dices killerjc quedaría confuso, lo que si podria ser es una struct, pero además de esto intento ahorrar lo máximo de memoria a si que no se si me serviría la estruct.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 561
Re:consejo para definir una constante con valor de eeprom
« Respuesta #4 en: 19 de Agosto de 2019, 16:43:50 »
Cuántos valores tienes que levantar de la EEPROM?

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re:consejo para definir una constante con valor de eeprom
« Respuesta #5 en: 19 de Agosto de 2019, 16:51:27 »
son 8 valores de 20 byte cada uno

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consejo para definir una constante con valor de eeprom
« Respuesta #6 en: 19 de Agosto de 2019, 17:00:02 »
Mis variables están  en distintas funciones por lo que hacer el for en el main no me serviría y el caso de un array como dices killerjc quedaría confuso, lo que si podria ser es una struct, pero además de esto intento ahorrar lo máximo de memoria a si que no se si me serviría la estruct.

Leer la EEPROM no significa ningun "gasto" de la misma, por lo tanto la podes leer millones de veces. Grabarla es el problema.
Un struct significaria dejarlo en el espacio global..

Si lo vas a usar un ratito y luego no usarlo mas, entonces lee la eeprom, create una funcion de lectura de eeprom (que sea especifica al micro) y que te devuelva el valor leido. Asi la "lectura" se hace en un solo lugar. Vas a ahorrar espacio de RAM, a costa de tal ves unos 6 ciclos de instruccion mas por cada lectura de la EEPROM (saltos,cargas de registros,etc).
Ya que de hacerlo asi, la varaible quedaria creada en el stack (si lo creas al momento de entrar en una funcion).

Ahora si tu funcion es algo que va a entrar muy muchas veces, y te conviene pasarlo al plano global. Ahorrarías tiempo de ejecución y gastarías un poco mas de RAM. Todo depende de lo que quieras lograr. (Velocidad, espacio, etc). Pero si no te molesta esos pocos ciclos entonces no le veo el problema.

Ademas el PIC18F2550 tiene 2048 bytes de RAM. 160 que serian tus datos son el 7,8% de RAM usada para eso.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:consejo para definir una constante con valor de eeprom
« Respuesta #7 en: 19 de Agosto de 2019, 18:06:24 »
Mis variables están  en distintas funciones por lo que hacer el for en el main no me serviría y el caso de un array como dices killerjc quedaría confuso, lo que si podria ser es una struct, pero además de esto intento ahorrar lo máximo de memoria a si que no se si me serviría la estruct.

A ver, el array lo declaras fuera del main, sería accesible globalmente. La iteracción for la pones al principio del main para que cuando arranque el programa tengas cargados todos los datos en el array y entonces accedes luego a ellos desde donde sea.  Lo que está en el main es la iteracción , pero el array lo declaras después de los fuses y los macros.

  Si tienes luego claro la estructura de los datos, que son cada uno y en qué posición se encuentran es tan sencillo como tener delante la “chuleta” impresa.

   La otra opción es hacerlo como dice killer, leer a tiempo real la eeprom o cada vez que lo necesites, pero claro, los procesos de lectura directa pueden ser 3 veces más lentos por lo que si tienes que leer muchas veces tendrás que tenerlo en cuenta.

 A la eeprom no le va a pasar nada por leerla millones de veces pero todo se ralentiza bastante.


Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re:consejo para definir una constante con valor de eeprom
« Respuesta #8 en: 19 de Agosto de 2019, 22:20:18 »
lo que busco con todo esto es poder ahorrar espacio, estuve viendo y la estructura no es opción ya que ocupa mucha ram, tal como dices

KILLERJC
Citar
Ademas el PIC18F2550 tiene 2048 bytes de RAM. 160 que serian tus datos son el 7,8% de RAM usada para eso.
.
 mi problema va que tengo ya usado el 39% y ni siquiera llevo la mitad del código que pretendo implementar. en cuando a la lectura de la eeprom no se si es factible ya que tengo que leer esas variables cada 1.32 segundos esto es durante 3 años (vida útil que pretendo que sea de mi invento  :mrgreen: ) por esto mismo es que ahora voy a ver como me va con lo que dice
remi04
Citar
al y como lo describes lo que se me ocurre es que te hagas un array

pero como digo estoy intentando de ocupar la menor cantidad de memoria en esto...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consejo para definir una constante con valor de eeprom
« Respuesta #9 en: 19 de Agosto de 2019, 22:50:36 »
Pero sobre el espacio te ocupas despues japifer, por ahora dale.... y si luego necesitas espacio tenes 2 opciones. Te preocupas optimizando el codigo, o conseguis otro microcontrolador, estoy mas que seguro que hoy en dia hay microcontroladores con mas prestaciones y mas baratos que el PIC18F2550, debido a que es bastante viejito.

Y el tema de ocupar RAM va a depender de que uses. Si usas USB entonces parte de la RAM es para los descriptores, por lo tanto ya partis que no tenes un buen pedazo de la misma. ( No se si el MPLAB los reserva o no), Y luego depende de si creas variables en el stack o no... Dependiendo de eso vas a ocupar mas o menos RAM.