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:

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 -U <memtype>:r|w|v:<filename>[:format]:

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 (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:

  1. Initialisierung des Programmierers (Sie werden dies nicht sehen, wenn es funktioniert)
  2. Initialisierung des AVR-Gerätes und Sicherstellung der Befehlsbereitschaft
  3. 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.
  4. Löschen des Chips
  5. Lesen der Datei und Verifizierung
  6. Schreiben des Flashes
  7. Ü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