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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.