fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Datos no volátiles
 
Avisos
Vaciar todo

Datos no volátiles

7 Respuestas
2 Usuarios
0 Reactions
3,377 Visitas
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 19 años

¡Muy buenas gentecilla!

Hace un monton que no tengo ninguna duda existencial de este tipo... me temo que las clases me quitan demasiado tiempo...

Creo que por el nombre del hilo es facil averiguar lo que nnecesito...
Programando en CCS, ¿cómo puedo guardar variables no volátiles?

Será una int8 en forma de array, que durante un proceso será Escritura/Lectura, y durante otro, más habitual, será solo de lectura...

¿Qué me sugerís?

Muuuuuuchas gracias por la ayuda.
Mif

Responder
6 respuestas
heli
Respuestas: 748
 Heli
(@heli)
Ardero
Registrado: hace 19 años

Hola Mif, para el tema de datos no volatiles está la EEPROM de los PIC.
http://foro.webdearde.com/viewtopic.php?f=1&t=759 " onclick="window.open(this.href);return false;
Si necesitas almacenar más datos de los que caben en la EEPROM interna puedes usar una EEPROM externa tipo 24Fxxx, el CCS tiene drivers para comunicarse con este tipo de memorias sin necesidad de escribir mucho código.

Para leer y salvar datos en int16 u otra longitud (cambiando el contador del bucle)
//=============================================================================
// Escribe array de variables int16 a EEPROM
void Write16Eeprom (long int n, int16 data)
{
int i;

for (i = 0; i < 2; i++)
write_eeprom(i + n, *(&data + i) ) ;
}

//=============================================================================
// Lee variables int16 de EEPROM
int Read16Eeprom (long int n)
{
int i;
int data;

for (i = 0; i < 2; i++)
*(&data + i) = read_eeprom(i + n);

return(data);
}
// se graban datos así, el número entre parentesis es la dirección en EEPROM, va de dos en dos para no pisar una variable a otra:
Write16Eeprom (0,KVprop);Write16Eeprom (2,KVint);
// // se leen datos así, el número entre parentesis es la dirección en EEPROM:
KVprop=Read16Eeprom (0);KVint=Read16Eeprom (2);

//Para un arrray de int8 hay que pasar punteros a array, sería:
//=============================================================================
// Escribe array de variables array int8 a EEPROM
void WriteArrayEeprom (long int direccion, int8 *array, int ndatos)
{
int i;

for (i = 0; i < ndatos; i++)
write_eeprom(i + direccion, *(&array + i) ) ;
}

//=============================================================================
// Lee variables array int8 de EEPROM
void ReadArrayEeprom ((long int direccion, int8 *array, int ndatos)
{
int i;

for (i = 0; i < ndatos; i++)
*(&array + i) = read_eeprom(i + direccion);
}

// se usa así:
int8 datos[10]={1,2,3,4,5,6,7,8,9,10};
WriteArrayEeprom (0, &datos[0], 10);
....
ReadArrayEeprom (0, &datos[0], 10);

Creo que es todo correcto, no lo he probado. Supongo que el CCS acepta
(datos) como (&datos[0]) como hacen otros compiladores, queda más claro...

Responder
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 19 años

¡Heli, eres un crack!

Es justo lo que andaba buscando, es que es algo relativamente raro de usar, ¿no? supongo que no es muy normal la situacion de tener que guardar informacion cuando el micro pierda la alimentacion.

Creo que tirare por las rutinas de int8, porque en realidad es para guardar 4 bits, de modo que lo que suelo hacer es guardarlos en la parte baja, y hacerle un && con un 0b00001111, asi que para no tener que andar con numeros raros me quedare con esta longitud, que es bastante cómoda.

Además creo que lo que voy a hacer es volcar el array de la volatil a la eeprom cuando esté completo ese proceso, y volcar de la eeprom a la volatil cuando lo necesite, asi no tengo que andar leyendo constantemente de la eeprom, que no es tan comodo.

Mil graciasHeli.

Responder
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 19 años

holaoytra vez, de momento sólo he coopiado las subrutinas en CCS, y no dan ningun fallo, excepto la int8 de lectura, que le sobra un parentesis...
Esta noche probare a escribir y leer, a ver que tal se da.
Mil gracias Heli.

Responder
heli
Respuestas: 748
 Heli
(@heli)
Ardero
Registrado: hace 19 años

Si es muy corriente usar EEPROM para guardar datos. Todas las impresoras llevan una 24Fxx, incluso los discos duros llevan una. Siempre hay algún dato de calibración, estado etc que interesa guadar entre encendidos. Incluso loc cartuchos de tinta de EPSON llevan una para que la impresora escriba en ellos el consumo de tinta que llevan, así se pueden intercambiar, pero al conectarlos a cualquier impresora ésta sabe cuanta tinta se ha consumido ya...
Si solo usas 4 bits usa unicamente las funciones:
write_eeprom(int8 dirección, int8 dato);
y
int8 dato = read_eeprom(int8 direccion);
que guardan y leen un byte de la EEPROM.
También puedes considerar el poner una batería de backup al PIC, poniendolo en modo bajo consumo, y no apagarlo nunca.
Recuerda que la EEPROM tiene un número de escrituras limitado (alto pero limitado, no es RAM), además es lenta de escribir...
El trozo de código que envié es para guardar las constantes del PID de Reciclator. Al arrancar las lee de EEPROM y trabaja con ellas, pero si se cambian mediante comunicaciones pueden o no grabarse en la EEPROM mediante un comando, para hacer los cambios permanentes o no, según los resultados observados.

Responder
Página 1 / 2
Compartir: