ATMEGA16 und 24LC512

OP #3472145
Lesenswert?

Hallo Zusammen

ich habe mal wieder ein für mich sehr unlogisches Problem:

ich betreibe zur Zeit einen Atmega16 mit 12MHz und daran ein 24LC512 um 
größere Datenmengen abzuspeichern.
Dazu habe ich zu Testzwecken zwei einfache Funktionen geschrieben:
1
char EEPROM_write_page(int add)
2
{
3
  char addr_low = add;
4
  char addr_high= add>>8;
5
  i2c_start_wait(EEPROM + I2C_WRITE);
6
  i2c_write(addr_high);
7
  i2c_write(addr_low);
8
  for(int i=0;i<(EEPROM_BUFFER_SIZE/2);i++)
9
  {
10
    char data_low = EEPROM_buf[i];
11
    char data_high= EEPROM_buf[i]>>8;
12
    i2c_write(data_low);
13
    i2c_write(data_high);  
14
  }
15
  i2c_stop();
16
  return 0;
17
}
18

19
char EEPROM_read_page(int add)
20
{
21
  char ret_l, ret_h;
22
  char add_low = add;
23
  char add_high= add>>8;
24
  i2c_start_wait(EEPROM+I2C_WRITE);
25
  i2c_write(add_high);
26
  i2c_write(add_low);
27
  i2c_rep_start(EEPROM+I2C_READ);
28
  
29
  for(char i=0; i<(EEPROM_BUFFER_SIZE/2);i++)
30
  {
31
    ret_l = i2c_readAck();
32
    ret_h = i2c_readAck();
33
    EEPROM_testpuffer[i] = (ret_h*256)+ret_l;
34

35
  }
36
  i2c_readNak();
37
  i2c_stop();
38
  return 0;
39
}

ich habe die Datenübertragung mit einem LogicCube überprüft - das 
Speichern funktioniert ohne irgend ein Problem, doch warum erhalte ich 
beim Auslesen des EEPROMs fehlerhafte Werte?

zum veranschaulichen was für werte ich schreibe sind 2 Bilder im Anhang
Daten_zum_speichern sind die daten die ich speichern möchte
erhaltene_Daten ist das, was ich zurückerhalte

hat da einer eine Lösung parat?

gerne stelle ich noch weitere Daten zur Verfügung wenn sie gewünscht 
werden.
Angehängte Dateien:
Gast #3472149
Lesenswert?

>hat da einer eine Lösung parat?

Ich würde mir mal Gedanken zu den ganzen "char" Variablen machen.
Was haben die da zu suchen?

char EEPROM_read_page(int add)

Wieso ist add ein int? In einem EEPROM kann die Adresse
nicht negativ werden. Und so weiter, und so weiter.....
OP #3472613
Lesenswert?

Ok Lösung gefunden - gestern war es eindeutig zu spät.

Der Code an sich funktioniert mit der Letzten Änderung des i2c_readNak, 
allerdings habe ich den Fehler gemacht, dass ich nicht am Pageanfang 
angefangen habe zu schreibe sondern bei addresse 200 - daher kann ich 
nur 27 int werte schreiben bis die Page bei adresse 255 fertig ist.

@ holger: mir ist klar, dass ich das ganze auch mit Pointern aufbauen 
könnte, und die Adresse casten könnte, doch dafür war es gestern 
eindeutig zu spät. Zudem habe ich noch meine Probleme mit den ganzen 
Pointern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren