Störungen auf AVRs?

Gast #149953
Lesenswert?
• ▲
▼
Hallo allerseits

Ich bin im Moment dabei, mir für den AVR eine 1-Wire Routine
zuschreiben. Dabei wird ein Master eingesetzt (Tiny 15) und ein Slave
(90S2313). Die Routinen stehen schon. aber beim Testen des
Reset-Befehls bin ich leider auf folgenden Effekt gestossen:

Wenn ich vom Master kontinuierlich einen Reset-Befehl schicke, so soll
der Slave dem Master antworten. Das tut er aber nur manchmal! Wenn ich
den Bus zwischen den beiden in schneller Folge (von Hand) unterbreche,
kommt es nämlich irgendwann dazu, dass der Reset nicht mehr angenommen
wird! D.h., auch wenn dann der Bus nicht mehr unterbrochen ist, wird
der Reset entweder vom Slave nicht quittiert oder vom Master nicht
erkannt!

Woran kann das liegen? Kommt da einer der beiden Controller aus dem
Takt? Ich hab die Betriebsspannung der beiden µC natürlich mit einem
Kondensator abgeblockt.

Gruß,
Steffen
Gast #149955
Lesenswert?
• ▲
▼
Hallo thkais

Wie meinst Du das denn genau? Welche Fehlertoleranz, die für den Bus
oder die für mein eigenes Programm? Die Routinen sind so geschrieben,
dass sie sich nicht aufhängen, sollte der Bus nicht reagieren - klar,
ist ja auch das Reset-Signal.

Ich vermute deshalb, Du meinst eher letzteres. Da würde natürlich der
Watchdog helfen. Aber ich verstehe nicht, wie es überhaupt zu dem
Fehler kommen kann! Wenn ich den Fehler schon auf meinem
Experimentier-Board hinbekommen kann, wie sieht das denn erst später im
Einsatz aus? Ich kann doch nicht jedes Mal mit dem Watchdog resetten, da
bekomme ich ja Datenchaos!

Gruß,
Steffen
Gast #149956
Lesenswert?
• ▲
▼
Ok, der Baustein hängt sich tatsächlich auf, und zwar der Empfänger.
Aber wie meinst Du das mit "Softwarefehler"? In meinen Routinen hab
ich keine einzige Schleife drinnen, in denen er sich aufhängen kann!
Nicht eine, die einzige die drin ist, ist im Hauptprogramm und das ist
eine Endlosschleife!

Dann ist der auftretende Fehler ein Hardwarefehler! Aber kann das sein,
kann es am Baustein selbst liegen?
#149957
Lesenswert?
• ▲
▼
Ohne das Programm zu sehen, kann natürlich keiner Deinen Fehler finden
!

Die Resetbedingung besteht ja darin, das eine bestimmte Low-Zeit
gesendet wird.

D.h. Du must einfach nur die Zeit von der letzten 1->0 Flanke bis zur
0->1 Flanke messen.

Eine Delayschleife verbietet sich daher.

Du must ja bei jeder 1->0 Flanke von vorn beginnen.


Peter
Gast #149958
Lesenswert?
• ▲
▼
Wenn es ein Hardwarefehler sein sollte, müßte der Controller sich
komplett aufhängen. Am einfachsten ist es in diesem Fall, innerhalb der
Empfangsroutinen ein Pin zu toggeln, dann kannst Du mit Oszi oder LED
sehen, daß sich irgendwas tut - oder eben nicht.
Ich dachte auch schon oft, daß irgendwo etwas mit der Hardware nicht
stimmt - aber zu 90% wars die Software.
Du wirst nicht umhin kommen, genauer zu analysieren, was da los ist.
Ohne genaue Kenntnis der Hard- und Software kann man natürlich nur
allgemeine Hinweise geben. So ein klein wenig habe ich mit meinem
Posting da auch drauf hinweisen wollen ;-)
Gast #149959
Lesenswert?
• ▲
▼
Ja, genau mit der LED hab ich auch herausgefunden, dass der Empfänger
sich aufhängt. Dass die Hardware nicht stimmt, halte ich selbst auch
für unwahrscheinlich. Aber anders kann ich mir den Fehler (noch) nicht
erklären, außerdem hat der Baustein schon unter meinen Versuchen
"gelitten".

Ich hab den Source-Code für die Empfangsroutinen angehängt (ohne die
erwähnte Test-LED). Es sind zwei Interrupt-Routinen. Der Code
funktioniert so, wie Du, Peter, es auch vorgeschlagen hast. Den
Pegelwechsel messe ich mit einem Input-Capture (obere Routine), bei
einem Reset nehme ich die Reset-Antwort danach bei einem Compare-Match
zurück (untere Routine).

Ich bin schon gespannt, was ihr dazu sagt!

Viele Grüsse,
Steffen
Angehängte Dateien:
Gast #149960
Lesenswert?
• ▲
▼
Bingo! Ich hab den Fehler gefunden: Wenn er im State "Senden" war, hat
er jede High->Low Flanke genommen, und es als Sendetrigger
interpretiert. Deshalb hat er dann auch das Reset-Signal als Trigger
gesehen, weil er nur auf die Flanke geachtet hat und das eigentliche
Signal ignoriert hat.

Es war also ein Software-Fehler. Das stimmt aber auch nur zum Teil!!
Denn wenn er nicht im State "Senden" war, hätte er einwandfrei
funktionieren müssen. Und in meinem Test-Programm, habe ich ihn NICHT
in diesen State versetzt. Irgendwie ist er also von selbst (?) dort
hingekommen?

Wie kann das sein?!?

Gruß,
Steffen
Gast #149961
Lesenswert?
• ▲
▼
@Steffen:

Kleiner Tip: Du musst bei der Fehlersuche davon ausgehen, dass Du den
Fehler gemacht hast, und nicht andere. Die Wahrscheinlichkeit, dass der
Fehler nicht bei Dir liegt, ist weit unter 0,01%.

Das ist ein rein menschlich, psychologisches Problem, dass beim
Programmieren sehr dominant auftritt.

Daher beim Fehlersuchen immer mit der Einstellung: "Ich habe einen
Fehler gemacht, und ich werde ihn nun finden" suchen, niemals mit der
Einstellung "Da kann kein Fehler sein".

Mit der falschen psychologischen Einstellung, kannst Du keine Fehler
finden. Das ist übrigens durch viele Studien zum Thema Softwarequalität
belegt. Nur wenn Du diese menschliche Schwäche kennst, und auch
akzeptierst dass Du sie auch hast, so wie ich sie habe, so wie sie
jeder Mensch auf dieser Erda hat, nur dann schafst Du es, diese
Schwäche auszutricksen.

Was auch immer sehr gut hilft, ist jemanden Fremden, Dein Programm
mündlich zu erklären. Funktion für Funktion, Zeile für Zeile.
Gast #149962
Lesenswert?
• ▲
▼
Hallo Michael

Du hast vermutlich Recht. Ich bin nur noch nicht so lange dabei, als
dass ich wüsste, wie wahrscheinlich Fehler auf Seiten der Hardware
sind! Es gibt hier ja viele Möglichkeiten, angefangen bei der
Schaltungstechnik (fehlende Abblock-Kondensatoren etc.) über
ESD-/EMV-Probleme bis hin zu Produktionsfehlern.

Trotzdem hast Du mir mit Deiner Einschätzung am Ende noch mehr
weitergeholfen :-) Nachdem ich mir nun zum x-ten Mal das Problem
vorgenommen hatte, ist mir eingefallen, dass meine Test-Unterbrechungen
des Busses vom Empfänger möglicherweise als Empfangsbits interpretiert
werden (Fehler #1). Aus dem Reset wurde so ein Datenbyte
zusammengesetzt und den Rest hat mein Testprogramm geregelt. Dort hatte
ich nämlich programmiert, dass er sein empfangenes Datenbyte sofort
wieder zurücksendet. So hat er seinen State auf "Senden" geschaltet
und konnte nicht mehr auf einen Reset reagieren (Fehler #2)!

Vielen Dank für Deine Antwort, Michael! Natürlich gilt dieser Dank auch
den anderen!!

Gruß,
Steffen
#149963
Lesenswert?
• ▲
▼
"Was auch immer sehr gut hilft, ist jemanden Fremden, Dein Programm
mündlich zu erklären. Funktion für Funktion, Zeile für Zeile."


Das kann ich bestätigen. Derjenige muß nicht mal Ahnung haben, bloß
zuhören.

Man kann auch jemandem sein scheinbar supergut funktionierendes
Programm erklären.
Meistens wirds dann aber etwas peinlich, weil man dabei haufenweise
Fehler entdeckt und sich zum Schluß echt wundert, warum es überhaupt
funktioniert hat (ist mir heute grad passiert).


Peter

Antwort schreiben

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.

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.