Autor Tema: De Macro a Eeprom Interna.  (Leído 2234 veces)

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

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
De Macro a Eeprom Interna.
« en: 07 de Agosto de 2020, 14:17:01 »
En una aplicación donde tengo varios parámetros iniciales de configuración definidas mediante macros, por ejemplo:

Código: C
  1. #define MAX_FLOW 10

 Ese valor luego pasa a una posición de eeprom, y desde esa eeprom ese valor será leído y utilizado por el programa. No se usa la macro directamente como constante.  El motivo es que el usuario luego puede cambiar estos valores desde un menú de ajustes implementado en el programa.

   Podría asignar el valor a la eeprom directamente al compilar y grabar mediante la directiva #ROM int8 0xf00000 = {valor,valor,valor,etc....}

 Pero si no lo hago así, es por que algunos valores son de 16 bits, otros son de 32 y otros son float.  Por ejemplo:

Código: C
  1. #define DROP_CONCENTRATED_OFFSET 2.4

  De modo que sería un calvario tener que ir calculando los bytes de cada variable por separado para subirlos manualmente a la eeprom, más que nada por que cada placa lleva valores muy distintos.

  Para los float por ejemplo utilizo una unión:

Código: C
  1. union convert {
  2. float f;
  3. unsigned int a [4];
  4. }trans;

 Al asignar el valor de la macro float a (u.f) obtengo los 4 bytes en “a” y de ahí los paso a 4 posiciones de eeprom. Luego para leerlos, operación inversa.

  Todo esto está bien, pero me exige crear una función que corra solo la primera vez que el programa corra en la placa tras la grabación icsp la cual obtiene todos los valores de las distintas macros, descomponerlas y grabarlas en la eeprom en sus lugares designados.  Esto solo al primer arranque. Una bandera en la posición cero de la eeprom es bajada y grabada para indicar al programa que esa función nunca correrá más, salvo si el usuario selecciona una opción del menú que sería: Reestablecer a estado de fábrica. La cual graba un 1 en la posición 0 y hace reset inmediato

Visto todo esto, ¿ existe posibilidad de realizar todas esas operaciones de pasar valores constantes desde macros a la eeprom en tiempo de compilación/grabación?

 Ahorraría espacio de flash que es en realidad el problema de todo por que está al 97% y sin posibilidad de sustituir el micro por otro mayor en flash.

  Grabaría todos los datos iniciales en una “segunda página”  de la eeprom por lo que al reestablecer a fábrica solo hay que leer las posiciones donde empiezan los valores iniciales y copiarlos a las que el usuario puede modificar. Eso ahorra bastante flash.

   Un saludo.
« Última modificación: 07 de Agosto de 2020, 14:31:00 por remi04 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:De Macro a Eeprom Interna.
« Respuesta #1 en: 07 de Agosto de 2020, 19:10:31 »
¿ existe posibilidad de realizar todas esas operaciones de pasar valores constantes desde macros a la eeprom en tiempo de compilación/grabación?

Si.... grabarlos los datos de la EEPROM en ese momento. el tema es que no lo vas a tener definido en el codigo para cambiarlo "facilmente"

Ademas por lo que parece son valores constantes y por lo tanto tampoco tiene sentido ir cambiandolos... sino la otra es poder "programarlos" una primera vez y enviarle todos los datos para que los grabe.

Citar
Ahorraría espacio de flash que es en realidad el problema de todo por que está al 97% y sin posibilidad de sustituir el micro por otro mayor en flash.

Tendrias que quitar toda esa parte y fijarte si lo reduce un factor considerable.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:De Macro a Eeprom Interna.
« Respuesta #2 en: 09 de Agosto de 2020, 05:31:25 »
¿ existe posibilidad de realizar todas esas operaciones de pasar valores constantes desde macros a la eeprom en tiempo de compilación/grabación?

Si.... grabarlos los datos de la EEPROM en ese momento. el tema es que no lo vas a tener definido en el codigo para cambiarlo "facilmente"

Ademas por lo que parece son valores constantes y por lo tanto tampoco tiene sentido ir cambiandolos... sino la otra es poder "programarlos" una primera vez y enviarle todos los datos para que los grabe.

Citar
Ahorraría espacio de flash que es en realidad el problema de todo por que está al 97% y sin posibilidad de sustituir el micro por otro mayor en flash.

Tendrias que quitar toda esa parte y fijarte si lo reduce un factor considerable.

  Gracias Killer.. 

   Al final he optado por hacer un programa en c++ en Windows que te recoge todos los
datos por consola y te genera la cabecera entera con los datos para la eeprom ya calculados y en su sitio.  Básicamente lo que antes hacía el uP a partir de las macros.

  Pensaba intentarlo directamente en el código fuente haciendo todos los cálculos necesarios por macros, pero es que luego la directiva #rom int8 .......     no te coge las constantes. Compila bien, pero todos los valores que le pongas constantes de macros quedan a cero.

  Por ejemplo:   
  #define MACRO1 5
  #ROM int8 0xf00000 = {0,1,2,3,4,MACRO1,6,7,8}

  El valor de MACRO1 lo deja en cero. Así que no me vale.

  Hablo de CCS, que no lo he dicho.


 

anything