www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C ATmega8 - Receive


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.