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


von Martin (Gast)


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

von noips (Gast)


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!

von 6R-Polo (Gast)


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.

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.