Jeder, der schon einmal eigenen Code geschrieben hat, kennt diesen Moment: Man lädt das Programm auf den Mikrocontroller hoch, aber statt zu blinken, zu messen oder zu steuern, passiert… nichts. Oder noch schlimmer: Es passiert etwas völlig Unerwartetes. Bisher haben wir uns in solchen Fällen oft mit unzähligen Serial.print()-Befehlen beholfen, um zu erraten, was im Code gerade schiefläuft.
Heute zeige ich euch eine viel elegantere Methode: Das Debugging. Wir schauen uns an, was das genau ist und wie ihr es mit einem modernen ESP32-C6 und der aktuellen IDE (Integrierte Entwicklungsumgebung) von Arduino kinderleicht selbst nutzen könnt.
Was ist Debugging eigentlich?
Stellt euch vor, euer Programm-Code ist ein rasanter Actionfilm, der in Millisekunden abläuft. Wenn ein Fehler (ein „Bug“) auftritt, ist er meist so schnell vorbei, dass ihr ihn gar nicht bemerkt.
Beim Debugging (also dem „Entwanzen“ oder Fehlerfinden) bekommt ihr eine Fernbedienung für diesen Film.
Ihr könnt:
- Den Code an einer beliebigen Zeile komplett anhalten (das nennt man einen Breakpoint oder Haltepunkt setzen).
- Den Code Zeile für Zeile in Zeitlupe weiterlaufen lassen.
- Live in den Speicher schauen und sehen, welche Werte eure Variablen in genau diesem Moment haben.

Warum der ESP32-C6 dafür perfekt ist
Früher brauchte man für echtes Debugging teure Zusatzgeräte und einen Kabelsalat auf dem Steckbrett. Der ESP32-C6 hat hier aber ein echtes Ass im Ärmel: Er hat die Hardware für die Fehlersuche direkt eingebaut!
Die Technik dahinter nennt sich JTAG (Joint Test Action Group – ein weltweiter Standard zum Testen von Hardware). Beim ESP32-C6 läuft dieses JTAG-Signal direkt über das ganz normale USB-Kabel (Universal Serial Bus). Ihr steckt das Board also einfach an euren PC an und habt sofort einen vollwertigen Fehlersucher zur Verfügung.
Die Vorbereitung in der Arduino IDE
Damit das klappt, benötigen wir die Arduino IDE in der Version 2.x (idealerweise die aktuelle Version 2.3.10 oder neuer). So bereitet ihr alles vor:

- Board anschließen: Verbindet euren ESP32-C6 per USB-Kabel mit dem Rechner.
- Board auswählen: Wählt in der Arduino IDE oben in der Leiste euer ESP32-C6 Board aus.
- USB-Modus umstellen: Geht im Menü auf Werkzeuge -> USB CDC On Boot und stellt diesen Wert auf Enabled.
- JTAG aktivieren: Geht auf Werkzeuge -> JTAG Adapter und wählt dort Integrated USB JTAG aus.
- Optimierung ausschalten: Wählt unter Werkzeuge -> Optimize for Debugging die Option Debug (-Og). Das sorgt dafür, dass die IDE euren Code nicht zu stark verändert und ihr ihn beim Debuggen besser lesen könnt.
Unser Test-Code (mit absichtlichem Fehler!)
Kopiert nun den folgenden Code in eure IDE. Wir haben hier einen ganz klassischen Logikfehler eingebaut. Das Ziel des Codes ist eigentlich: Ein Zähler soll hochzählen und eine angeschlossene LED (hier fiktiv an Pin 8) soll blinken, solange der Zähler kleiner als 5 ist.
int zaehler = 0;
const int ledPin = 8; // Hier könnte eine LED angeschlossen sein
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
}
void loop() {
zaehler = zaehler + 1;
// ABSICHTLICHER FEHLER: Wir haben versehentlich ein ">" statt "<" getippt!
if (zaehler > 5) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
// Zähler nach dem Blinken wieder zurücksetzen
zaehler = 0;
}
delay(1000); // Eine Sekunde warten
}Wenn ihr diesen Code normal hochladet, wird die LED die ersten 5 Sekunden dunkel bleiben und erst dann anfangen zu blinken. Genau falsch herum!
Den Fehler live aufspüren
Jetzt nutzen wir den Debugger, um herauszufinden, warum das passiert:
- Haltepunkt (Breakpoint) setzen: Klickt in der Arduino IDE links neben der Zeilennummer von
if (zaehler > 5) {
Es erscheint ein roter Punkt. Hier wird der Code gleich anhalten. - Debugger starten: Klickt oben in der Leiste nicht auf den normalen „Hochladen“-Pfeil, sondern auf das Symbol mit dem kleinen Käfer (Play-Button mit Bug).
- Der Code hält an: Die IDE lädt den Code hoch und startet. Plötzlich stoppt die Ausführung genau bei eurem roten Punkt. Die Zeile ist nun farbig markiert.
- Variablen prüfen: Schaut euch die linke Seitenleiste in der IDE an. Dort gibt es einen Bereich namens „Lokale Variablen“. Ihr seht dort nun den Wert der Variablen zaehler (zunächst ist es eine 1).
- Schritt für Schritt: Klickt oben in der kleinen Debugger-Leiste auf „Schritt überspringen“ (Step Over). Ihr werdet sehen, dass die Ausführung nicht in die if-Schleife springt, sondern direkt zum delay(1000) am Ende geht.

Die Erkenntnis: Da ihr den Wert von zaehler (der ist 1) direkt live im Speicher seht, wird sofort klar:
Die Bedingung 1 > 5 ist falsch.
Der Fehler ist entlarvt, ohne dass wir auch nur ein einziges Mal Serial.print() bemühen mussten!
Ihr könnt nun den Code korrigieren (aus dem > ein < machen), neu hochladen und alles funktioniert wie geplant.
Probiert es an euren eigenen Projekten aus. Sobald man sich an diese Arbeitsweise gewöhnt hat, spart sie beim Tüfteln enorm viel Zeit und Nerven.
Geht auch mit Arduino Zero, Arduino R4 Wifi oder ESP32-S3
1. ESP32-S3: Ja, exakt wie der ESP32-C6
Das funktioniert genau wie in dem Beispiel für deinen Blogbeitrag. Der ESP32-S3 hat ebenfalls die nötige Hardware für JTAG (Joint Test Action Group – der Standard zur Fehlersuche) direkt für den USB-Anschluss (Universal Serial Bus) eingebaut. Man nennt das „JTAG over USB“.
- Wichtiger Praxis-Tipp: Viele S3-Platinen haben zwei USB-Anschlüsse. Damit das Debugging klappt, musst du das Kabel zwingend in den Anschluss stecken, der mit „USB“, „Native“ oder „OTG“ beschriftet ist – und nicht in den „UART“ oder „COM“ Anschluss.
2. Arduino Zero: Ja, direkt auf der Platine
Der Zero ist der Klassiker für dieses Thema. Er hat einen echten EDBG-Chip (Embedded Debugger) fest auf der Platine verlötet. Du steckst das USB-Kabel einfach in den Anschluss, der als „Programming Port“ beschriftet ist. Die Arduino IDE erkennt den Debugger sofort und du kannst ohne weitere Einstellungen loslegen.
3. Arduino UNO R4 WiFi: Ja, durch eine clevere Lösung
Hier hat Arduino einen sehr schlauen Trick angewendet. Auf dem Board sitzt ein Hauptprozessor (von der Firma Renesas), aber zusätzlich ist auch ein kleiner ESP32-Chip verbaut, der eigentlich für das WLAN (Wireless Local Area Network) zuständig ist. Dieser ESP32 ist vom Hersteller so programmiert worden, dass er nebenbei als vollwertiger Debugger für den Hauptprozessor arbeitet! Du steckst also einfach das USB-C-Kabel ein und kannst in der IDE direkt auf das Käfer-Symbol klicken.
Viel Spaß beim Ausprobieren und bis zum nächsten Projekt!
