# In-System-Programming (ISP)
Grundsätzlich wird ein ATMega Mikrocontroller über das In-System-Programming Interface (opens new window), kurz ISP, programmiert. Zudem dient die ISP-Schnittstelle dazu Konfiguartionsparameter ("Fuse-Bits" (opens new window)) zu setzen.
Als bevorzugter ISP-Programmer hat sich der Diamex Programmer (opens new window) etabliert. Alternativ lässt sich auch ein Arduino UNO als ISP (opens new window) verwenden oder der kostengünstige USBASP-Clone (opens new window). Allerdings lässt sich in beiden Fällen nur die Stromversorgung auf 3.3V Stellen. Die SPI-Pegel haben weiterhin 5V wodurch ein ggf. schon verbautes CC1101 Modul Schaden nehmen kann.
Die ISP-Schnittstelle des ATMega ist die SPI-Schnittstelle.
Zusätzlich gibt es die serielle UART-Schnittstelle die über einen FTDI, CH340 oder CP2102 USB-serial-converter angesprochen wird. Hierüber kann man eigentlich keine Software flashen, sondern nur die Serielle-Console aufrufen. Da viele Boards (wie der Arduino Pro-Mini) mit einem Bootloader vorkonfiguriert sind, der das Flashen von Sketches über UART ermöglicht, benötigt man keinen ISP-Programmer um die Software aufzuspielen. Dies ist für nackte Chips meist nicht der Fall, weshalb zuerst über ISP ein Bootloader geflasht werden kann (sofern man über UART später die Software aufspielen will).
- ISP: Software flashen; Fuse-Bits setzen
- UART: Serieller-Monitor; Software flashen (nur mit entsprechendem Bootloader)
# Anschluss des ISP
Die Spannung des Diamex wird über DIP-Schalter gesetzt, siehe Manual (opens new window) unter Download (1: off; 2: on).
USBasp kann sowohl 5V als auch 3.3V - ! jedoch nur am Vcc !, hier sollte zuerst der Jumper auf die richtige Spannung gesetzt werden.
WARNING
USBasp setzt per Jumper nur VCC auf 3.3V, das SPI Interface läuft weiterhin mit 5V. Es empfiehlt sich daher die Fuse-Bits zu programmieren bevor weitere Hardware oder das CC1101 an den Arduino SPI-Bus angeschlossen ist. Deshalb ist ein Diamex-Programmer einem USBasp vorzuziehen!
Der ISP ist 1:1 mit 6 Leitungen an den Pro Mini zu verbinden bzw. nach Angabe des Pin-Outs bei dem jeweiligen Projekt.
Pro Mini | ISP |
---|---|
VCC | VCC |
GND | GND |
RESET | RESET |
11 | MOSI |
12 | MISO |
13 | SCK |
Es gibt auch ISPs mit nur 6 PINS:
# avrdude
avrdude (opens new window) ist ein Commandline-Tool zur Manipulation von ROM und EEPROM der AVR-Mikrocontroller. Es ist für Windows, MacOS und Linux verfügbar und unterstützt verschiedene ISP-Programmer.
Eine Alternative bietet das schwergewichtige Atmel Studio (opens new window).
Für avrdude gibt es verschiedene GUI-Tools wie z. B. avrdudess (opens new window).
Je nach ISP und Betriebssystem sind etwaige Treiber zu installieren. USBasp benötigt einen speziellen USB-Treiber "libusb" (opens new window). Diamex Windows-Treiber sind als Download auf der Hersteller-Seite (opens new window) verfügbar
avrdude befindet sich bei installierter Arduino IDE und Boardunterstützung Arduino AVR Boards
- in Windows:
C:\Users\<Benutzer>\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14\bin\
- auf dem Mac:
~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14/bin/
- bei Linux:
~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14/bin/
- Alternativ gibt es das avrdude auch in den meisten Repos und kann als globale Binary installiert werden (
apt-get install avrdude
)
(Der Ordner 6.3.0-arduino14
kann je nach Version abweichen.)
Natürlich müssen die jeweiligen avrdude-Optionen an die verwendete Umgebung angepasst werden:
Port (
-P
)
Unter Windows wird hier ein COMxx Device verwendet, z. B.-P COM11
. Im Gerätemanager kann die Nummer nachgelesen werden.
Unter Linux oder Mac wird ein Device unter /dev/ angelegt, z. B.-P /dev/ttyACM0
oder-P /dev/ttyUSB0
, der Befehldmesg
gibt Aufschluss, nachdem der ISP am USB-Port angeschlossen wurde.ISP-Programmer (
-c
)
Für einen Diamex:-c stk500v2
Für einen USBasp:-c usbasp
Controller (
-p
)
Für den ATMega 328P:-p m328p
Weitere Parameter können dem avrdude Manual (opens new window) entnommen werden.
Zuletzt wird mit -U
die auszuführende Memory-Operation angegeben, als z. B. Fuse-Bits setzen oder HEX-File flashen. Es sind mehrere -U Argumente pro Aufruf möglich.
Allgemeiner Syntax: -U memtype:op:filename[:format]
.
WARNING
Die Parameter-Argumente dürfen keine Leerzeichen enthalten. z. B. wäre -U flash:w:C:\Users\Max Mustermann
ungültig da Leerzeichen sowie ein zusätzlicher Doppelpunkt enthalten ist.
Siehe auch:
- avrdude - Mikrocontroller.net (opens new window)
- avrdude Manual (opens new window)
- avrdudes (GUI für avrdude) (opens new window)
- Fuse Calculator (opens new window)
# Fuse-Bits setzen
Beispiel Fuse-Bits setzen: -U lfuse:w:0xE2:m -U hfuse:w:0xD2:m -U efuse:w:0xFF:m -U lock:w:0xFF:m
Memtype gibt hier die Low-/High-/Extended- und Lock-Fuses an. Der w
-Paramter steht für write, gefolgt von dem zu setzendem Wert. m
aktiviert den immediate mode und besagt, dass filename keine Datei ist, sondern der Wert direkt angegeben wurde. Nach dem setzen der Fuse-Bits können wir diese mit der verify-Operation v
überprüfen, also z. B. -U lfuse:v:0xE2:m
.
Ein vollständiger Aufruf könnte also wiefolgt aussehen:
# Fuses setzen
avrdude -p m328p -P /dev/ttyACM3 -c stk500v2 -U lfuse:w:0xE2:m -U hfuse:w:0xD2:m -U efuse:w:0xFF:m -U lock:w:0xFF:m
# Fuses prüfen
avrdude -p m328p -P /dev/ttyACM3 -c stk500v2 -U lfuse:v:0xE2:m -U hfuse:v:0xD2:m -U efuse:v:0xFF:m -U lock:v:0xFF:m
2
3
4
5
# Sketch (Bootloader) flashen
Beispiel HEX-File flashen, hier der Bootloader (opens new window) der es ermöglicht Software über die UART Schnittstelle zu flashen. Da hier eine Datei geflasht wird ist darauf zu achten, dass der avrdude-Aufruf aus dem gleichen Verzeichnis erfolgt, in dem auch die Datei liegt. Im Beispiel wird ein Diamex verwendet welcher auf /dev/ttyACM3 erkannt wurde und ein ATMega 328P.
# Schreiben des Arudino Bootloaders
avrdude -p m328p -P /dev/ttyACM3 -c stk500v2 -V -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex
# Bootloader verifizieren
avrdude -p m328p -P /dev/ttyACM3 -c stk500v2 -U flash:v:ATmegaBOOT_168_atmega328_pro_8MHz.hex
2
3
4
5
# Problembehandlung
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
- Parameter prüfen (-p, -P, -c, ...)
- Anschluss / Verkabelung überprüfen!!!
- Trennen und erneut verbinden des ISP
- Trennen und erneut verbinden der AVR Stromversorgung (sofern nicht über ISP)
- Für gewisse Programmer kann auch die Bitclock angepasst werden (z. B.
-B 10
)