Go Down

Topic: Problemas com memoria eeprom 24fc256 (Read 1 time) previous topic - next topic

riscking

Feb 20, 2013, 11:24 pm Last Edit: Feb 22, 2013, 07:40 pm by riscking Reason: 1
Hola, hace unos mese que tengo el arduino abandonado, pedi unas memorias y hoy me he decidido a montarlas, siguiendo los pasos de este hilo que no son muchos, y dado que su codigo es antiguo lo he probado en la version 0.22 pero no consigo que me vaya

http://www.diarioelectronicohoy.com/blog/eeprom-con-i%C2%B2c-bus#more-385

pongo el codigo, el caso es que me sale todo el rato ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ y probando otro codigo me ponia " wire no abailable", porque puede fallar??

ARREGLADO: Como soy un alicate, habia puesto los cables en los pines digitales y no analogicos, xDDDD


riscking

Por otro lado estoy teniendo problemas para pasar un int superior a 255 osea 1 byte, ya que en cada posicion de memoria puede guardar 1 byte como puedo guardar un numero mayor de 255???

Asi serie con una cadena de texto:
Code: [Select]

char cadena[] = "hola mundo desde una eeprom"; // cadena a escribir
   Wire.begin(); // es obligatorio inicializar la conexion
   Serial.begin(9600);
   I²C_eeprom_write_page(0x50, 0, (byte *)cadena, sizeof(cadena));

void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
      Wire.write(data[c]);
    Wire.endTransmission();
  }


Pero con un int no se como hacerlo.

SrDonGato

Buenas ¡

Hacía mucho que no participaba, cuestiones de curro.

Es una pregunta típica y vale para muchas aplicaciones, en el playground entá linkeada

http://playground.arduino.cc//Es/FAQ

http://arduino.cc/forum/index.php/topic,69929.0.html

se puede hacer con cualquier tipo de dato, despues de guardarlo en bytes separados cuando lo leas tienes que reconstruirlo.

un saludo

riscking

#3
Feb 24, 2013, 12:18 am Last Edit: Feb 24, 2013, 12:21 am by riscking Reason: 1
Muchas gracias SrDonGato, me ha costao pero el escribir lo he resuelto así, no se si será la mejor manera pero esque he probado de todo y no sabia como hacerlo, ahora me falta el leerlo todo a la vez pero poco a poco, si se puede mejorar soy todo oidos.

Code: [Select]

void i2c_eeprom_write_data(int device, unsigned int add, byte *data)
{
 byte err;
 byte cont=sizeof(data); //compruebo el tamaño de los datos por si hay que grabar en varias zonas de memoria
 for(err=0;err<cont;err++){
Wire.beginTransmission(device);
Wire.write((int)(add >> 8)); // left-part of pointer address
Wire.write((int)(add & 0xFF)); // and the right
Wire.write(data[err]); //los datos en bytes hacia donde apunta el puntero de datos
Wire.endTransmission ();
delay(10);
add++; // incremento en uno la direccion de memoriapara añadir otro dato en caso de haberlo
 }
}
void setup()
 {
   //char somedata[] = "this is data from the eeprom"; // data to write
   int somedata=26;
   Wire.begin(); // initialise the connection
   Serial.begin(9600);
    int ji=820;
  byte *pDato = (byte *) &ji;
   Serial.println("Memory written");
   i2c_eeprom_write_data(0x50, 1,pDato);
   delay(10); //add a small delay


   Serial.println("Reading data...");

d=readData(0x50,1);
Serial.println(d, HEX);
d=readData(0x50,2);
Serial.println(d, HEX);
 }

 void loop()
 {}

Sergegsx

Code: [Select]
byte *pDato = (byte *) &ji;

Hola, te importaría explicar esta linea? es que no se que hace y me gustaría entenderla por aprender algo nuevo.

gracias

riscking

Es el Puntero a byte (o a char tambien puede ser), para manejar el dato recibido, byte a byte.
por eso luego puedo hacer un for y escribir los datos uno a uno como si fuese un array.
Wire.write(data[err]);

Lo saque de un post, donde lo comento Valen, yo tampoco soy un experto en el tema pero me ha resultado valido.
http://arduino.cc/forum/index.php/topic,50658.15.html

Lo que no me queda claro es lo del byte alto y byte bajo, para escribir en la memoria, se supone que se puede mandar los dos a la vez, y yo de la forma que lo he puesto lo hago en dos pasos, pero como tienen que tener diferente direccion de memoria pues me tiene confundido para acerlo a la vez.

Go Up