Software-Reset aus dem Arduino Leonardo herauspatchen

Der Arduino Leonardo, der nun seit etwa einem Jahr auf dem Markt ist, besitzt dank seines ATmega 32u4 direkt die Möglichkeit, eine USB-Verbindung mit dem PC aufzubauen - auf dem Arduino Uno war dafür ein separater Mikrocontroller zuständig. Durch diese Änderung hat sich jedoch auch die Art, wie Resets über den USB-Anschluss angestoßen werden, geändert. Dieser Reset ist inzwischen eine reine Software-Routine und kann entsprechend - falls nötig - herausgepatcht werden.

Der Software-Reset wird ausgeführt, indem vom PC aus eine serielle Verbindung mit 1200 Baud aufgebaut und wieder geschlossen wird. Die auf dem Arduino Leonardo laufende Software interpretiert dies als Wunsch, einen Reset durchzuführen. Dieser kann im Anschluss zum Beispiel genutzt werden, um einen neuen Sketch auf das Gerät zu laden. In Fällen, in denen mit Hilfe der Arduinos jedoch z.B. eine Kleinserie gefertigt wird, kann der Wunsch bestehen, das einfache Aufspielen von neuen Sketches zu unterbinden.

Hierfür sollte man bei seinem Arduino-IDE Installationsverzeichnis einmal in die Datei /hardware/arduino/cores/arduino/CDC.cpp blicken. In dieser findet sich die Funktion CDC_Setup(), die folgenden Passus enthält:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// auto-reset into the bootloader is triggered when the port, already
// open at 1200 bps, is closed.  this is the signal to start the watchdog
// with a relatively long period so it can finish housekeeping tasks
// like servicing endpoints before the sketch ends
if (1200 == _usbLineInfo.dwDTERate) {
     // We check DTR state to determine if host port is open (bit 0 of lineState).
    if ((_usbLineInfo.lineState & 0x01) == 0) {
        *(uint16_t *)0x0800 = 0x7777;
        wdt_enable(WDTO_120MS);
    } else {
        // Most OSs do some intermediate steps when configuring ports and DTR can
        // twiggle more than once before stabilizing.
        // To avoid spurious resets we set the watchdog to 250ms and eventually
        // cancel if DTR goes back high.
       
        wdt_disable();
        wdt_reset();
        *(uint16_t *)0x0800 = 0x0;
    }
}

Um den Software-Reset zu deaktivieren, muss dieser Code einfach vollständig auskommentiert werden. Anschließend ist ein Reset nur noch durch Betätigung des Reset-Buttons oder durch manuelles Verbinden des RESET-Pins mit einem GND-Pin möglich.

Resettende Grüße, Kenny

P.S.: Natürlich ist es auch möglich, den Software-Reset wieder zu aktivieren. Dazu muss der vormals auskommentierte Quelltextblock wieder einkommentiert werden und einmal ein Sketch durch einen rechtzeitigen manuellen Reset geflasht werden.

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.