# 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).

DIAMEX ISP Programmer

USBasp kann sowohl 5V als auch 3.3V - ! jedoch nur am Vcc !, hier sollte zuerst der Jumper auf die richtige Spannung gesetzt werden.

usb-asp Spannung Jumper

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

usb-asp Verdrahtung

Es gibt auch ISPs mit nur 6 PINS:

isp 6-pin

usb-asp Jumperwire

# 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 Befehl dmesg gibt Aufschluss, nachdem der ISP am USB-Port angeschlossen wurde. Gerätemanager

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

# 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
1
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
1
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)