TWI Watchd, Count, was am besten damit nicht hängt ?

Gast #152321
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
Gast
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
Gast
"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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.