Forum: Mikrocontroller und Digitale Elektronik EEPROM Chip mal wieder am rum spinnen: i2c_stop wird nicht ausgeführt


von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

Guten Abend,
Ich habe mal wieder ein Problem mit meinen EEPROM Chips. Nachdem ich das 
Problem mit denn Schreiben/Lesen vom Chip mit euch in diesen Thread 
behoben habe: Beitrag "EEPROM Chip will nicht so wie ich" .
Nun bastele ich mir mit dem ATMega328P(@16 Mhz) ein 20x4 LCD und dem 
LM35 Temperatur Sensor eine kleine Wetterstation. Beim Starten frage ich 
vom EEPROM die Adresse 11 ab. Auf dieser steht entweder 0xFF(Wenn nicht 
gesetzt), oder 0x01(Wenn bereits gesetzt). Dann werden auch auf die 
Adressen 12 und 13 0x04 geschrieben. Wenn 0xFF zurück kommt. Diese Werte 
nutze ich für die Delay Phasen zwischen denn einzeln Messvorgängen. Wenn 
0x01 zurück kommt dann, fülle ich zwei Variablen mit dem Wert von der 
Adresse 12 und ein mit der Adresse 13. Nur mein Controllor bleibt mal 
wieder beim lesen von der Adresse 11 hängen. Denn das LCD wird nicht 
gesetzt und das kommt nach dem lesen vom EEPROM Und ich kann kein Fehler 
dafür finden. Der Code fürs schreiben und lesen ist Identisch mit dem 
vom anderen Thread und habe ich auch angehängte.

Aso es ist mittlerweile ein neuer EEPROM Chip. Um ein Hardware Defekt 
auszuschließen.

Könnt ihr mir da noch mal bitte helfen :)

//EDIT!: Der bleibt nicht beim i2c_read() in der s_eeprom.c Klasse 
hängen sondern beim i2c_stop

Der Code wo er hängen bleibt:
1
void eeprom_check(void) {
2
  uint8_t localVar0 = readEEPROM(11); //Adresse 11 auslesen
3
  if(localVar0 == 0xFF) { //Abfragen ob noch nicht gesetzt wurde
4
    lcd_clear(); //Display setzten
5
    lcd_printlc(1, 1, "EEPROM Inited!");
6
    lcd_printlc(2, 1, "No Byte Read");
7
    lcd_printlc(3, 1, "Writing");
8
    writeEEPROM(11, 0x01);//Adresse 11 setzten
9
    _delay_ms(500);
10
    writeEEPROM(12, 0x04); //Delay Time Time 
11
    _delay_ms(500);
12
    writeEEPROM(13, 0x04); //Delay Measurement Time
13
    _delay_ms(2500);
14
  }else if(localVar0 == 0x01) { //Abfragen ob gesetzt wurde
15
    lcd_clear(); //Display setzten
16
    lcd_printlc(1, 1, "EEPROM Inited!");
17
    lcd_printlc(2, 1, "Reading complete");
18
    basicTempTime = readEEPROM(12); //lesen und setzten
19
    _delay_ms(500);
20
    basicMeasurementTime = readEEPROM(13); //Lesen und setzten
21
    _delay_ms(2000);
22
  }
23
}

: Bearbeitet durch User
von Felix N. (felix_n888)


Lesenswert?

Problem gelöst.
Anstatt denn Ack zu lesen habe ich denn Nak gelesen. Und laut Datenblatt 
kommt nach ein Nak immer eine stop Condiction. Und nun funktioniert es 
wieder.

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.