hallo zusammen,
ich habe einen eeprom, 24lc64
auf den ich einen int schreiben möchte.
hierzu zerleg ich den int in zwei einzelne bytes und speichere diese ab.
zum auslesen lese ich die zuvor abgelegten zwei byte's aus und setze sie wieder zu einem int zusammen.
leider gibt es ein problem beim schreiben: es wird immer nur das erste byte auf den eeprom geschrieben, das zweite nicht.
jetzt meine frage: ist die software richtig?
funktionen:
anschluss:
a0, a1, a2, vss, wp ---> gnd
vcc ---> 5v
scl ---> a5
sda ---> a4
ich verwende ein arduino uno.
hoffentlich könnt ihr mir helfen,
gruß steffen
ich habe einen eeprom, 24lc64
auf den ich einen int schreiben möchte.
hierzu zerleg ich den int in zwei einzelne bytes und speichere diese ab.
zum auslesen lese ich die zuvor abgelegten zwei byte's aus und setze sie wieder zu einem int zusammen.
leider gibt es ein problem beim schreiben: es wird immer nur das erste byte auf den eeprom geschrieben, das zweite nicht.
jetzt meine frage: ist die software richtig?
code: [select]
#include <wire.h>
#define eeprom_address 0x50
void setup()
{
wire.begin(); // initialise connection
serial.begin(9600);
eeprom_inttobyte(409, 1);
delay(20);
}
void loop()
{
serial.println(eeprom_2bytetoint(1));
delay(10000);
}
funktionen:
code: [select]
void eeprom_writebyte(unsigned int eeaddress, byte data) {
wire.begintransmission(eeprom_address);
wire.write((int)(eeaddress >> 8)); //msb
wire.write((int)(eeaddress & 0xff)); //lsb
wire.write(data);
wire.endtransmission();
}
byte eeprom_readbyte(unsigned int eeaddress) {
byte rdata = 0xff;
wire.begintransmission(eeprom_address);
wire.write((int)(eeaddress >> 8)); //msb
wire.write((int)(eeaddress & 0xff)); //lsb
wire.endtransmission();
wire.requestfrom(eeprom_address, 1);
if (wire.available()) rdata = wire.read();
return rdata;
}
void eeprom_inttobyte(unsigned int integer, unsigned int startadr) {
// convert unsigned int 2-byte
// integer = int save 2 byte
// startadr = address of first byte
// int ---> 1111 1111 1111 1111 ---> (1111 1111)byte1, (1111 1111)byte2
byte a;
byte b;
= (int)((integer >> 8) & 0xff);
b = (int)(integer & 0xff);
eeprom_writebyte(startadr, a);
serial.print("a = ");
serial.println(a);
startadr += 1;
eeprom_writebyte(startadr, b);
serial.print("b = ");
serial.println(b);
}
int eeprom_2bytetoint(unsigned int startad) {
// convert 2-byte unsigned int
int anotherint;
byte c;
byte d;
c = eeprom_readbyte(startad);
serial.print("c = ");
serial.println(c);
startad += 1;
d = eeprom_readbyte(startad);
serial.print("d = ");
serial.println(d);
anotherint = int(( (c << 8) + (d) ));
return anotherint;
}
anschluss:
a0, a1, a2, vss, wp ---> gnd
vcc ---> 5v
scl ---> a5
sda ---> a4
ich verwende ein arduino uno.
hoffentlich könnt ihr mir helfen,
gruß steffen
dafür gibt es auch fertige makros:
http://arduino.cc/en/reference/wordcast
http://arduino.cc/en/reference/lowbyte
http://arduino.cc/en/reference/highbyte
ist vielleicht sicherer als das selbst zu erledigen und dabei fehler mit den datentypen zu machen
der cast auf int bei der adresse ist überflüssig. außerdem sollte auch multi-byte zugriff möglich sein. man kann mehr als 1 byte hintereinander lesen und schreiben. jedes byte einzelne zu behandeln geht aber natürlich auch.
http://arduino.cc/en/reference/wordcast
http://arduino.cc/en/reference/lowbyte
http://arduino.cc/en/reference/highbyte
ist vielleicht sicherer als das selbst zu erledigen und dabei fehler mit den datentypen zu machen
der cast auf int bei der adresse ist überflüssig. außerdem sollte auch multi-byte zugriff möglich sein. man kann mehr als 1 byte hintereinander lesen und schreiben. jedes byte einzelne zu behandeln geht aber natürlich auch.
Arduino Forum > International > Deutsch (Moderator: uwefed) > Nur ein Schreibvorgang auf EEPROM möglich
arduino
Comments
Post a Comment