ISP Adapter

Die In-System-Programmierung (ISP) ermöglicht das Programmieren eines Mikrocontrollers oder eines anderen programmierbaren Bausteins direkt im eingebauten Zustand. Dazu wird meist eine einfache serielle Verbindung wie zum Beispiel JTAG oder SPI genutzt. Der Vorteil der In-System-Programmierung ist, dass der zu programmierende Schaltkreis nicht mehr aus dem Zielsystem entfernt werden muss. Dadurch wird er mechanisch weniger belastet und der gesamte Programmiervorgang ist deutlich schneller.

Eine umfangreiche Übersicht über ISP-Adapter für AVR-Mikrocontoller findet man unter anderem auf mikrocontroller.net.


Nachdem ich es irgendwie geschafft hatte meinen original ISP-Adapter von Atmel zu zerstören, musste schnellstmöglich ein neuer Programmieradapter her. Nach einer kurzen Suche im Internet bin ich dann auf einen Schaltplan für einen Programmieradapter gestoßen, der nur aus einer handvoll Bauteilen besteht und sich in etwa 10 Minuten zusammenbauen lässt. Der Nachteil der einfachen Schaltung ist jedoch die relativ geringe Geschwindigkeit im Vergleich zu anderen Programmieradaptern, was sich vor allem beim Übertragen von großen Programmen bemerkbar macht. Da heutzutage die serielle Schnittstelle ohnehin nur noch selten an Computern oder Notebooks zu finden ist, empfehle ich deshalb eher einen Programmieradapter mit USB-Schnittstelle zu verwenden.


Schaltplan


Stückliste

Anzahl Bauteil
2 Widerstand 1,0k
2 Widerstand 4,7k
1 Widerstand 10k
1 Widerstand 12k
1 Kondensator 560p
2 Z-Diode 5,1V
1 Transistor BC547 (NPN)
1 D-SUB-Buchse 9-polig
1 Stiftleiste 5-polig
1 geschirmtes Kabel 4-polig
1 kleines Stück Platine


Bilder

Mit ein wenig Geduld passt die gesamte Schaltung sogar in das Gehäuse eines 9-poligen D-SUB Steckers.


Nachdem ich lange Zeit meine Mikrocontroller erfolgreich mit meinem selbstgebauten, seriellen Programmieradapter geflasht habe, hat sich irgendwann das Mainboard von meinem Notebook verabschiedet. Mein neues Notebook hatte natürlich keine serielle Schnittstelle mehr und deshalb musste ein neuer Programmieradapter mit USB-Schnittstelle her. Da ich ohnehin wieder Lust hatte etwas zu basteln, bestellte ich mir einfach bei Ulrich Radig den "USB AVR PROG" als Bausatz für 11,99 EUR.


Hardware


Lieferumfang des Bausatzes


fertig bestückte und gelötete Platine


Software

Nachdem die Hardware fertig aufgebaut war, musste ich zunächst wieder die nötige Software auf meinem neuen Notebook installieren.

  • USBasp Treiber 0.1.12.1
  • WinAVR 20080610
  • AVR8 Burn-O-Mat 1.4.2b

Um auch den AT90S2323 bzw. AT90S2343 mit dem USBasp programmieren zu können, sind ein paar kleine Änderungen in den Konfigurationsdateien von AVRDUDE und AVR8 Burn-O-Mat erforderlich.

Änderungen in avrdude.conf

AT90S2323 AT90S2343
STK500 Code 0x41 0x43
AVR910 Code 0x48 0x4C
AVR910 Sign 1E 91 02 1E 91 03

Änderungen in AVR8_Burn_O_Mat_Config.xml

<AVR name="2323" caption="AT90S2323">
  <Fuse name="SPIEN" bit="7" fuseByte="fuse" default="0" desc="Enable Serial Program and Data Downloading" mode="expert"/>
  <Fuse name="FSTRT" bit="6" fuseByte="fuse" default="0" desc="Select start-up time"/>
</AVR>
<AVR name="2343" caption="AT90S2343">
  <Fuse name="SPIEN" bit="7" fuseByte="fuse" default="0" desc="Enable Serial Program and Data Downloading" mode="expert"/>
  <Fuse name="RCEN"  bit="6" fuseByte="fuse" default="0" desc="Select Clock source"/>
</AVR>


Installation unter Ubuntu 10.04

1. Pakete installieren
Damit man unter Ubuntu einen AVR Mikrocontroller programmieren kann, müssen zunächst einige zusätzliche Pakete installiert werden.

sudo apt-get install gcc-avr avrdude binutils-avr avr-libc


2. USBasp Programmer
Als Nächstes muss für den USBasp Programmer noch eine neue udev-Regel erstellt werden, da man sonst nur als root-Benutzer auf den Programmer zugreifen kann. Hierzu erstellt man einfach in /etc/udev/rules.d/ eine neue Datei mit dem Namen 99-avrisp.rules und folgendem Inhalt:

# Atmel AVR ISP mkII
SYSFS{idVendor}=="03eb", SYSFS{idProduct}=="2104", GROUP="%GROUP%", MODE="0660"

# usbprog bootloader
SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c62", GROUP="%GROUP%", MODE="0660"

# USBasp programmer
SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", GROUP="%GROUP%", MODE="0660"

Hinweis: %GROUP% muss durch die entsprechende Gruppe ersetzt werden (bei Ubuntu z.B. der Benutzername)


3. AVR8 Burn-O-Mat
Als grafische Oberfläche für "avrdude" empfiehlt sich der AVR8 Burn-O-Mat. Unter Ubuntu kann einfach das auf der Webseite angebotene Debian-Paket installiert werden. Anschließend kann der "Burn-O-Mat" wie folgt konfiguriert werden:


4. Probleme mit avr-size (unrecognized option)
Leider befindet sich in den Ubuntu 10.04 Paketquellen eine ungepatchte Version von "avr-size", die keine AVR Mikrocontroller unterstützt und deswegen folgende Fehlermeldung produziert:

avr-size: unrecognized option '--mcu=atmega8'
Usage: avr-size [option(s)] [file(s)]
 Displays the sizes of sections inside binary files
 If no input file(s) are specified, a.out is assumed
 The options are:
  -A|-B     --format={sysv|berkeley}  Select output style (default is berkeley)
  -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex
  -t        --totals                  Display the total sizes (Berkeley only)
            --common                  Display total size for *COM* syms
            --target=<bfdname>        Set the binary file format
            @<file>                   Read options from <file>
  -h        --help                    Display this information
  -v        --version                 Display the program's version

avr-size: supported targets: elf32-avr elf32-little elf32-big srec symbolsrec verilog tekhex binary ihex

Glücklicherweise lässt sich das Problem jedoch leicht beheben, indem man einfach das Debian-Paket binutils-avr herunterlädt und dann per Doppelklick oder über die Kommandozeile installiert.

sudo dpkg -i binutils-avr_2.20.1-1_i386.deb

Danach muss man nur noch verhindern, dass das alte Paket beim Systemupdate wiederhergestellt wird.

echo "binutils-avr hold" | sudo dpkg --set-selections
sudo dpkg --get-selections | grep binutils-avr

Anschließend sollte "avr-size" wieder korrekt funktionieren.

AVR Memory Usage
----------------
Device: atmega8

Program:    1910 bytes (23.3% Full)
(.text + .data + .bootloader)

Data:        100 bytes (9.8% Full)
(.data + .bss + .noinit)

Quelle: http://mightyohm.com/blog/2010/08/fix-for-broken-avr-size-in-ubuntu-10-04-lucid/


Problemlösungen

Der Programmer wird nicht unter Linux erkannt

Dieses Problem tritt vor allem bei Notebooks auf. In der Ausgabe von dmesg tauchen dann folgende Meldungen auf:

usb 2-1: new low speed USB device using uhci_hcd and address 17
usb 2-1: device descriptor read/all, error 2
usb 2-1: new low speed USB device using uhci_hcd and address 18
usb 2-1: device descriptor read/all, error 2
usb 2-1: new low speed USB device using uhci_hcd and address 19
usb 2-1: device not accepting address 19, error -71
usb 2-1: new low speed USB device using uhci_hcd and address 20
usb 2-1: device descriptor read/all, error -84
hub 2-0:1.0: unable to enumerate USB device on port 1

In den meisten Fällen reicht es aus, den Programmer einfach an einen anderen USB-Port oder über ein USB-Hub anzuschließen.

Das Problem hängt mit den beiden Z-Dioden (D1 und D2) zusammen, die den Spannungspegel für die USB-Datenleitungen begrenzen bzw. anpassen sollen. Während der Mikrocontroller mit einem 5 Volt Pegel arbeitet, darf die Spannung auf den USB-Datenleitungen (D+ und D-) höchstens 3,6 Volt betragen. Durch die Anpassung des Spannungspegels kann es deshalb an einigen USB-Ports dazu kommen, dass der Programmer nicht richtig erkannt wird.


AVR8 Burn-O-Mat Paket lässt sich nicht unter Ubuntu installieren

Bei neueren Ubuntu-Versionen kann es vorkommen, dass bei der Installation über das Software-Center folgende Fehlermeldung angezeigt wird:

Es scheint ein Fehler in aptdaemon aufgetreten zu sein – der Hintergrundanwendung zum Installieren und Entfernen von Software sowie dem Durchführen anderer Paketverwaltungsprozesse.

Bei ubuntuusers.de findet man eine Anleitung, wie sich das Paket in dem Fall trotzdem installieren lässt.


AVR8 Burn-O-Mat Paket lässt sich nicht unter Ubuntu 16.04 installieren

Bei neueren Ubuntu-Versionen (> 16.04) lässt sich die Version 2.1.2 nicht installieren, da die Abhängigkeit "openjdk-7-jre" nicht erfüllt werden kann. Entweder installiert man einfach das modifizierte Paket von ubuntuusers.de oder man ändert die Abhängigkeiten in der Datei "control" selbst. Eine gute Anleitung zum Bearbeiten von deb-Paketen findet man bei unix.stackexchange.com.


Mikrocontroller antwortet nicht

Ist der Mikrocontroller noch "fabrikneu", dann ist bei den meisten AVRs standardmäßig der interne 1 MHz Oszillator aktiviert. In diesem Fall muss man den ISP-Takt reduzieren. Im Burn-O-Mat muss dazu lediglich folgende Einstellung vorgenommen werden: AVRDUDE Settings → additional options → "-B 3". Wurde anschließend der Takt des Mikrocontrollers mittels der Fuse-Bits erhöht, kann die Einstellung wieder rückgängig gemacht werden.

Wenn der Mikrocontroller nach dem Ändern des ISP-Taktes noch immer nicht antwortet, dann sind in der Regel die Fuse-Bits für die Takteinstellung schuld. In dem Fall benötigt man ggf. eine externe Taktquelle um den Mikrocontroller wieder zum Laufen zu bekommen.



10-poliger Pfostenstecker


6-polige Stiftleiste


9-poliger D-SUB Stecker

  • Last modified: 2018/02/14 19:48