mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Störungen auf AVRs?


Autor: Steffen (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Softwarefehler. In Deinen Routinen fehlt die entsprechende
Fehlertoleranz (z.B. Time-Out Erkennung).

Autor: Steffen (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:
Angehängte Dateien:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Michael (ein anderer) (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.