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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy