ATMega328 + Si7021 + I2C (Assembler)

OP #4804055
Lesenswert?

Hallo Leute,

seit Stunden versuche ich I2C am ATMega328 mit dem Si7021 zum Laufen zu 
bringen. Es will einfach nicht richtig klappen.

Der Si7021 hat 2 Modi, in einem wird während der Messung SCL auf Low 
gehalten und dann kann erst der Wert gelesen werden. Ich bekomme ihn 
aber immer nur mit NACK. Vielleicht ist das normal? Im anderen Modus, 
muss ich die Adresse zum Lesen der Werte immer wieder schicken, bis ein 
ACK diese bestätigt. Dann kann ich den Wert lesen, erhalte aber wieder 
nur ein NACK am Ende des ersten Bytes und das zweite fehlt ja noch. 
Warum kann ich mir nicht so richtig erklären. Leider ist nur 
Beispielcode zum Senden, aber nicht zum Lesen angegeben.

Ich habe auch versucht, einfach ein paar ms zu warten, bis die Messung 
fertig ist und jetzt kommt das Verrückte: Ich warte unendlich, da der 
Timer 0-Interrupt nicht aufgerufen wird und somit die delay-Routine 
nicht funktioniert. Mein Code stammt aus einem ähnlichen Messprojekt von 
mir mit ATMega88. Dort lagen die I2C-Routinen brach, weil ich letztlich 
den DHT22 genommen habe. Jetzt wollte ich nochmal ran und habe auf 
Steckbrett ein Arduino Pro Mini gesteckt, weil dies am einfachsten war. 
Prinzipiell sollte der ATMega88-Code hier ja auch laufen. Im DB stehen 
beide drin. Hab' die unbenutzten Routinen des alten Projekts 
deaktiviert. Ich versteh' nicht, warum der Timer nicht geht. Aber 
unabhängig davon verstehe ich nicht, warum es mit dem I2C nicht richtig 
läuft, was da Faul ist.

Ich habe I2C auch mit dem Logic Analyzer verfolgt. Sieht ok aus. Kommt 
halt nur das NACK am Ende des ersten Datenbytes.

Ich habe den kompletten Code mit angehängt, obwohl da viel (momentan 
noch) unnötiges aus dem anderen Projekt mit drinsteht.

Jemand eine Idee?
Angehängte Dateien:
OP #4804093
Lesenswert?

Ok, Danke. Dummer Fehler. Hab's gleich geändert und mir auch eine Notiz 
gemacht, falls ich später doch wieder einen Mega88 einsetze, der 
ausreichen würde. Immerhin hat das noch andere Merkwürdigkeiten 
beseitigt. Die Probleme mit dem I2C leider nicht. Empfangene Bytes 
werden immer mit NAK bestätigt.

Solder
OP #4804140
Lesenswert?

Ich habe es jetzt mit der ID probiert. Das sind mehrere Bytes und nach 
jedem soll ein ACK kommen und erst nach dem letzten ein NAK. Leider ist 
es wie zuvor. Gleich nach dem ersten Byte kommt ein NAK. Das wird ja vom 
Mega erzeugt. Kann ich das einstellen, ob NAK oder ACK? Hier fehlt 
möglicherweise noch was. - Ok, ich denke ich habs: Zum Lesen muss ich 
auch TWEA berücksichtigen und passend setzen. Ich werde das gleich mal 
einbauen.

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