Forum: Mikrocontroller und Digitale Elektronik I2C ATmega8 - Receive


von Florian (Gast)


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!

von Rufus T. Firefly (Gast)


Lesenswert?

An die erforderlichen Pullups am I²C-Bus gedacht? Mal ein Oszilloskop
drangehängt?

von thkais (Gast)


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.

von Florian (Gast)


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

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.