ATtiny firmware I/O met AVRdude
In dit voorbeeld laten we zien hoe je de code (firmware) vanaf een ATtiny kan halen (als backup) en op een andere ATtiny microcontroller kan zetten met behulp van AVRdude.
Hoe werkt het eigenlijk?
De C++ code die je programmeert in de Arduino IDE wordt bij het uploaden van de code naar de ATtiny (via Arduino) omgezet naar Assembler (via avr-gcc) en daarna omgezet naar een HEX bestand en dan geupload (via avrdude) naar de Attiny (via Arduino).
Meer informatie hierover is te vinden hier.
Je kan dus ook de code via AVRdude van de arduino afhalen en naar een (HEX) bestand wegschrijven.
Wat heb je nodig?
1) AVRdude
2) Arduino als ISP (hardware)
ATtiny aansluiten
Sluit de ATtiny aan volgens onderstaand schema:
Pinout:
Arduino pin: | ATtiny pin: |
---|---|
D10 | Pin 1 |
D11 | Pin 5 |
D12 | Pin 6 |
D13 | Pin 7 |
GND | Pin 4 (GND) |
+5v | Pin 8 (+5v) |
De Arduino programmeren als ISP
Voordat je de ATtiny kan programmeren moet je eerst de Arduino programmeren als ISP voor de ATtiny, het script daarvan is bijgeleverd bij de Arduino IDE software en is te vinden onder “voorbeelden” > “ArduinoISP”
Schrijf deze code naar de Arduino, je Arduino is nu klaar voor gebruik om de ATtiny te programmeren.
Firmware van de ATtiny afhalen:
In dit voorbeeld maken we gebruik van avrdude.exe die in de volgende folder staat:
[ARDUINO IDE]\hardware\tools\avr\bin
Voordat je avrdude kan gebruiken kopieer het bestand avrdude.conf naar bovenstaande folder, deze is te vinden in de folder:
[ARDUINO IDE]\hardware\tools\avr\etc
Voorbeeld van een ATtiny13 op COM poort 6:
avrdude.exe -v -c stk500v1 -p ATtiny13 -P COM6 -b 19200 -U flash:r:blink.hex:i
Toelichting:
-v = uitgebreide informatie.
-c = selecteer programmer.
-b = selecteer baudrate.
-P = connectiepoort COM* (Linux: ttyACM* of ttyUSB*)
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "avrdude.conf" Using Port : COM6 Using Programmer : stk500v1 Overriding Baud Rate : 19200 AVR Part : ATtiny13 Chip Erase delay : 4000 us PAGEL : P00 BS2 : P00 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 Max W ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- --- -- --------- eeprom 65 5 4 0 no 64 4 0 4000 4000 0xff 0xff flash 65 6 32 0 yes 1024 32 32 4500 4500 0xff 0xff signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 Programmer Type : STK500 Description : Atmel STK500 Version 1.x firmware 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.05s avrdude: Device signature = 0x1e9007 avrdude: safemode: lfuse reads as 6A avrdude: safemode: hfuse reads as FF avrdude: reading flash memory: Reading | ################################################## | 100% 1.60s avrdude: writing output file "blink.hex" avrdude: safemode: lfuse reads as 6A avrdude: safemode: hfuse reads as FF avrdude: safemode: Fuses OK (H:FF, E:FF, L:6A) avrdude done. Thank you. |
Dat was het, er is nu een bestandje blink.hex aangemaakt met daarin de firmware van de chip:
1 2 3 4 5 6 7 8 9 10 11 12 |
:2000000009C016C015C024C013C012C011C010C00FC00EC011241FBECFE9CDBF20E0A0E6C9 :20002000B0E001C01D92A436B207E1F793D096C0E7CF61E084E04CC061E084E067D088EEE3 :2000400093E02BD060E084E061D088EE93E025C01F920F920FB60F9211248F939F93AF930C :20006000BF938091600090916100A0916200B09163000196A11DB11D8093600090936100EA :20008000A0936200B0936300BF91AF919F918F910F900FBE0F901F901895009741F0EBE249 :2000A000F1E03197F1F700C000000197F6CF089583B7816083BF8FB583608FBD89B7826013 :2000C00089BF12BE789417B886B1826886B90895863080F497B321E030E0082E01C0220F83 :2000E0000A94EAF7611104C02095292327BB0895922B97BB0895009719F48FB58F7704C06D :20010000019719F48FB58F7D8FBD08951F93CF93DF931F92CDB7DD27182F8630B0F48230EF :2001200020F490E06983E7DF698188B321E030E0012E01C0220F0A94EAF7611104C02095C8 :20014000282328BB02C0822B88BB0F90DF91CF911F910895ADDF6DDF6FDFFECFF894FFCFB6 :00000001FF |
1 2 3 4 5 6 7 8 9 10 11 12 |
:2000000009C016C015C024C013C012C011C010C00FC00EC011241FBECFE9CDBF20E0A0E6C9 :20002000B0E001C01D92A436B207E1F793D096C0E7CF61E084E04CC061E084E067D084E6EF :2000400090E02BD060E084E061D084E690E025C01F920F920FB60F9211248F939F93AF931E :20006000BF938091600090916100A0916200B09163000196A11DB11D8093600090936100EA :20008000A0936200B0936300BF91AF919F918F910F900FBE0F901F901895009741F0EBE249 :2000A000F1E03197F1F700C000000197F6CF089583B7816083BF8FB583608FBD89B7826013 :2000C00089BF12BE789417B886B1826886B90895863080F497B321E030E0082E01C0220F83 :2000E0000A94EAF7611104C02095292327BB0895922B97BB0895009719F48FB58F7704C06D :20010000019719F48FB58F7D8FBD08951F93CF93DF931F92CDB7DD27182F8630B0F48230EF :2001200020F490E06983E7DF698188B321E030E0012E01C0220F0A94EAF7611104C02095C8 :20014000282328BB02C0822B88BB0F90DF91CF911F910895ADDF6DDF6FDFFECFF894FFCFB6 :00000001FF |
Firmware naar de ATtiny schrijven:
Voorbeeld van een ATtiny13 op COM poort 6:
avrdude.exe -v -c stk500v1 -p ATtiny13 -P COM6 -b 19200 -U flash:w:blink.hex:i
Toelichting:
-v = uitgebreide informatie
-c = selecteer programmer.
-b = selecteer baudrate.
-P = connectiepoort COM* (Linux: ttyACM* of ttyUSB*)
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "f:\ArduinoIDE\hardware\tools\avr\bin \avrdude.conf" Using Port : COM6 Using Programmer : stk500v1 Overriding Baud Rate : 19200 AVR Part : ATtiny13 Chip Erase delay : 4000 us PAGEL : P00 BS2 : P00 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 Max W ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- --- -- --------- eeprom 65 5 4 0 no 64 4 0 4000 4000 0xff 0xff flash 65 6 32 0 yes 1024 32 32 4500 4500 0xff 0xff signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 Programmer Type : STK500 Description : Atmel STK500 Version 1.x firmware 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.05s avrdude: Device signature = 0x1e9007 avrdude: safemode: lfuse reads as 6A avrdude: safemode: hfuse reads as FF avrdude: NOTE: "flash" memory has been specified, an erase cycle will be perform ed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "blink.hex" avrdude: writing flash (352 bytes): Writing | ################################################## | 100% 0.90s avrdude: 352 bytes of flash written avrdude: verifying flash memory against blink.hex: avrdude: load data flash data from input file blink.hex: avrdude: input file blink.hex contains 352 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.55s avrdude: verifying ... avrdude: 352 bytes of flash verified avrdude: safemode: lfuse reads as 6A avrdude: safemode: hfuse reads as FF avrdude: safemode: Fuses OK (H:FF, E:FF, L:6A) avrdude done. Thank you. |
Nu staat het “blink” programma er weer op!
Voor de ATtiny13 moet je de juiste baudrate opgeven -b 19200 , anders werkt het niet!, hier volgt een samenvatting (voorbeelden):
Linux
Arduino Attiny (hardware version 3 / firmware version 3.3):
FIRMWARE > BESTAND:
sudo avrdude -v -c stk500v1 -p ATtiny13 -P /dev/ttyACM0 -b 19200 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:
sudo avrdude -v -c stk500v1 -p ATtiny13 -P /dev/ttyACM0 -b 19200 -U flash:w:/var/arduino/blink.hex
Windows
FIRMWARE > BESTAND:
avrdude.exe -v -c stk500v1 -p ATtiny13 -P COM6 -b 19200 -U flash:r:blink.hex:i
BESTAND > FIRMWARE:
avrdude.exe -v -c stk500v1 -p ATtiny13 -P COM6 -b 19200 -U flash:w:blink.hex
Bestandsgrootte
ATtiny13 HEX bestandsgrootte: 860 bytes.