DebugWIRE

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

debugWIRE ist die Bezeichnung einer Debug-Schnittstelle, die Atmel für die kleineren Mitglieder seiner AVR-Controllerfamilie entwickelt hat, die nicht über JTAG verfügen. Es wurde vor allem konzipiert für Controller mit wenigen Pins, bei denen der für JTAG notwendige Aufwand von 4 separaten Leitungen die möglichen Applikationen zu stark einschränken würde. Daher ist es bei allen moderneren ATtiny-Controllern anzutreffen, aber auch bei einigen kleinen ATmega-Typen (ATmega48/88/168/328 bzw. deren Picopower-Versionen).

Physik

debugWIRE ist als sogenannter Eindrahtbus konzipiert, ähnlich wie der Dallas (jetzt Maxim) 1-wire-Bus. Es erfolgt eine bidirektionale Datenübertragung über nur einen einzigen Draht (und Masse als Bezugspotential). Um die Applikation in den ihr zur Verfügung stehenden Pins möglichst wenig einzuschränken, wurde die /RESET-Leitung für debugWIRE doppelt belegt.

Die Realisierung als Eindrahtbus stellt einen Kompromiss dar, der bei der Gestaltung des Zielsystems berücksichtigt werden muss. Um den bidirektionalen Datentransfer ohne Schaden an Ausgangstreibern bei möglichen Bus-Kollisionen zu realisieren, arbeiten lediglich zwei Open-Drain-Ausgänge (einer im Emulator und einer im AVR) auf dem Bus und können ihn nach low ziehen. In Richtung high wird er durch einen integrierten Widerstand gegen VCC (pull-up) gezogen, was naturgemäß in einer Spannungs-Zeit-Kurve in Form einer Exponentialfunktion resultiert. Die RC-Zeitkonstante des gesamten Eindrahtbusses (bei der der genaue Wert für C abhängig ist vom Aufbau des Zielsystems) limitiert die mögliche Datenübertragungsrate.

Beim Aufbau muss aus diesem Grunde darauf geachtet werden, dass die /RESET-Leitung keine zusätzliche kapazitive Last erhält und dass ein eventuell vorhandener externer Pullup-Widerstand nach VCC nicht kleiner als 10 kΩ dimensioniert ist. (Auf eine Anfrage bei einem Problem hat die Atmel-Hotline jedoch auch teilweise bereits ein Minimum von 4,7 kΩ empfohlen.) Zwar ist dieser Widerstand laut Dokumentation nicht erforderlich, er kann aber u. U. helfen, die Übertragungsqualität des Busses zu verbessern.

Da eine derartige Beschaltung der /RESET-Leitung den Richtlinien zum EMV-festen Schaltungsentwurf entsprechend Appnote AVR040 widerspricht, sollte man bei einer Platinenentwicklung die EMV-Schutzbeschaltung vorsehen aber für das Debuggen mittels debugWIRE nicht bestücken.

Protokoll

Das eigentliche debugWIRE-Protokoll wird von Atmel als Firmengeheimnis betrachtet und ist nicht veröffentlicht. Der einzige Weg, dieses zu nutzen ist durch den Einsatz eines entsprechenden Emulators. Derzeit stehen dafür das JTAG ICE mkII, JTAGICE3, AtmelICE und der AVR Dragon zur Verfügung.

Eine von Privatleuten angefangene Entschlüsselung ist auf ruehmohr.org zu finden, jedoch gibt es keine DIY-Debughardware, die darauf fußt und auch noch mit avarice oder AVR Studio kompatibel ist. Auf github findet sich ein einfacher Stand-Alone-Debugger für Windows und Linux, der Anschluss an den PC erfolgt über ein FT232R-Interface.

Die im AVR untergebrachte debugWIRE-Maschine ist weniger mächtig als bei JTAG. Im Wesentlichen kann sie nur solche Tätigkeiten erledigen, die auch die CPU des Controllers im normalen Betrieb erledigen kann (einschließlich der Abarbeitung von SPM-Befehlen zum Ändern des Flash-ROMs). Damit lassen sich entsprechend keine Fuses und Lockbits lesen oder setzen. Anders als JTAG besitzt debugWIRE keine Breakpoint-Möglichkeiten in der CPU-Hardware, damit können Breakpoints nur über das Einfügen von BREAK-Befehlen in den Flash-ROM-Inhalt realisiert werden (Software-Breakpoint). Dies erfolgt transparent durch die Firmware des JTAG ICE, die nach dem Erreichen des Breakpoints den ursprünglichen Inhalt der entsprechenden Seite im Flash-ROM wieder herstellt. Daten-Breakpoints sind nicht möglich.

Das entsprechende häufige Umprogrammieren des Flash-ROM-Inhaltes trägt zur Abnutzung desselben bei. Dies sollte berücksichtigt werden, wenn man in Erwägung zieht, Geräte nach dem Debuggen noch ihrer tatsächlichen Nutzung zuzuführen.

Insgesamt abstrahiert das JTAG ICE mkII (bzw. der AVR Dragon) die Details des Protokolls auf eine Schnittstelle, die im Wesentlichen komplett der bei einer Emulation über JTAG entspricht.

Die Aktivierung des debugWIRE-Modus erfolgt durch das Setzen (also Programmieren auf den Bitwert 0) der DWEN-Fuse, die normalerweise im high fuse byte zu finden ist. Ab diesem Moment steht der /RESET-Pin nicht mehr für seine normale Reset-Funktion zur Verfügung, daher lässt sich dann auch das ISP-Protokoll nicht mehr nutzen.

Das Abschalten des debugWIRE-Modus erfolgt in zwei Stufen. In einer ersten Stufe wird mit einem speziellen Befehl an das JTAG ICE mkII ein CPU-Reset ausgeführt, der die debugWIRE-Einheit vorübergehend deaktiviert und damit die normale /RESET-Funktion wiederherstellt. Damit lässt sich nachfolgend normales ISP-Protokoll anwenden, um die DWEN-Fuse wieder zurückzusetzen (debugWIRE selbst kann keine Fuses ändern). Dieser vorübergehende Zustand dauert an bis zum nächsten Aus- und Einschalten des AVR, in diesem Moment wird dann die DWEN-Fuse neu bewertet. Technisch ist es ebenso möglich, die DWEN-Fuse einfach aktiviert zu lassen und den ISP-Modus nur temporär für andere Aufgaben zu nutzen. Nach dem erneuten Einschalten ist der AVR dann wieder im debugWIRE-Modus.

Software

AVR-Studio kann mit den entsprechenden Emulatoren umgehen und bietet die debugWIRE-Schnittstelle automatisch als Debugmöglichkeit für alle AVRs an, bei denen sie vorhanden ist. (Genauer: bei denen sie im sogenannten part description file aufgeführt worden ist.)

AVRDUDE kann debugWIRE über die Manipulation der Fuses zuschalten und kann im debugWIRE-Modus den Inhalt von Flash-ROM oder EEPROM lesen oder schreiben. Das Rückschalten aus dem debugWIRE-Modus erfolgt zweistufig, so wie es von der Hardware vorgegeben ist. Dazu aktiviert man ein entsprechendes Kommando für eine ISP-Programmierung mittels JTAG ICE mkII (-c jtag2isp) oder mittels AVR Dragon (-c dragon_isp). Wenn dieses Kommando fehlschlägt, versucht AVRDUDE anschließend das temporäre Abschalten des debugWIRE-Modus und trennt sich vom Emulator. Ein erneutes Absetzen des gleichen Kommandos sollte dann im ISP-Modus ganz normal funktionieren.

AVaRICE kann mit der Option -w über debugWIRE sowohl das JTAG ICE mkII als auch den AVR Dragon bedienen. Es dient dabei als Bindeglied zum GDB, der die eigentlichen Debugger-Aufgaben erledigt.

An- und Abschalten von Debug-Wire Zum Anschalten muss nur die DWEN Fuse gesetzt und der AVR einmal ein- und ausgeschalten werden.

Anschalten im AVR-Studio 4:

  • Debugging starten
  • "Use SPI to enable debugWIRE interface" auswählen und OK klicken.
  • Power Off / Power On und Messagebox mit "OK" bestätigen.
  • Controller befindet sich im Debug-Mode, Debug-Session startet.

Zum Abschalten muss folgende Sequenz eingehalten werden:

  • Power On
  • Reset-enable Befehl zum AVR senden
  • Im ISP-Modus die DWEN-Fuse löschen
  • Power Off

Vorgehen im AVR-Studio 4:

  • Starten eines Projekts im Debug Modus, jedoch das Programm nicht starten.
  • Im Debug Menü: Die JTAGICE mk II/AVR Dragon Options aufrufen.
  • Den Button "Disable debugWIRE" anklichen. Folgende Messagebox mit Ja/Yes bestätigen.
  • Nach ca. 3s "Platform has been disconnected, leaving debug mode" bestätigen. Options schliessen.
  • Controller befindet sich jetzt wieder im ISP-Mode.

Vorgehen im AVR-Studio 5:

  • Im Menü Debuggen: Disable debugWIRE and Close

Vorgehen im AVR-Studio 6:

  • Debuging starten.
  • In der Menüleiste: Debug -> Disable debugWIRE and Close.

Work Around falls DW Fuse gesetzt und SPIEN Fuse gelöscht ist (am Beispiel eines ATmega168):

  • RESET-Pin vorsichtig physisch zur Seite weg biegen und dann erst den µC in den Sockel stecken
  • RESET-Leitung des Programmers mit dem freigelegten RESET-Pin verbinden
  • Programm im Debug-Modus im Atmel Studio 6.x starten
  • Programm über "Disable debugWIRE and Close" verlassen
  • RESET-Pin vorsichtig wieder zurückbiegen

Debugwire mit Linux

Unter https://github.com/dcwbrown/dwire-debug.git gibt es eine hostseitige Implementierung des debugwire Protokolls, die ausser einem USB2Serial Dongle und einer Diode keine weitere Hardware benötigt. Dieses Programm stellt einen einfachen Debug-Monitor dar. Es hat ausserdem einen gdbserver eingebaut und läuft auch unter Windows. In ersten Versuchen zeigte sich die Implementierung als ziemlich stabil und brauchbar.

Die SPI-Schnittstelle im debugWIRE Mode

Während sich der Controller im debugWIRE Mode befindet, ist die SPI-Schnittstelle vollkommen autonom. D.h. am SPI angeschlossene Hardware wird nicht beeinflusst oder beeinflusst ihrerseits die debugWIRE-Verbindung. Die Kommunikation mit dem Controller findet ausschliesslich über den Reset-Pin statt. Beim Dragon sind die Pull-Ups wirksam. Der JTAGICE MKII lässt die Schnittstelle vollkommen "in der Luft hängen". Dies hat den Vorteil, dass man die Schaltung Flashen und Testen kann, ohne sich um die Hardware am SPI kümmern zu müssen. Was bei Programmierung über ISP nicht immer der Fall ist und insbesondere bei kleinen Controllern (e.g. Attiny25) zu einer Nerven- und Geduldsprobe werden kann.

debugWIRE und Sleepmode

Bei eingeschaltetem debugWIRE sind die Sleepmodes unwirksam. Es lässt sich zwar das richtige Verhalten, z.B. die Funktion des Timer2 mit einem Uhrenquarz im Power Save, beobachten. Der Stromverbrauch wird jedoch nicht gesenkt! Eine Messung des Stroms führt somit nicht zu praxisgerechten Ergebnissen.