Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 und 24LC512


von fuelre F. (fuelre)


Angehängte Dateien:

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.

: Bearbeitet durch User
von holger (Gast)


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.....

von fuelre F. (fuelre)


Lesenswert?

char EERPROM_read deshalb um einen Rückgabewert zu haben aber da hast du 
recht - das könnte ich durch ein void ersetzten

und das (int add) da das EEPROM 512 kbit groß ist (64k x8) - aber da 
hast du recht, sollte ein unsignet int sein

: Bearbeitet durch User
von fuelre F. (fuelre)


Lesenswert?

soeben ist mir aufgefallen, dass das i2c_readNak(); nicht ganz richig 
ist - das sollte eigentlich anstatt dem letzten i2c_readAck(); kommen, 
da ich ansonsten über der Page drüber bin.

von fuelre F. (fuelre)


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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.