Forum: Mikrocontroller und Digitale Elektronik TWI Watchd, Count, was am besten damit nicht hängt ?


von Christian (Gast)


Lesenswert?

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

von dave (Gast)


Lesenswert?

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

von thkais (Gast)


Lesenswert?

"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
Noch kein Account? Hier anmelden.