Hallo, ich habe eine Interrupt basierte TWI Slave Lösung gebastelt, die auch halbwegs gut funktioniert. Nun passiert es aber von Zeit zu Zeit (Meist wenn ich den Master programmiere ohne Rücksicht auf den Slave zu nehmen) dass er mitten in der TWI Übertragung hängen bleibt.. Die Ursache ist klar, es wird ein Byte vom Master gelesen, aber das Nack kommt nicht an, weil ich genau in diesem Moment den Master grad neu programmiere, oder ein paar Kabel umstecke.. Meine Frage ist nun folgende: Wie und an welchen Stellen prüfe ich am Besten welche Bits, um genau das zu verhindern.. Im Augenblick habe ich in der Interrupt Routine des TWI einen Watchdog Reset mit 2 Sekunden, was natürlich zu Folge hat, das wenn kein TWI Signal vom Master kommt (wenn er aus ist..) das Programm alle 2 Sekunden resetet. (Nicht schön).. Wenn ich nun aber in der Hauptschleife einen Watchdog Reset einbaue, dann wird er wirkungslos, denn das Problem des TWI ist ja gerade, wenn er hängt wird eben gar kein Interrupt mehr ausgelöst, die Hauptschleife läuft aber normal weiter.. Meine Idee wäre jetzt folgende, in der Hauptschleife wenn die SCL Leitung LOW liegt keinen Watchdog Reset zu machen. Wenn dies nun länger als 2 Sekunden der Fall ist, dann kann ich davon ausgehen irgendwar ist schief gelaufen.. Sonst eine Idee, wie löst ihr denn diese blöde TWI hängt Problematik.. (Ich weiß, es gibt schon ein paar Threads dazu, aber wo man wie einen Counter noch einbauen soll, verstehe ich nicht so ganz) Christian
Ich weiß ja nicht, wie du das implementiert hast, aber ich würde einfach einen Timeout zähler mitlaufen lassen. Du tastest das Signal 10k mal ab, und wenn nix kommt, dann ist die Übertragung abgeschlossen/abgebrochen. dave
"Sonst eine Idee, wie löst ihr denn diese blöde TWI hängt Problematik.. (Ich weiß, es gibt schon ein paar Threads dazu, aber wo man wie einen Counter noch einbauen soll, verstehe ich nicht so ganz)" - Einen Timer-Interrupt generieren, in dem ein Zähler einfach hochgezählt wird. Wird ein bestimmtes Limit erreicht, dann wird der TWI resettet. Man kann das Ganze dann noch selektiv machen, daß z.B. der Timer nur dann läuft, wenn gerade ein Start-Bit empfangen wurde und abgeschaltet wird, wenn ein Stop-Bit empfangen wurde. Evtl. kann man auch noch die Repeated-Starts abdecken. - Im TWI-Interrupt wird der o.g. Zähler bei jedem Durchlauf auf 0 gesetzt.
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.