ISP-Shield für Arduino UNO
- Details
- Zugriffe: 7574
Das ISP-Shield 2.0 für den Arduino UNO ermöglicht die Programmierung von AVR-Prozessoren, wie den ATmega168/ATmega328 über den ISP-Adapter oder aber auch direkt in der auf dem Shield vorhandenen 28-poligen Textoolfassung. Dabei lässt sich nicht nur die Software flashen, sondern auch der entsprechende Bootloader kann gebrannt werden.
Das Shield wird dabei von einem Arduino UNO gesteuert, auf dem sich die Programmiersoftware (ArduinoISP) befindet, die sich einfach von der Arduino-IDE über das serielle USB-Kabel hochladen lässt.
Arduino as ISP
Zur Verwendung des Shield müssen der Zielprozessor, die Schnittstelle und der Programmer richtig eingestellt werden. Als Programmiertool wird hier "Arduino as ISP" eingestellt. Verbunden wird das Zielsystem über die ISP-Schnittstelle durch ein 6-poliges Kabel. Ein 100 nF Kondensator zwischen GND und Reset verhindert den Auto-Reset auf dem Arduino-UNO Board.
Hinweis: Die Fehlermeldung "not in sync: resp=0x15" weist auf die Auto-Reset Problematik hin.
Fuse Bits auslesen
Auch die Fuse Bits lassen sich aus den AVR-Prozessoren auslesen. Dies soll am Beispiel des ATmega328p gezeigt werden, der sich im Textoolsockel des ISP-Shields befindet.
Allerdings kann hierzu die Arduino-IDE nicht direkt verwendet werden, sonder avrdude muss über die Konsole aufgerufen werden. Dies soll am Beispiel von OS X dargestellt werden. Auf anderen Betriebssystemen (Windows, Linux) wird in ähnlicher Weise verfahren.
OS X versteckt avrdude innerhalb der App der Arduino-IDE. Daher muss man hier den korrekten Pfad erst extrahieren um avrdude anwenden zu können. Im Finder kann die IDE geöffnet werden und der aktuelle Pfad herausgelesen werden. Alternativ kann der Pfad auch dem Konsolenfenster der Arduino-IDE entnommen werden, dazu muss jedoch in den Einstellungen die "Ausführliche Ausgabe" für das Hochladen aktiviert sein.
Aus einem ATmega328p werden die Fuse Bits mit avrdude ausgelesen. |
Die Kommandozeile für das Auslesen der Fuse Bits sieht folgendermaßen aus:
/Pfad_zur_App/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Pfad_zur_App/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -cavrisp -p atmega328p -P /dev/cu.usbmodem1411 -b 19200 -U lfuse:r:-:i -v |
Danach antwortet avrdude mit folgender Ausgabe in der Konsole:
avrdude: Version 6.0.1, compiled on Apr 14 2015 at 16:30:25 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "/Users/wmauser/Desktop/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf" User configuration file is "/Users/wmauser/.avrduderc" User configuration file does not exist or is not a regular file, skipping Using Port : /dev/cu.usbmodem1411 Using Programmer : avrisp Overriding Baud Rate : 19200 AVR Part : ATmega328P Chip Erase delay : 9000 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 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff 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 efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 1 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.05s avrdude: Device signature = 0x1e950f avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as DE avrdude: safemode: efuse reads as 5 avrdude: reading lfuse memory: Reading | ################################################## | 100% 0.02s avrdude: writing output file "<stdout>" :01000000FF00 :00000001FF avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as DE avrdude: safemode: efuse reads as 5 avrdude: safemode: Fuses OK (H:05, E:DE, L:FF) avrdude done. Thank you. |
Oben, in den letzten Zeilen können nun die Fuse Bits gelesen werden.
Fuse Bits schreiben
Diesmal sollen die Fuse Bits in einen ATtiny84 geschrieben werden. Hierzu ist lediglich der Eintrag für den Prozessor (-p attiny84) und die drei Fuse Bits (-U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m) zu ändern.
Die Kommandozeile zum Schreiben der Fuse Bits sieht dann folgendermaßen aus:
/Pfad_zur_App/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Pfad_zur_App/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -cavrisp -p attiny84 -P /dev/cu.usbmodem1411 -b 19200 -U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m -v |
Danach antwortet avrdude mit folgender Ausgabe in der Konsole:
avrdude: Version 6.0.1, compiled on Apr 14 2015 at 16:30:25 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "/Users/wmauser/Desktop/Arduino_1_6_5.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf" User configuration file is "/Users/wmauser/.avrduderc" User configuration file does not exist or is not a regular file, skipping Using Port : /dev/cu.usbmodem1411 Using Programmer : avrisp Overriding Baud Rate : 19200 AVR Part : ATtiny84 Chip Erase delay : 4500 us PAGEL : P00 BS2 : P00 RESET disposition : possible i/o 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 65 6 4 0 no 512 4 0 4000 4500 0xff 0xff flash 65 6 32 0 yes 8192 64 128 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 9000 9000 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 calibration 0 0 0 0 no 1 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.05s avrdude: Device signature = 0x1e930c avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as DF avrdude: safemode: efuse reads as FF avrdude: reading input file "0xff" avrdude: writing lfuse (1 bytes): Writing | ################################################## | 100% 0.02s avrdude: 1 bytes of lfuse written avrdude: verifying lfuse memory against 0xff: avrdude: load data lfuse data from input file 0xff: avrdude: input file 0xff contains 1 bytes avrdude: reading on-chip lfuse data: Reading | ################################################## | 100% 0.02s avrdude: verifying ... avrdude: 1 bytes of lfuse verified avrdude: reading input file "0xdf" avrdude: writing hfuse (1 bytes): Writing | ################################################## | 100% 0.02s avrdude: 1 bytes of hfuse written avrdude: verifying hfuse memory against 0xdf: avrdude: load data hfuse data from input file 0xdf: avrdude: input file 0xdf contains 1 bytes avrdude: reading on-chip hfuse data: Reading | ################################################## | 100% 0.02s avrdude: verifying ... avrdude: 1 bytes of hfuse verified avrdude: reading input file "0xff" avrdude: writing efuse (1 bytes): Writing | ################################################## | 100% 0.02s avrdude: 1 bytes of efuse written avrdude: verifying efuse memory against 0xff: avrdude: load data efuse data from input file 0xff: avrdude: input file 0xff contains 1 bytes avrdude: reading on-chip efuse data: Reading | ################################################## | 100% 0.02s avrdude: verifying ... avrdude: 1 bytes of efuse verified avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as DF avrdude: safemode: efuse reads as FF avrdude: safemode: Fuses OK (H:FF, E:DF, L:FF) avrdude done. Thank you. |
In der drittletzten Zeile kann die korrekte Ausführung wieder überprüft werden.