wemaus

Font Size

Cpanel

ISP-Shild für Arduino UNO

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.

 

ISP-Programmierer  

 

 

Hier wird das ISP-Shield zur Programmierung über die ISP-Schnittstelle an einer Stationsuhr verwendet.

     
ISP-Programmierer 100 nF  

 

Der auf der Steckleiste aufgesteckte 100 nF Kondensator ist zwischen Ground und dem Reset-Anschluss am Prozessor angeschlossen. Er verhindert, dass ein Auto-Reset durchgeführt wird.

 

 

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.

 

Fuse Bits auslesen  

 

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.