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.
AVR ISP (seriell)
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.
AVR ISP (USB)
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.
ISP Pinbelegung
10-poliger Pfostenstecker
6-polige Stiftleiste
9-poliger D-SUB Stecker