avrdude getting startet mittels USBtiny ISP Fuse-Bits lesen / schreiben und .hex Dateien Flashen
Zur Vorbereitung für das Auslesen werden folgende Geräte und Software benötigt:
Geräte:
- USB Tiny ISP (Programmiergerät)
- Adapter vom Programmierer zum Mikrocontroller z.B. unser Test Clip Adapter
- Der zu programmierende Mikrocontroller z.B. ATtiny13A-PU
Software:
Zuerst muss WinAVR von sourceforge heruntergeladen und installiert werden. Im Anschluss sollte noch der Treiber für das USB Tiny ISP Programmiergerät installiert und dieses über den USB-Anschluss mit dem PC verbunden werden. Im Anschluss wird es im Gerätemanager wie folgt aufgeführt:
Nun kann über “Start” die Eingabeaufforderung aufrufen werden:
Über die Eingabe von avrdude werden die Optionen und Funktionen wie folgt angezeigt:
Optionen des avrdude
- -p <partno>: Hiermit wird festgelegt welchen Mikrocontroller programmiert werden soll. Wenn Sie z.B. einen ATtiny2313 programmieren, verwenden Sie attiny2313 als Teilenummer.
- -b <baudrate>: Hiermit wird die serielle Baudrate für Programmierer wie den STK500 übergeben. Verändern Sie diesen Schalter nicht, die Standardeinstellung ist korrekt.
- -B<bitrate>: Hiermit wird die Bitrate geändert, d.h. wie schnell der Programmierer mit dem Chip kommuniziert. Wenn Ihr Chip sehr niedrig getaktet ist, muss auch die Übertragung langsam sein.
- -C <config-file>: Die Konfigurationsdatei informiert avrdude über die verschiedenen Möglichkeiten, mit dem Programmierer zu sprechen. Es existiert eine Standardkonfigurationsdatei, welche ohne weitere Konfiguration verwendet wird.
- -c <programmer>: Hier geben wir den Programmierertyp an, wenn Sie einen STK500 verwenden, verwenden Sie stk500, wenn Sie einen DT006-Programmierer verwenden, verwenden Sie dt006, etc.
- -D: Hierdurch wird das Löschen des Chips vor dem Programmieren deaktiviert.
- -P <port>: Dies ist der Kommunikationsport, über den man mit dem Programmierer interagieren kann. Mögliche Einstellungen sind: COM1, LPT1, USB …
- -F: Dies übersteuert die Signaturprüfung, um sicherzustellen, dass der Chip, von dem Sie glauben, dass Sie ihn programmieren, auch wirklich derjenige ist. Der Test wird dringend empfohlen, da er die Verbindung testet, also verwenden Sie diesen Befehl nicht.
- -e: Dies löscht den Chip, im Allgemeinen verwenden wir diesen nicht, da wir den Flash vor der Programmierung automatisch löschen.
- -U <memtype>:r|w|v:<filename>[:format]: OK, das ist der wichtige Befehl. Über diesen Befehl wird der Mikrocontroller programmiert. Der <memtype> ist entweder Flash oder EEPROM (oder hfuse, lfuse oder efuse für die Chip-Konfigurationssicherungen). das r|w|v bedeutet, dass Sie r (lesen) w (schreiben) oder v (überprüfen) als Befehl verwenden können. Der <Dateiname> ist, naja, die Datei, in die Sie schreiben oder aus der Sie lesen wollen. und [:format] bedeutet, dass es ein optionales Format-Flag gibt. Wir werden immer das “Intel Hex”-Format verwenden, also benutzen Sie iAlso, zum Beispiel. Wenn Sie die Datei test.hex in den Flash-Speicher schreiben wollten, würden Sie -U flash:w:test.hex:i verwenden. Wollte man den EEPROM-Speicher in die Datei “eedump.hex” einlesen, so würde man -U eeprom:r:eedump.hex:i verwenden.
- -n: Das bedeutet, dass man eigentlich nichts schreibt, es ist gut, wenn man sicherstellen will, dass man keine anderen Befehle sendet, die den Chip beschädigen könnten, sozusagen eine Art ‘Schreibsperre’.
- -V: Hiermit wird die automatische Überprüfung beim Schreiben abgeschaltet.
- -u: Wenn Sie die Fuse-bits modifizieren wollen.
- -t: Dies ist ein Terminal-Modus, in dem Sie Befehle nacheinander eingeben können.
- -E: Hier sind einige Programmierer-Spezifikationen aufgelistet.
- -v: Damit erhalten Sie die Ausgabe’verbose’….falls Sie etwas debuggen wollen.
- -q: Reduzierte Ausgabe im Terminal.
Hier verwendete Optionen sind rot markiert.
Unterstützte Programmiergeräte
Um eine Liste der unterstützten Programmierer zu erhalten, geben Sie avrdude -c abc ein (abc führt zur Ausgabe der Liste aller unterstützter Programmiergeräte).
C:\>avrdude -c abc
avrdude: Can't find programmer id "abc" Valid programmers are: c2n232i = serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts dasa3 = serial port banging, reset=!dtr sck=rts mosi=txd miso=cts dasa = serial port banging, reset=rts sck=dtr mosi=txd miso=cts siprog = Lancos SI-Prog <http://www.lancos.com/siprogsch.html> ponyser = design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts 89isp = Atmel at89isp cable frank-stk200 = Frank STK200 blaster = Altera ByteBlaster ere-isp-avr = ERE ISP-AVR <http://www.ere.co.th/download/sch050713.pdf> atisp = AT-ISP V1.1 programming cable for AVR-SDK1 from <http://micro-research.co.th/> dapa = Direct AVR Parallel Access cable xil = Xilinx JTAG cable futurlec = Futurlec.com programming cable. abcmini = ABCmini Board, aka Dick Smith HOTCHIP picoweb = Picoweb Programming Cable, http://www.picoweb.net/ sp12 = Steve Bolt's Programmer alf = Nightshade ALF-PgmAVR, http://nightshade.homeip.net/ bascom = Bascom SAMPLE programming cable dt006 = Dontronics DT006 pony-stk200 = Pony Prog STK200 stk200 = STK200 bsd = Brian Dean's Programmer, http://www.bsdhome.com/avrdude/ pavr = Jason Kyle's pAVR Serial Programmer dragon_pdi = Atmel AVR Dragon in PDI mode dragon_dw = Atmel AVR Dragon in debugWire mode dragon_hvsp = Atmel AVR Dragon in HVSP mode dragon_pp = Atmel AVR Dragon in PP mode dragon_isp = Atmel AVR Dragon in ISP mode dragon_jtag = Atmel AVR Dragon in JTAG mode jtag2pdi = Atmel JTAG ICE mkII PDI mode jtag2avr32 = Atmel JTAG ICE mkII im AVR32 mode jtagmkII_avr32 = Atmel JTAG ICE mkII im AVR32 mode jtag2dw = Atmel JTAG ICE mkII in debugWire mode jtag2isp = Atmel JTAG ICE mkII in ISP mode jtag2 = Atmel JTAG ICE mkII jtag2fast = Atmel JTAG ICE mkII jtag2slow = Atmel JTAG ICE mkII jtagmkII = Atmel JTAG ICE mkII jtag1slow = Atmel JTAG ICE (mkI) jtag1 = Atmel JTAG ICE (mkI) jtagmkI = Atmel JTAG ICE (mkI) avr911 = Atmel AppNote AVR911 AVROSP avr109 = Atmel AppNote AVR109 Boot Loader butterfly = Atmel Butterfly Development Board usbtiny = USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/ usbasp = USBasp, http://www.fischl.de/usbasp/ avr910 = Atmel Low Cost Serial Programmer stk600hvsp = Atmel STK600 in high-voltage serial programming mode stk600pp = Atmel STK600 in parallel programming mode stk600 = Atmel STK600 stk500hvsp = Atmel STK500 V2 in high-voltage serial programming mode stk500pp = Atmel STK500 V2 in parallel programming mode stk500v2 = Atmel STK500 Version 2.x firmware mib510 = Crossbow MIB510 programming board stk500v1 = Atmel STK500 Version 1.x firmware stk500 = Atmel STK500 buspirate = The Bus Pirate avrisp2 = Atmel AVR ISP mkII avrispmkII = Atmel AVR ISP mkII avrispv2 = Atmel AVR ISP V2 avrisp = Atmel AVR ISP arduino = Arduino
Unterstützte Mikrocontroller
Um eine Liste der von avrdude unterstützten Mikrocontroller zu erhalten, tippen Sie avrdude -c avrisp in die Befehlszeile ein.
C:\>avrdude -c avrisp
avrdude: No AVR part has been specified, use "-p Part" Valid parts are: t10 = ATtiny10 t8 = ATtiny9 t5 = ATtiny5 t4 = ATtiny4 ucr2 = 32UC3A0512 x128a4 = ATXMEGA128A4 x64a4 = ATXMEGA64A4 x32a4 = ATXMEGA32A4 x16a4 = ATXMEGA16A4 x256a3b = ATXMEGA256A3B x256a3 = ATXMEGA256A3 x192a3 = ATXMEGA192A3 x128a3 = ATXMEGA128A3 x64a3 = ATXMEGA64A3 x256a1 = ATXMEGA256A1 x192a1 = ATXMEGA192A1 x128a1d = ATXMEGA128A1REVD x128a1 = ATXMEGA128A1 x64a1 = ATXMEGA64A1 m6450 = ATMEGA6450 m3250 = ATMEGA3250 m645 = ATMEGA645 m325 = ATMEGA325 usb82 = AT90USB82 usb162 = AT90USB162 usb1287 = AT90USB1287 usb1286 = AT90USB1286 usb647 = AT90USB647 usb646 = AT90USB646 m32u4 = ATmega32U4 t84 = ATtiny84 t44 = ATtiny44 t24 = ATtiny24 m128rfa1 = ATMEGA128RFA1 m2561 = ATMEGA2561 m2560 = ATMEGA2560 m1281 = ATMEGA1281 m1280 = ATMEGA1280 m640 = ATMEGA640 t85 = ATtiny85 t45 = ATtiny45 t25 = ATtiny25 pwm3b = AT90PWM3B pwm2b = AT90PWM2B pwm3 = AT90PWM3 pwm2 = AT90PWM2 t2313 = ATtiny2313 m328p = ATMEGA328P t88 = attiny88 m168 = ATMEGA168 m88 = ATMEGA88 m48 = ATMEGA48 t861 = ATTINY861 t461 = ATTINY461 t261 = ATTINY261 t26 = ATTINY26 m8535 = ATMEGA8535 m8515 = ATMEGA8515 m8 = ATMEGA8 m161 = ATMEGA161 m32 = ATMEGA32 m6490 = ATMEGA6490 m649 = ATMEGA649 m3290p = ATMEGA3290P m3290 = ATMEGA3290 m329p = ATMEGA329P m329 = ATMEGA329 m169 = ATMEGA169 m163 = ATMEGA163 m162 = ATMEGA162 m1284p = ATMEGA1284P m644p = ATMEGA644P m644 = ATMEGA644 m324p = ATMEGA324P m164p = ATMEGA164P m16 = ATMEGA16 c32 = AT90CAN32 c64 = AT90CAN64 c128 = AT90CAN128 m128 = ATMEGA128 m64 = ATMEGA64 m103 = ATMEGA103 8535 = AT90S8535 8515 = AT90S8515 4434 = AT90S4434 4433 = AT90S4433 2343 = AT90S2343 2333 = AT90S2333 2313 = AT90S2313 4414 = AT90S4414 1200 = AT90S1200 t15 = ATtiny15 t13 = ATtiny13 t12 = ATtiny12 t11 = ATtiny11
Bei dem in der Anleitung verwendeten Chip handelt es sich um einen ATtiny45 mit dem Code t45.
Port festlegen -P <port>
Dieser Befehl teilt avrdude mit, über welche Schnittstelle der Programmieradapter an den PC angeschlossen ist. Wenn Sie ein USB-Gerät verwenden, können Sie einfach -P usb verwenden oder es weglassen. Der Programmierer erkennt automatisch, wenn der Programmierer ein USB-Gerät ist.
Anderenfalls kann der verwendete COM-Port im Gerätemanager abgefragt werden:
Flash Prozessinformationen festlegen
Hier wird, avrdude mitgeteilt, wie und welche Daten auf den Chip geflasht oder von ihm gelesen werden sollen.
<memtype> – kann flash, eeprom, hfuse (hohe Fusebits), lfuse (niedrige Fusebits) oder efuse (erweiterte Fusebits) sein.
r|w|v – kann als r (lesen), w (schreiben), v (überprüfen) belegt werden.
<filename> – Als Eingabe für (Schreiben oder Verifizieren) oder Ausgabedatei für (Lesen).
[:format] – optional, das Format der Datei. Sie können dies zum Schreiben weglassen, aber zum Lesen verwenden Sie i für Intel Hex (der vorherrschende Standard).
Beispielhafte Kombinationen:
- Um eine Datei namens firmware.hex in den Flash zu schreiben, verwenden Sie den Befehl: -U flash:w:firmware.hex
- Um eine Datei namens data.eep aus dem EEPROM zu verifizieren, benutzen Sie den Befehl -U eeprom:v:data.eep
- Um die Low-Fusebits in eine Datei einzulesen, verwenden Sie den Befehl -U lfuse:r:lfusefile.hex:i
Die Kombination der Optionen zu einem ausführbaren Befehl
In diesem Beispiel ein attiny45 verwenden, das beispiel kann aber für jeden anderen Chip aus der Liste leicht angepasst werden. Vergewissern Sie sich, dass der Mikrocontroller mit Strom versorgt ist, entweder durch Batterien oder einen Netzstecker oder durch den Programmieradapter.
In diesem Beispiel wird der USBtiny ISP USB-Programmierer verwendet, der Befehl -P <port> kann somit weglassen werden.
avrdude -c usbtiny -p t45 -U flash:w:test.hex
avrdude sollte dann die folgenden Schritte durchlaufen:
- Initialisierung des Programmierers (Sie werden dies nicht sehen, wenn es funktioniert)
- Initialisierung des AVR-Gerätes und Sicherstellung der Befehlsbereitschaft
- Lesen der Gerätesignatur (0x1e910a), die bestätigt, dass der Chip, den Sie in der Kommandozeile (attiny2313) angegeben haben, tatsächlich der Chip ist, mit dem der Programmierer verbunden ist.
- Löschen des Chips
- Lesen der Datei und Verifizierung
- Schreiben des Flashes
- Überprüfen des Flashes
Die Geräte-Signatur lässt sich anhand folgender Tabelle überprüfen:
1E5106=AT89S51 1E5206=AT89S52 1E9001=AT90S1200 1E9004=ATtiny11 1E9005=ATtiny12 1E9006=ATtiny15 1E9007=ATtiny13 1E9101=AT90S2313 1E9102=AT90S2323 1E9103=AT90S2343 1E9106=ATtiny22 1E9107=ATtiny28 1E9108=ATtiny25 1E9109=ATtiny26 1E910A=ATtiny2313 1E910B=ATtiny24 1E910C=ATtiny261 1E9181=AT86RF401 1E9201=AT90S4414 1E9203=AT90S4433 1E9205=ATmega48 1E9206=ATtiny45 1E9207=ATtiny44 1E9208=ATtiny461 1E920A=ATmega48P 1E9301=AT90S8515 1E9301=AT90S8515comp 1E9303=AT90S4434 1E9303=AT90S8535 1E9303=AT90S8535comp 1E9306=ATmega8515 1E9307=ATmega8 1E9308=ATmega8535 1E930A=ATmega88 1E930B=ATtiny85 1E930C=ATtiny84 1E930D=ATtiny861 1E930F=ATmega88P 1E9381=AT90PWM2 1E9381=AT90PWM3 1E9383=AT90PWM2B 1E9383=AT90PWM3B 1E9401=ATmega161 1E9401=ATmega161comp 1E9402=ATmega163 1E9403=ATmega16 1E9404=ATmega162 1E9405=ATmega169 1E9405=ATmega169P 1E9406=ATmega168 1E9407=ATmega165 1E9407=ATmega165P 1E940A=ATmega164P 1E940B=ATmega168P 1E9482=AT90USB162 1E9501=ATmega323 1E9502=ATmega32 1E9503=ATmega329 1E9503=ATmega329P 1E9504=ATmega3290 1E9504=ATmega3290P 1E9505=ATmega325 1E9505=ATmega325P 1E9506=ATmega3250 1E9506=ATmega3250P 1E9507=ATmega406 1E9508=ATmega324P 1E9581=AT90CAN32 1E9602=ATmega64 1E9603=ATmega649 1E9604=ATmega6490 1E9605=ATmega645 1E9606=ATmega6450 1E9608=ATmega640 1E9609=ATmega644 1E960A=ATmega644P 1E9681=AT90CAN64 1E9682=AT90USB646 1E9682=AT90USB647 1E9701=ATmega103 1E9701=ATmega103comp 1E9702=ATmega128 1E9703=ATmega1280 1E9704=ATmega1281 1E9781=AT90CAN128 1E9782=AT90USB1286 1E9782=AT90USB1287 1E9801=ATmega2560 1E9802=ATmega2561
Das setzen der Fuse-Bits
Fuse-Bits belegen einen separater Teil des Flash-Speichers, der nicht beschrieben wird, wenn Sie die Firmware auf den Mikrocontroller geschrieben wird. Stattdessen werden die 3 Fuse-Bytes in der Regel nur einmal gesetzt (obwohl sie beliebig oft gesetzt werden können). In den Fuse-Bits Dinge wie Taktrate, Quarztyp, ob JTAG aktiviert ist, wie hoch die minimale Spannung ist, usw. festgelegt. Ein Tool zur Berechnung der Fuse-Bytes finden Sie hier. Es wird in Kombination immer das Datenblatt des jeweiligen Mikrocontrollers benötigt.
Über den Befehl:
avrdude -c usbtiny -p t45 -v
werden Detaillierte Informationen zum Mikrocontroller ausgegeben unter anderem auch die Fuse-Bytes:
Für den ATtiny45 ergeben sich folgende Fuse-Belegungen aus dem Datenblatt:
Für die Brown-Out Erkennung ergeben sich dabei folgende Belegungen:
Um die Fuse-Bytes zu programmieren werden folgende Befehlszeilen benötigt:
avrdude -c usbtiny -p t45 -U lfuse:w:<0xHH>:m avrdude -c usbtiny -p t45 -U hfuse:w:<0xHH>:m avrdude -c usbtiny -p t45 -U efuse:w:<0xHH>:m
Dabei ist <0xHH> der gewünschte Fuse-Wert, in hexadezimaler Darstellung. Zum Beispiel, um die High-Fuse auf 0xDE zu setzen:
avrdude -c usbtiny -p t45 -U hfuse:w:0xDE:m
Dies würde die Brown Out-Grenze für den ATtiny auf 1,8 V legen.
Wenn man die Fuse-Bytes falsch einstellt, kann man den Chip unbrauchbar machen – z.B. kann man die zukünftige Programmierung deaktivieren oder den Chip so einstellen, dass er einen externen Oszillator erwartet, es jedoch keinen gibt. Es ist zu raten Werte vor dem setzen dreifach zu überprüfen.
Die Fuse-Bytes müssen nicht mit jedem Programmflashvorgang neu gesetzt werden!
Fuse-Bytes für gängige Arduinoboards
Arduino Uno
Low Fuse | 0xFF |
High Fuse | 0xDE |
Extended Fuse | 0x05 |
Arduino Duemilanove or Nano w/ ATmega328
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0x05 |
Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
Low Fuse | 0xFF |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino Mega 2560
Low Fuse | 0xFF |
High Fuse | 0xD8 |
Extended Fuse | 0xFD |
Arduino Mega (ATmega1280)
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0xF5 |
Arduino Mini
Low Fuse | 0xFF |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino Fio
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0x05 |
Arduino BT w/ ATmega328
Low Fuse | 0xFF |
High Fuse | 0xD8 |
Extended Fuse | 0x05 |
Arduino BT w/ ATmega168
Low Fuse | 0xFF |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
LilyPad Arduino w/ ATmega328
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0x05 |
LilyPad Arduino w/ ATmega168
Low Fuse | 0xE2 |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0x05 |
Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
Low Fuse | 0xFF |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
Low Fuse | 0xFF |
High Fuse | 0xDA |
Extended Fuse | 0x05 |
Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
Low Fuse | 0xC6 |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino NG or older w/ ATmega168
Low Fuse | 0xFF |
High Fuse | 0xDD |
Extended Fuse | 0x00 |
Arduino NG or older w/ ATmega8
Low Fuse | 0xDF |
High Fuse | 0xCA |
Noch keine Kommentare.