www.mikrocontroller.net

Forum: Compiler & IDEs Timeout bei I²C-Bus (TWI)


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich steuere ein Touchscreen-Display mit einem AtMega 88 über den
I²C-Bus an. Ab und zu bleibt das Programm beim Warten auf das
TWINT-Flag hängen. Hab noch nicht rausgefunden, woran das liegt. Hab
den C-Code vom Atmel-Datenblatt verwendet:

// warten auf TWINT-Flag
// => Data wurde gesendet und ACK / NACK empfangen)
     while (! (TWCR & (1<<TWINT)))
  ;  // do nothing

Ich denke ich sollte an der Stelle noch irgend einen Timeout rein
machen. Kann man dafür eine ganz normale Schleife mit einem
8-Bit-Zähler verwenden?

Martin

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein ähnliches Problem. Ich arbeite mit einem XMega128, an den 4 
I2C-Porterweiterungs-ICs PCA9555 angeschlossen sind. Diese ICs schalten 
bzw. lesen über Optokoppler 24V-Spannungspegel. Die 24V-Spannung wird 
extern eingespeist. Die Erweiterungs-ICs werden aber von der internen 
Boardspannung gespeist, an der auch der XMega hängt.

Nun passiert immer wieder, wenn die externe 24V-Spannung ausgeschaltet 
und eingeschaltet wird, dass sich der XMega aufhängt. Er bleibt an der 
Programmzeile hängen, in der abgefragt wird ob die TWI-Übertragung 
abgeschlossen wurde. Dabei bleibt der Busszustand laut BUSSTATE-Bits auf 
BUSY stehen und RXACK-Bit, das ja den zuletzt empfangenen 
acknowledge-Bit anzeigt, ist gesetzt, es wurde folglich NACK empfangen.

Nun, das TWI-Modul im XMega hat ja die TIMOUT-Bits, die, wenn gesetzt, 
den Bus wieder in den IDLE-Zustand zurückbringen, wenn er "lange" 
inaktiv bleibt. Ich habe diese Bits jetzt auch gesetzt, aber das 
Programm bleibt trotzdem hängen und wartet bis der Bus wieder frei ist.

Veilleicht hatte ja jemand von euch ein solches Problem und könnte mich 
wissen lassen, wie er das gelöst hat. Ich wäre für die Hinweise seht 
dankbar!

Autor: 6R-Polo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab´ das gleiche Problem gehabt. Ich habe mir mit einem uint8_t 
einen timeout gebaut. Etwa so:


// wail until transmission completed and ACK/NACK has been received
  while(!(TWCR & (1<<TWINT)) && ++timeout);

Die while-Schleife sollte im Fehlerfall 255 mal bearbeitet werden, und 
dann rausspringen.

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.