AVR Programmieradapter
Ein Programmerieradapter dient dazu, das selbst geschriebene und compilierte Programm in den Flash Speicher des Mikrocontrollers zu übertragen. Manche eignen sich auch zum Debuggen. Für Arduino Boards brauchst du keinen Programmieradapter, denn sie sind mit einem Bootloader ausgestattet. Trotzdem haben sie einen entsprechenden Anschluss, falls der Bootloader mal versagt.
Produkte
Microchip MPLAB PICkit Basic
Aktueller Standard von Microchip ist der MPLAB PICkit Basic, mit dem man so ziemlich alle Mikrocontroller von Microchip und Atmel sowohl programmieren als auch debuggen kann.
Der PICkit Basic arbeitet mit Spannungen von 1,2 bis 5 Volt. Er unterstützt ab Werk alle PIC, dsPIC, PIC32, SAM Mikrocontroller (mit ICSP, JTAG, SWD), sowie AVR Controller (mit DebugWire, ISP, JTAG, TPI, PDI, UPDI). Der MPLAB PICkit Basic verwendet unter Windows den Standard-Treiber winusb und unter Linux libusb. Er kann nur mit der MPLAB X IDE benutzt werden. Es gibt keine andere kompatible IDE.
Microchip MPLAB Snap
Vor dem MPLAB PICkit Basic war der MPLAB Snap unter Bastlern beliebt. Anfangs unterstützte er nur Mikrocontroller von Microchip, während die Unterstützung für Mikrocontroller von Atmel nach und nach ergänzt wurde.
Der MPLAB Snap arbeitet mit Spannungen von 1,4 bis 5 Volt. Mit seiner originalen Firmware unterstützt erdie PIC, PIC32 und dsPIC Mikrocontroller (mit ICSP, JTAG, SWD). Für AVR Controller (mit DebugWire, ISP, JTAG, TPI, PDI, UPDI), sowie SAM Controller (mit SWD und JTAG) muss man seine Firmware auswechseln. Der MPLAB PICkit Basic verwendet unter Windows den Standard-Treiber winusb und unter Linux libusb. Er kann mit Avrdude und der MPLAB X IDE benutzt werden. Es gibt keine andere kompatible IDE. Auch das Microchip Studio wird von der aktuellen Firmware nicht mehr unterstützt.
Bei der gezeigten alten Platine muss man für AVR mit TPI, PDI und UPDI den Widerstand R48 entfernen. Neuere Platinen haben dafür den Jumper "J5" an der Stelle X bekommen (in diesem Fall R48 nicht entfernen).
Diamex
Von der Firma Diamex gibt es einige recht gute Programmieradapter für AVR Mikrocontroller, ohne Debugger Funktion. Zum Beispiel diese beiden:
Der "Diamex USB ISP Stick" kann AVR Mikrocontroller mit 3,3 und 5 Volt über ISP programmieren. Der Stick ist zum Atmel STK500 kompatibel. Der zugehörige Treiber für den virtuellen COM Port wird nur unter Windows 7 und 8 benötigt. Windows 10, 11 und Linux enthalten bereits einen passenden Treiber.
Der größere "Diamex AVR-Prog" kann ebenfalls AVR Mikrocontroller mit 3,3 und 5 Volt programmieren. Er unterstützt neben ISP auch TPI und PDI Schnittstellen. Der AVR-Prog ist zum Atmel AVRISP mkII kompatibel. Für Arduino und Avrdude unter Windows braucht er den libusb-win32 Treiber. Unter Linux läuft er ohne Treiber-Installation.
Beide Programmieradapter können die Zielschaltung mit 3,3 V und 5 V aus dem USB Kabel versorgen. Sie werden vom AVR Studio 4, Atmel Studio 6, Microchip Studio 7, Arduino und Avrdude unterstützt. Für die MPLAB X IDE hat Diamex keine passenden Programmieradapter im Angebot.
USBASP
Der USBASP ist ein alter Programmieradapter von Thomas Fischl. Er beschränkt sich auf das Programmieren von AVR Mikrocontroller mit ISP Schnittstelle, ohne Debugger Funktion.
Zahlreiche chinesische Händler bieten Nachbauten zu einem sehr geringen Preis an. Sie können den Mikrocontroller wahlweise mit 3,3 oder 5 Volt versorgen, aber ihre Signale haben trotzdem immer 5 Volt Pegel, was ich für einen groben Designfehler halte. Wegen dem veralteten 10 poligen Anschluss braucht man meistens ein Adapterkabel. Bei meinem habe ich vier 180 Ohm Widerstände in die Signal-Leitungen eingefügt, welche meine 3,3 Volt Schaltungen vor Überspannung beschützen.
Für Mikrocontroller mit weniger als 4 MHz Systemtakt muss man die Übertragungsrate reduzieren, was je nach Firmware Version unterschiedlich gemacht wird:
- Jumper JP3 an Stecken
- Die Umschaltung in den "Slow" Modus geschieht automatisch.
- Die Taktrate kann per Software eingestellt werden (avrdude -B16).
Der USBASP ist zu keinem anderen Programmieradapter kompatibel. Die Software von Atmel und Microchip unterstützt den USBASP nicht. Du kannst ihn aber mit Avrdude und der Arduino IDE benutzen. Unter Windows brauchst du normalerweise den libusb-win32 Treiber. Es gibt eine modifizierte Firmware Version, die den winusb Treiber unterstützt. Linux geht ohne Treiber-Installation.
Atmel STK500
Das STK500 von Atmel ist ein altes Experientierbrett für zahlreiche AVR Mikrocontroller im DIL Format. Ich erwähne es hier, weil dieses Board für zahlreiche Programmieradapter und auch für den Arduino Bootloader als Vorlage diente.
Das STK500 hat zum PC hin einen seriellen RS232 Anschluss, dahinter kommt ein fest aufgelöteter Mikrocontroller, der mit der ISP Schnittstelle des zu programmierenden Mikrocontrollers (dem Target) verbunden ist. Die meisten STK500 kompatiblen Boards haben anstelle der RS232 Schnittstelle einen USB-UART Chip, dessen Treiber einen virtuellen COM Port bereit stellt. Das Board wird vom AVR Studio 4, Atmel Studio 6, Microchip Studio 7, Arduino und Avrdude unterstützt. Die MPLAB X IDE unterstützt dieses Board nicht.
Atmel AVRISP mkII
Der Atmel AVRISP mkII war lange mein lieblings Programmieradapter, weil er sehr robust ist und den ganzen Versorgungsspannungsbereich von 1,6 bis 5,5 Volt unterstützt. Debuggen kann man damit nicht.
Der Atmel AVRISP mkII unterstützt AVR Mikrocontroller mit ISP, TPI und PDI Schnittstelle. Er wird vom AVR Studio 4, Atmel Studio 6, Microchip Studio 7, Arduino und Avrdude unterstützt. Die MPLAB X IDE unterstützt diesen Programmieradapter nicht. Für Arduino und Avrdude brauchst du unter Windows den libusb-win32 Treiber. Linux geht ohne Treiber-Installation.
Das Gerät wird nicht mehr original angeboten, aber es gibt kompatible Nachbauten. Manche Geräte die so aussehen enthalten allerdings keinen AVRISP mkII, sondern sind zum STK500 kompatibel.
Atmel ICE
Wer AVR Mikrocontroller nicht nur programmieren sondern auch debuggen wollte, musste lange Zeit diesen teuren Atmel ICE verwenden. Bitte verwechsele dieses Produkt nicht mit den älteren "AVR JTAGICE 3" und "AVR JTAGICE mkII", die beide ähnlich aussahen.
Der Atmel ICE unterstützt alle AVR Mikrocontroller mit ISP, DebugWire, JTAG, TPI, PDI und UPDI Schnittstelle. Außerdem unterstützt er einige SAM ARM Controller mit SWD und JTAG. Er unterstützt den vollen Versorgungsspannungsbereich von 1,6 bis 5,5 Volt. Die Anschlüsse des Gerätes haben 1,27 mm Raster, so dass man auf spezielle Adapterkabel angewiesen ist. Der Atmel ICE wird von Atmel Studio 6, Microchip Studio 7 und der MPLAB X IDE voll unterstützt. Arduino und Avrdude können den Atmel ICE nur zum Programmieren von AVR nutzen, jedoch nicht zum Debuggen. Für Arduino und Avrdude unter Windows brauchst du den libusb-win32 Treiber. Linux geht ohne Treiber-Installation.
Atmel AVR JTAGICE mkII
Hierbei handelt es sich um ein problematisches Produkt, dass nur noch in gefälschter Form aus Asien vertrieben wird. Die guten Originale wurden zuletzt 2016 produziert. Zahlreiche Leute haben berichtet, dass ihr Nachbau nicht funktioniert. Zudem besteht der Verdacht, dass das Atmel/Microchip Studio die gefälschten Geräte erkennt und unbrauchbar macht.
Mikrocontroller mit ISP
Ich empfehle die folgenden Mikrocontroller:- 8 Pins: ATtiny 25, 45, 85
- 14 Pins: ATtiny 24, 44, 84, 441, 841 (441 und 841 nur in SMD)
- 20 Pins: ATtiny 2314, 4313, 261, 461, 861
- 28 Pins: ATmega 48, 88, 168, 328, 48PB, 88PB, 168PB, 328PB (PB nur in SMD)
- 40 Pins: ATmega 164, 324, 644, 1284
- 64 Pins: ATmega 1281, 2561 (nur in SMD)
- 100 Pins: ATmega 640, 1280, 2560 (nur in SMD)
Sie gehören zu den klassischen AVR Modellen der zweiten Generation, mit ISP Schnittstelle zum Programmieren und DebugWire zum Debuggen. Es gibt weitere Serien mit anderen Schnittstellen (TPI, PDI und UPDI).
ISP Pinbelegung
Der alte ISP Stecker hat 10 Pins, der neue hat 6 Pins:
- MOSI überträgt Kommandos und Daten seriell zum Mikrocontroller (Master-Out Slave-In)
- MISO überträgt Antworten und Daten seriell zum PC (Master-In Slave-Out)
- SCK ist das Taktsignal dazu. Ees wird vom Programmieradapter erzeugt (Serial Clock). Die Frequenz darf maximal 1/4 von der CPU Taktfrequenz betragen.
- RESET wird vom Programmieradapter auf Low gezogen und gehalten, um den Mikrocontroller in den Programmier-Modus zu versetzen. Bei Modellen mit Debugwire wird der selbe Pin auch als bidirektionale serielle Leitung zum Debuggen verwendet.
- Vtarget oder VCC. Über diesen Pin versorgt normalerweise die Zielschaltung den Programmieradapter, so dass er sich an die Spannung anpassen kann. Manche Programmieradapter können an diesem Pin auch umgekehrt eine Stromversorgung mit 3,3 oder 5 Volt bereit stellen.
Diese Pins muss man 1:1 verbinden. Außerdem braucht der Mikrocontroller eine Stromversorgung, die mit einem Abblock-Kondensator (z.B. 100 nF) stabilisiert wird.
Avrdude
Avrdude von Joerg Wunsch ist ein sehr weit verbreitetes Bedienprogramm für viele Programmieradapter. Die Arduino IDE benutzt es als Unterprogramm. Avrdude wird über Komandozeilen-Parameter gesteuert, aber es gibt auch grafische Benutzeroberflächen dazu.
Linux Benutzer finden das Programm im Paketmanager ihrer Distribution. Der Download für Windows ist
dort.
Die richtigen Kommandozeilen-Optionen findet man schnell mit Google, indem man nach dem Namen des Programmieradapters und "Avrdude" sucht. Beispiele:
Programmieradapter | Befehl |
---|---|
Atmel STK500, Diamex USB-ISP Stick | avrdude -c stk500 -P COM3 -B16 -p attiny2313 |
Atmel AVRISP mfkII, Diamex AVR-Prog | avrdude -c avrispmkii -B16 -p attiny2313 |
Atmel ICE | avrdude -c atmelice_isp -B16 -p attiny2313 |
MPLAB Snap | avrdude -c snap_isp -B16 -p attiny2313 |
USBASP | avrdude -c usbasp -B16 -p attiny2313 |
ICprog-AVR2.0 | avrdude -c avr910 -P COM3 -b 115200 -p attiny2313 |
Arduino Boards mit altem Bootloader (ATmegaBOOT) | avrdude -c arduino -P COM3 -b 57600 -p atmega328 |
Arduino Boards mit neuem Bootloader (Optiboot) | avrdude -c arduino -P COM3 -b 115200 -p atmega328 |
Arduino Uno als ISP Programmieradapter | avrdude -c stk500v1 -P COM3 -b 19200 -p attiny2313 |
Alte Avrdude Versionen erfordern unter Windows für zweistellige COM-Port Nummern die besondere Schreibweise "-P \\.\COM10".
Beispiel für einen virtuellen COM Port unter Linux: "-P /dev/ttyUSB0".
Bei USB Geräten ohne virtuellen COM Port gibt man "-P usb" an oder lässt den Parameter ganz weg.
Der Parameter -B16 reduziert die Geschwindigkeit der Kommunikation zwischen Programmieradapter und Mikrocontroller. Ohne diesen Parameter würde er den standardmäßig mit nur 1Mhz getakteten Mikrocontroller überfordern. Je größer die Zahl, umso langsamer die Kommunikation. Der Parameter wird von manchen Programmieradaptern ignoriert.
So teste ich Avrdude mit einem Atmel AVRISP mkII unter Ubuntu Linux:
Avrdude liest die Signatur und die Fuses des Mikrocontrollers aus. Wenn Avrdude (wie in diesem Fall) meckert, dass die Signatur falsch sei, dann hat man entweder den Mikrocontroller-Typ falsch angegeben, oder die Übertragung zwischen Programmieradapter und Mikrocontroller ist gestört. Die häufigsten Ursachen für gestörte Übertragungen sind:
- Die Taktrate ist zu hoch (Parameter -B16 vergessen)
- Kabelbruch im Flachbandkabel
- Wackelkontakt auf dem Steckbrett
- Der Abblock-Kondensator fehlt
- Andere Bauteile an den betroffenen Leitungen stören
Wenn du so weit bist, dass Avrdude die Signatur erfolgreich ausliest, kannst du versuchen, den Programmspeicher zu beschreiben. Dazu gibt es weitere Kommandozeilen-Parameter. Aber mache das besser mit Hilfe einer GUI, einem Script oder dem Makefile, nicht manuell.
Als GUI empfehle ich AVR8 Burn-O-Mat, welches eine Java Runtime (in Version 8 oder neuer) benötigt. Oder alternativ AVRDUDESS, welches in .NET programmiert wurde und unter Linux mit "mono" ausgeführt werden kann.
Avr-Osp II
Für ISP Programmieradapter und Bootloader, die PC seitig mit dem AVROSP Protokoll (= AVR 910/911) kommunizieren, kann man das Windows Programm Avr-Osp II benutzen. Das ist eine alte vertrauenswürdige Version des Programms. Zur russischen Webseite des Autors geht es hier lang.
USB Treiber
Manche Geräte haben einen virtuellen COM Port, andere werden über einen generischen USB Treiber angesprochen.Linux
Linux enthält standardmäßig Treiber für alle virtuellen COM Ports. Die virtuellen COM-Ports heissen /dev/ttyUSB0, /dev/ttyACM0, oder so ähnlich. Als root Benutzer kannst du den Befehl sudo dmesg -T direkt nach dem Anstecken des USB Kabels benutzen, um den Namen des virtuellen COM Portes heraus zu finden. Normale (nicht root) Benutzer müssen Mitglied der Gruppe "dialout" sein, um diese Ports benutzen zu dürfen.
Programmieradapter ohne (virtuellen) COM Port werden in der Regel durch den libusb Treiber angesprochen, der in jeder Standardinstallation enthalten ist. Um normalen (nicht root) Benutzern Zugriff zu gewähren, legt man typischerweise eine "udev-rule" an. Mit Google wirst du entsprechende Beispiele passend für deinen Programmieradapter finden.
Windows
USB Geräte mit virtuellem COM Port lösen beim Anstecken die Installation des Treibers passend zum USB Chip aus. Teilweise geschieht das vollautomatisch. Allerdings verweigern die meisten aktuellen Treiber ihre Funktion mit gefälschten Chips. Mehr dazu dort. Du kannst im Gerätemanager beobachten, welcher COM Ports erscheint, sobald du das Gerät anschließt. Dort werden auch Fehlermeldungen angezeigt, falls der Treiber nicht geladen werden konnte.
Bei den Programmieradaptern ohne (virtuellen) COM Port ist die Lage etwas chaotisch. WCID kompatible Programmieradapter werden automatisch vom winusb Treiber unterstützt, der im Lieferumfang von Windows enthalten ist. Für andere nicht WCID kompatible Programmieradapter und alte Programme benötigt man stattdessen meistens den libusb-win32 Treiber. Die software von Atmel verwendet hingegen den eigenen mitgelieferten Jungo Treiber. Dieser verträgt sich mit winusb und libusb-win32.