Dies ist eine alte Version des Dokuments!


Tipps für die Fehlersuche (= Debugging)

Um die Fehlerursachen zu finden, empfiehlt sich folgendes, generisches Vorgehen:

1. War die Teilfunktion schon jemals lauffähig?
Falls die Funktion an anderer Stelle bereits lauffähig war, dann Ja.
Ja, Teilfunktion war schon lauffähig
Verstehen
Versuchen Sie genau zu verstehen, unter welchen Umständen der fehlerhafte Zustand auftritt.
Wie ist dieser zu reproduzieren? Ohne Reproduzierbarkeit ist ein Fehler nicht auffindbar!
  • Welche Eingaben, Spannungen waren vorhanden?
  • Gleicher Fehler bei geänderten Eingaben?
  • Prüfen Sie auch vermeintlich klare Dinge

Beim Verständnisaufbau hilft manchmal weniger Theorie und mehr ausprobieren.

Wichtig: Schreiben Sie auf, was funktioniert und was nicht (am besten mit Ablage des genutzten Codes). Dann lässt sich auch nach einigen Tests nachvollziehen, was getan wurde.

Und: Ein Fehler der auf mysteriöse Weise wieder verschwindet, kommt genauso wieder (i.d.R. wenn keine Zeit mehr da ist). Ein Fehler der nicht korrigiert wurde, wurde nicht korrigiert..

Vermuten
Erstelle eine Hypothese an was der Fehler liegen kann. Dann ist das (fehlerhafte) System leichter über „Teile und Herrsche“ zu bändigen.
Aufteilen
Breche das System (Hardware und Softwarekomponenten) und die Interaktionen (Schnittstellen, Funktionsaufrufe) auf ein Minimum herunter.

Alternativ: Breche das System in Teile und prüfe ob die Einzelteile fehlerfrei sind.
Ersetzen
Ersetze Systeme (Hardware und Softwarekomponenten) und die Interaktionen (Schnittstellen, Funktionsaufrufe) durch einfachere.
  1. Vereinfache die Software
    1. Kompiliert der Beispiel-Code aus der Vorlesung?
      Kompiliert das gewünschte C-File, wenn alles (includes, variablen, functions), außer main() ausgeblendet wird?
    2. Kompiliert eine einfache Software, welche eine (wechselnde) Ausgabe beinhaltet (z.B. LED, Port)?
      Besser einfach beginnen, also nicht mit einem über SPI angeschlossendem Display.
  2. Vereinfache die Hardware
    1. Nutze Oszilloskop und Logic Analyzer statt ausgebende Komponenten.
    2. Nutze Funktionsgenerator statt eingebende Komponenten.
    3. Nutze bereits getestete Komponenten.
  3. Vereinfache die Interaktion
Beobachten
Tritt der Fehler exakt gleich auf?
Nein, Teilfunktion war noch nie lauffähig
Content
  • Versuchen Sie bei der Fehlersuche Schritt für Schritt vorzugehen.
  • Ist die Stromversorgung an und richtig eingestellt? (z.B. Strombegrenzung nicht auf 0A, kein electric Fuse aktiv)
  • Falls die Spannung zusammenbricht oder das „F“ für Fuse aktiv ist, spricht dies für einen Kurzschluss der Versorgung gegen Masse. Wenn Sie gesockelte Chips haben, können diese entfernt und geprüft werden, ob der Fehler noch anliegt.
  • Sind Messgeräte und Stromversorgung an und richtig eingestellt (z.B. Abschlusswiderstand)?
  • Passt die Verkabelung? Ist Ground korrekt angeschlossen?
  • Sind die passenden Widerstände an der richtigen Position? Und sind die Dioden in richtiger Richtung bestückt?
  • Können Spannungen als Zwischenwerte gemessen werden?
  • Sind die Pins richtig angeschlossen? Z.B. Spannungsversorgung am OPV
  • Funktioniert das Flashen über das Proggi? Falls nicht:
    • Ist der korrekte USB-Anschluss gewählt?
    • Ist der Fehler auch mit einem anderen Proggi + anderen Kabeln vorhanden?
    • Ist in der Schaltung die SPI-Schnittstelle in Verwendung? Sind weitere Bauteile zwischen Programmierbuchse und Controllerpin, bzw. zwischen Programmierbuchse und anderen Spannungen (wie GND)?
  • Falls Sie einen Fehler in der Kommunikation vermuten: verbinden Sie RX mit TX und überprüfen Sie, ob am gleichen Bauteil das korrekte Signal ankommt.
  • Compiliert der Code?
    • Ist die richtige Zielhardware (z.B. ATmega328PB) gewählt?
    • Sind bei den eingebundenen Bibliotheken die Randbedingungen der Zielhardware berücksichtigt? (z.B. hat der ATmega328PB andere Benamung der I2C und SPI Register, da diese mehrfach vorhanden sind)
  • Wichtig ist, dass Sie zunächst eine Ausgabemöglichkeit schaffen. Die kann ein digitaler (oder analoger) Output Pin oder eine LCD-Anzeige sein. Ohne diese ist eine strukturierte Fehlersuche schwer möglich. Versuchen Sie die Ausgabemöglichkeit als erstes zu programmieren und zu testen.
  • Wenn Sie zur Fehlersuche Ihr Programm ändern, machen Sie eine Sicherungskopie des Programms. Weiterhin sollten Sie die zur Fehlersuche geänderten Zeilen markieren (z.B. mit dem Kommentar DEBUGGING!)
  • Falls das Programm nicht die von Ihnen gewünschte Ergebnisse liefert, dann versuchen Sie zunächst möglichst weiträumig Code auszukommentieren. Falls dann das Programm noch einen sinnvollen Ablauf zeigt, kann Schritt für Schritt die Auskommentierung aufgehoben werden.
  • Nutzen Sie die Möglichkeit nach Zwischenschritten eine Wertänderung auszugeben (z.B. Ausgabe am LCD). Damit kann ermittelt werden ab welcher Zeile der tatsächliche Ablauf vom gewünschten abweicht.
  • Prüfen Sie mit Hilfe der AVR Checkliste nach bekannten Fehlerquellen
  • Falls Sie dann immer noch nichts finden: Schreiben Sie eine Frage an den Betreuer. Achten Sie dabei auf das richtige Stellen von Fragen

Häufige Fehler

  • Auf den I2C Leitungen ändert sich nichts, obwohl der IC etwas ausgeben sollte:
    1. Überprüfen Sie die Pullup-Widerstände: Sind welche verbaut? Welche Größe haben diese? (typisch: 10kOhm). Wenn keine Verbaut sind, so wechselt das Signal nur zwischen 0V niederohmig und 0V hochohmig. Dies ist am Oszilloskop nicht zu unterscheiden.
    2. Ist ein hochohmiger Widerstand $R_L$ entlang der Leitungen verbaut? Falls ja erzeugt dieser einen Spannungsteiler mit dem Pullup-Widerstand. Wenn $R_L$ groß ist, so liegt zwischen $R_L$ und Pull-up fast die Versorgungsspannung an.

Tipps für die Fehlerkorrektur (Bugfixing)

  • Bei größeren (Serien)Projekten steht einer einfachen Elektronik-Fehlerkorrektur häufig die komplexe Validierung und Tests der Hardware im Weg. Entsprechend kann es sich anbieten die Fehler über ein Mod-Board - also einem kleinen Zusatzboard - zu korrigieren. Dafür bietet sich beispielsweise ein kompakter Chip, wie der 6 Pin SOT PIC10F206 oder der Attiny10 an.