www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.