Nacht

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)

Cancel or

  • Alexander Schulz
    @Detlef Jürgen Peters
    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
  • Detlef Jürgen Peters
    Danke für die Mühe mit dem Schaltplan !
    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