Mit Arduino wurde vieles bequemer und in einer gewissen Weise sogar einfacher. So können Programme einfach per USB auf den Microcontroller geladen werden. Wer jetzt jedoch denkt, es gäbe für den guten, alten Programmer keine Verwendung mehr, irrt sich.
Die selben Arduino-Sketches können auch mit dem Programmer geladen werden. Da dabei der Arduino-Bootloader nicht benötigt (und daher entfernt) wird, bekommen Programme etwa 2KB mehr Platz und weil keine Zeit zum Warten auf den Upload verschwendet wird, auch ein erheblich schnelleren Start- bzw. Reset-Vorgang. Allerdings wird nach dieser Prozedure ein erneutes Installieren von Bootloader notwendig, wenn danach wieder Upload per USB gewünscht sein sollte. Das geht ganz einfach mit der Arduino-IDE, auch für dann, wenn der verwendete Atmel Microcontroller noch nie davor als Arduino geflasht gewesen war. Natürlich geht es auch umgekehrt, ein Arduno kann als eine ganz normale Atmel-CPU verwendet werden.
Ein extrem günstiger (<3 Euro) Programmer habe ich auf eBay zu gefunden (China-Produkt).
Das Gerät besitzt einen 10-polligen ISP-Stecker. Zusätzlich zu der Standardbelegung, sind Pins 4 und 6 mit TXD und RXD Signalen belegt. Um ein Arduino-Board (Uno, Nano, Mega) daran anzuschliessen, wird noch ein Adapter auf 6-polligen ISP (auf dem Arduino als ICSP beschriftet) benötigt. Auch diesen bekommt man sehr günstig bei eBay.
Bei Boards, die keinen ICSP-Leiste anbieten, müssen entsprechende Pins direkt verwendet werden. Folgende Zeichnung zeigt das für ein ProMini Board.
Ich musste schon etwas suchen und vergleichen, habe aber einen Schaltplan zu diesem Gerät gefunden. Ich wollte keine fremde Bilder verwenden, daher habe ich das Schema mit Eagle selbst gezeichnet. Es handelt sich um Software zur Erstellung von Schaltplänen und Platinen und ist auch in einer kostenlosen Version (für privatgebrauch) erhältlich. Das Program ist sehr mächtig, die Bedienung habe ich mir jedoch etwas intuitiver vorgestellt.
Bei dem Gerät handelt es sich um einen fast haargenauen Nachbau von USBasp-Adapter (http://www.fischl.de/usbasp/). Eine nützliche Erweiterung ist ein 3,3V Linear-Regler zur Stromversorgung des zu beschreibenen Microcontrollers. Als Upload-Tool kann AVRDUDE verwendet werden. Es können damit EEPROM, Firmware, Fuse und Lock Bits aus dem Mikrocontroller ausgelesen oder geschreiben werden. Windows braucht einen zusätzlichen Treiber: https://github.com/stefanbeller/USBasp/tree/master/bin/win-driver/libusb_1.2.4.0
Auf dem Board befinden sich 3 Jumperleisten, die J2 und J3 sind allerdings nicht aufgelötet. Mit J1 wird die Spannung zur Versorgung von Ziel-Microcontroller definiert (5V oder 3,3V). J2 wird benötigt, wenn Betriebssoftware (Firmware) des Programmes selbst aktualisiert werden muss. J3 erlaubt das Flashen von sehr langsam (<1,5MHz) getakteten Microcontroller. Neuere Firmwareversionen unterstützen dies jedoch in Software (-B Option in AVRDUDE), so dass dieser Jumper überflüssig wird.
Firmware aktualisieren
Der Programer funktioniert mit dem Arduino-IDE, allerdings scheint er eine veraltete Firmwareversion zu besitzen, zumindest beschwert sich AVRDUDE darüber in seinen Ausgaben.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
Man könnte die Meldung zwar ignorieren, Nachteile hatte ich bis jetzt noch nicht gemerkt. Ich möchte trotzdem eine neuere Version aufzuspielen versuchen. Im Netz habe ich eine gute Anleitung zu genau diesen Programmer gefunden. Ich werde auch ähnliche Weise vorgehen.
Wenn Sie auch nachmachen wollen, beachten Sie bitte,
dass ein Firmwareaustausch immer mit einem gewissen Risiko verbunden ist
und zu einem nicht mehr brauchbaren Gerät führen kann.
Alles was Sie tun, tun Sie auf Ihr eigenes Risiko!
Die Warnung muss sein, auch wenn ein AVR nicht so einfach zu zerflashen ist.
Zunächst muss die J2-Brücke geschlossen werden. Ich habe dafür eine kleine Pinleiste eingelötet, aber auch jede andere Form einer sicheren Verbindung wäre ok.
Dann wird noch ein weiteres Programmer benötigt. Ich habe zwar keinen mehr, aber ein Arduino-Board eignet sich sehr gut auch für diese Aufgabe. Laden Sie den "Arduino ISP"-Sketch darauf (ist unter Datei->Beispiele->Arduino ISP zu finden) und stellen Sie die Verbindung her, wie im Quelltext des Sketches angegeben. Es werden 6 Leitungen benötigt: VCC, GND, RST, SCK, MOSI und MISO. Zu beachten ist, dass ein Mega anders angeschlossen wird, als andere Arduinos wie UNO, Mini oder Nano.
ISP | Arduino Mega | Arduino UNO |
RST | 53 | 10 |
MOSI | 51 | 11 |
MISO | 50 | 12 |
SCK | 52 | 13 |
Bei mir lag gerade ein Mega arbeitslos rum ;-)
Wenn alles richtig verbunden ist (der Programmer bitte nicht ins USB-Buchse stecken!), kann zum Testen folgendes Befehl verwendet werden:
avrdude -C ../etc/avrdude.conf -c avrisp -P COM20 -b 19200 -p m8 -v
Das Befehl muss in AVRDUDE-Verzeichnis eingegeben werden. Ich habe einfach das entsprechende Verzeichniss aus Arduino-IDE verwendet.
Bitte setzen Sie den COM-Port (Parameter -P) entsprechend Ihrer Konfiguration. Wenn Ihr Programmer nicht auf Basis eines ATMega8 aufgebaut ist, müssen Sie auch noch den Prozessortyp (Parameter -p) anpassen.
War alles richtig, sollte etwas in der Art der folgenden Ausgabe erscheinen:
D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>avrdude -C ../etc/avrdude.conf -c avrisp -P COM20 -b 19200 -p m8 -v avrdude: Version 5.11, compiled on Sep 2 2011 at 19:38:36 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "../etc/avrdude.conf" Using Port : COM20 Using Programmer : avrisp Overriding Baud Rate : 19200 AVR Part : ATMEGA8 Chip Erase delay : 10000 us PAGEL : PD7 BS2 : PC2 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 4 20 128 0 no 512 4 0 9000 9000 0xff 0xff flash 33 10 64 0 yes 8192 64 128 4500 4500 0xff 0x00 lfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 lock 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : STK500 Description : Atmel AVR ISP Hardware Version: 2 Firmware Version: 1.18 Topcard : Unknown Vtarget : 0.0 V Varef : 0.0 V Oscillator : Off SCK period : 0.1 us avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.09s avrdude: Device signature = 0x1e9307 avrdude: safemode: lfuse reads as 9F avrdude: safemode: hfuse reads as D9 avrdude: safemode: lfuse reads as 9F avrdude: safemode: hfuse reads as D9 avrdude: safemode: Fuses OK avrdude done. Thank you. D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>
Als nächstes sollte man sich eine Kopie der Originalfirmware anlagen. So hat man später eine Möglichkeit den Ursprungszustand wiederherstellen, wenn die neue Version aus irgendwelchen Gründen nicht funktioniert.
avrdude -C ../etc/avrdude.conf -c avrisp -P COM20 -b 19200 -p m8 -U flash:r:usbasp_original_firmware.bin:r
So soll das aussehen:
D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>avrdude -C ../etc/avrdude.conf - c avrisp -P COM20 -b 19200 -p m8 -U flash:r:usbasp_original_firmware.bin:r avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.09s avrdude: Device signature = 0x1e9307 avrdude: reading flash memory: Reading | ################################################## | 100% 9.86s avrdude: writing output file "usbasp_original_firmware.bin" avrdude: safemode: Fuses OK avrdude done. Thank you. D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>
Die entstandene Datei hebt man sich gut auf.
Jetzt kann eine andere Firmware aufgespielt werden. Ich habe folgende benutzt: usbasp.2011-05-28.tar.gz. Im Verzeichnis \bin\firmware befinden sich drei fertig kompilierten Dateien für verschiedene Prozessor-Typen (ATMega8, ATMega48 und ATMega88). In meinem Fall ist die Datei mit dem Namen usbasp.atmega8.2011-05-28.hex die richtige. Man sollte sich nicht wundern, dass die neue Datei drei Mal so groß ist. Die vorher ausgelesene Datei wurde in binären RAW Format angelegt (wg. Parameter :r), die neue ist Hexadecimal kodiert.
avrdude -C ../etc/avrdude.conf -c avrisp -P COM20 -b 19200 -p m8 -U flash:w:usbasp.atmega8.2011-05-28.hex
Das hat bei mir auch ohne Probleme funktioniert.
D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>avrdude -C ../etc/avrdude.conf - c avrisp -P COM20 -b 19200 -p m8 -U flash:w:usbasp.atmega8.2011-05-28.hex avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.07s avrdude: Device signature = 0x1e9307 avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "usbasp.atmega8.2011-05-28.hex" avrdude: input file usbasp.atmega8.2011-05-28.hex auto detected as Intel Hex avrdude: writing flash (4700 bytes): Writing | ################################################## | 100% 9.35s avrdude: 4700 bytes of flash written avrdude: verifying flash memory against usbasp.atmega8.2011-05-28.hex: avrdude: load data flash data from input file usbasp.atmega8.2011-05-28.hex: avrdude: input file usbasp.atmega8.2011-05-28.hex auto detected as Intel Hex avrdude: input file usbasp.atmega8.2011-05-28.hex contains 4700 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 5.82s avrdude: verifying ... avrdude: 4700 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you. D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>
Jetzt fehlt nur noch ein Test des Programmers, aber vorher muss noch die J2-Brücke entfernen werden.
Testweise habe ich einen Sketch und dann wieder einen Arduino-Bootloader auf mein Nano Board geflasht. Keine Fehlermeldung mehr ;-)
Kommentare (2)
Oh, den Schaltplan habe ich auch nur in den Tiefen des Internets gefunden :)
Treiberlink und weitere Ifos sind hier zu finden: http://www.fischl.de/usbasp/
Ich verwende libusb_1.2.4.0: https://github.com/stefanbeller/USBasp/tree/master/bin/win-driver/libusb_1.2.4.0
Habe den gleichen USB ISP Programmer V2.0 aus der Bucht für lächerliche 1,50€ gekauft kommt aber erst in 2-4 Wochen.
War am rätzeln wo für (bei mir unbestückten) jumper 2 und 3 sind dank Deines Schaltplans ist dieses kleine Rätzel gelöst :-)
Welchen USB Windows treiber braucht dieser Programmer um mit avrdude kommunizieren zu können unter Linux wird er diekt vom kernel unterstützt. ?
Grüsse DJ