mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Acknowkledge geht nicht bei I2C und ATmega16


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte den RAM(TI: BQ27200) eines LiIonen Akku per I2C auslesen. Das 
Protokoll verlangt bei mehreren auszulesenden Werten ein ACK nach jedem 
gelesenen Wert. Nach dem letzten sendet man KEIN ACK sondern nur die 
STOPP-Bedingung.

Lese ich einen Wert aus, funktioniert es ohne Fehler.

Lese ich zwei Werte aus erhalte ich beim zweiten Wert einen Fehler.
void READ_RAM_LiIO(void)
{
//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);           // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAA;                     // Adresse LiIon Akku und schreiben
  TWCR = (1 << TWINT) | (1 << TWEN);                   // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
//CMD[7..0]
  TWDR = 0x00;                   // Pointer auf Adresse 0x00 setzen
  TWCR = (1 << TWINT) | (1 << TWEN);                   // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAB;                     // Adresse LiIon Akku und lesen an Adresse Pointer
  TWCR = (1 << TWINT) | (1 << TWEN);                   // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Umschalten auf Daten-Empfangen
  TWCR = (1 << TWINT) | (1 << TWEN);                   // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
     putchar(TWDR);                                         // Daten aus Register übernehmen

     TWCR = (1 << TWINT) | (1 << TWEN)| (1 << TWEA);
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Umschalten auf Daten-Empfangen
  TWCR = (1 << TWINT) | (1 << TWEN);                   // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
     putchar(TWDR);                                         // Daten aus Register übernehmen
 
 
//Stoppbedingung
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingungtodo=0;

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
KOrrigier mal BITTE die Kommentare, die stimmen ja für den Lese-teil gar 
nicht.
Und du musst das TWEA-Bit setzen BEVOR du ein Byte liest, also du musst 
vorher wissen, ob der µC weiterlesen soll. Das TWI-Modul sendet immer 
ein ganzes Byte oder eine Start/StopKond.- nie "nur" das ACK.

Ach und die putchar() könntest du mal posten, ob man mit _put_char 
tatsächlich ein Byte liest ? ;) (ok. wenn du die selber geschrieben 
hast..)

Und wenn der Code für den avr-gcc is schau mal in die twidemo.c - liegt 
auf jeden Fall bei WinAVR bei.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg,
es funktioniert.

die Funkt. putchar() gibt das gelesene Byte in den Sendepuffer des 
UARTs. Damit lasse ich mir den Inhalt des Register in meinem 
Terminalprogramm am PC anzeigen.

>Das TWI-Modul sendet immer ein ganzes Byte oder eine Start/StopKond.- >nie "nur" 
das ACK.
war mir nicht ganz klar, aber jetzt dank dir
Gruß Daniel

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> es funktioniert.
sehr schön :)
Man muss sich nur ein (paar) Mal das Datasheet durchlesen ... ;)

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.