Autor Tema: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿  (Leído 3065 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
hola gente, bueno resulta que estoy en un proyecto en el cual nesesito guardar 9 variables en mi eeprom del pic (int1 a=0,b=0,c=0,d=0,e=0,f=0,g=0,k=0,m=0,n=0;), bueno esto es lo ideal, pero no me logra resultar esto. las variables que voy a guardar solo toman valores 0 o 1.
ya que quiero que se mantengan entos datos cuando se corte la electricidad al pic, y cuando se buelva a enceder, los datos guardados aparescan, dejando el programa como estaba antes de apagarce.

lo que he echo es esto:

para lee eeprom del pic:
Código: [Seleccionar]
a=read_EEPROM(rec_eprom);
rec_eprom++;
b=read_EEPROM(rec_eprom);
rec_eprom++;
c=read_EEPROM(rec_eprom);
rec_eprom++;
d=read_EEPROM(rec_eprom);
rec_eprom++;
e=read_EEPROM(rec_eprom);
rec_eprom++;
f=read_EEPROM(rec_eprom);
rec_eprom++;
g=read_EEPROM(rec_eprom);
rec_eprom++;
k=read_EEPROM(rec_eprom);
rec_eprom++;
m=read_EEPROM(rec_eprom);
rec_eprom++;
n=read_EEPROM(rec_eprom);

 y para guardar las variables:

Código: [Seleccionar]
write_eeprom(recorrido_eeprom,a);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,b);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,c);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,d);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,e);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,f);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,g);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,k);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,m);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,n);

pero el compilador me da error al poner esto, pero si pongo menos por ejemplo, unos 4 datos a guardar nada mas, me va bien.
por otro lado las datos que quiero guardar lo quiero dejar dentro de una funcion, por ejemplo asi:

Código: [Seleccionar]
void guardar_datos_eeprom(void){

write_eeprom(recorrido_eeprom,a);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,b);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,c);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,d);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,e);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,f);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,g);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,k);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,m);
recorrido_eeprom++;
write_eeprom(recorrido_eeprom,n);

//a=0,b=0,c=0,d=0,e=0,f=0,g=0,k=0,m=0,n=0;

}
se puede esto ??

y bueno para lee estos datos lo voy a hacer al principio de mi programa.

ahora, son muchos datos que tengo que guardar en la eeprom interna del pic,??? tendre que usar una eeprom externa ???

saludos y espero que me puedan ayudar en esto

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿
« Respuesta #1 en: 14 de Junio de 2010, 21:30:52 »
Hola, con 2 bytes podrías almacenar los 9 bits, pero lo dejamos como tú lo tienes.  :mrgreen:

Péganos el error que te da y en qué línea lo arroja.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿
« Respuesta #2 en: 15 de Junio de 2010, 13:15:25 »
hola  Memoria rom insuficiente - Out of ROM, A segment or the program is too large, algo así. pero no estoy seguro si es esto.
por eso cuando llege a mi casa dejo colgado la imagen de lo que dice.

por otra parte, como es la manera que tu dices ?¿?¿?¿ me ahorro lineas ???? me podrias enseñar ??? por favor.

saludos!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿
« Respuesta #3 en: 15 de Junio de 2010, 13:57:32 »
Ah pues es usando máscaras.

Código: [Seleccionar]
#define bit0 0x0001
#define bit1 0x0002
...
#define bit5 0x0020
...
#define bit7 0x0080
#define bit8 0x0100

//Del bit 0 al 8 guardará 9 bits dentro del int16
int16 bits;

//Ejemplo para poner a 1 el bit 5
bits = bits | bit5;
guarda_eeprom(bits);

//Ejemplo para poner a 0 el bit 8
bits = bits & ~bit8;
guarda_eeprom(bits);

//Ejemplo para leer los 9 bits desde la eeprom
bits=lee_eeprom();

...

void guarda_eeprom(int16 b)
{
write_eeprom(0x00, b>>8); //MSB
write_eeprom(0x01, b); //LSB
}

int16 lee_eeprom()
{
int16 b;

b=(int16)read_eeprom(0x00)<<8; //MSB
b|=read_eeprom(0x01); //LSB

return b;
}

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿
« Respuesta #4 en: 19 de Junio de 2010, 21:08:39 »
hola perdon por la tardanza del mensaje pero estaba vastante atariado en el trabajo.
pero bueno. el error que me sale es por que estoy llamando a una funcion la cual es para grabar la eeprom interna del pic, las cuales las describí  mas arriba.

asi llamo a la funcion para grabar la eeprom interna del pic:

Código: [Seleccionar]
          case 2:
                  lcd_gotoxy(1,3);
                  lcd_putc("~ Guardar programa  ");
                  if(!input(PIN_D1)){
                  do{                           //SI -> eliminar...            
                  }while(!input(PIN_D1));            //...rebotes del boton
                  recorrido_eeprom=0;
                  escribir _eeprom();
                  }
                  if(!input(PIN_D5)){p=5;}
                  break;

el cual este switch lo tengo en otra funcion, que me sirve para trabajar con el menú de mi programa.

bueno y el erro me sale solamente cuando pongo la linea que sirve para llamar a la funcion de escritura del pic (escrivir_eeprom();)

el error:

« Última modificación: 19 de Junio de 2010, 21:11:08 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: guardar 9 variables tipo int1 en la eeprom interna del pic se puede?¿?¿?¿
« Respuesta #5 en: 19 de Junio de 2010, 21:37:12 »
hola acavo de encontrar la solucion, a mi problema, el cual era poner la llamada de mi funcion escribir_eeprom, en mi main. eso era todo.
saludos!