I2C ATmega8 - Receive

Gast #156787
Lesenswert?
• ▲
▼
Hallo,

habe schon im Forum gesucht, aber nix passendes gefunden :/

Ich möchte meinen DS1621 (Temperatursensor) auslesen. Ich möchte dazu
den Hardware I2C verwenden. Das senden der Steuerbefehle klappt und
keine Fehler entstehen.

Nachdem ich nun die Steuersignale gesendet habe, soll der Sensor nach
Spezifikation die Daten senden (tut er auch in einer anderen Schaltung
ohne ATmega). Nur wie wird das mit dem ATmega realisiert?

Code (eigene Funktionen, avr-gcc):
  i2c_start();             // start
  i2c_sendaddress(144);    // adresse chip
  i2c_sendbyte(0xAA);      // Befehl: sende Temperatur
  i2c_repeatedstart();
  i2c_sendaddress(144 | 1);// nochmal adresse + READ ->nächstes Byte
lesen
                           // ab hier wahrscheinlich fehlerhaft
  TWCR = 1<<2 || 1<<6;     // sende ACK nach empfang von Daten
  while(!(TWCR & 128))     // warten auf empfang von Daten
      ;
  i = TWDR;                // i ist hier leider 145 (Adresse + READ)
:(
  i2c_stop();              // stop

Habe das Datenblatt gewälzt, aber bestimmt was übersehen :(

Jemand nen Tip? Vielen Dank!
Gast #156789
Lesenswert?
• ▲
▼
In der Zeile

TWCR = 1<<2 | 1<<6

fehlt noch (1<<7), das TWINT-Flag muß nach jedem Befehl durch schreiben
von "1" gelöscht werden, Datenblatt Seite 160: Beschreibung des TWCR.
In Deinem Fall wird der Lesebefehl garnicht erst ausgeführt, deshalb
befindet sich auch die 145 noch im TWDR.

Außerdem ist der Code besser lesbar, wenn man z.B.

TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);

schreibt, wenn ich mich richtig erinnere, werden durch die i2c-Lib des
GCC diese Namen definiert.
Gast #156790
Lesenswert?
• ▲
▼
ohh gott.. war echt spät, als ich das gepostet habe.. kein Wunder..

 TWCR = 1<<2 || 1<<6; <---- das ist ein logisches ODER .. Asche über
mein Haupt..

mit

TWCR = 1<<2 | 1 <<6 | 1 <<7;

geht es und ich bekomme meine 19Grad Zimmertemperatur raus.. ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.