
Das Lernpaket Mikrocontroller unter Linux
von Ralf Beesner
Elektronik-Labor Projekte AVR Tiny85
Überblick
Ich
lebe seit einem Jahr Microsoft-frei (bis dahin hatte ich noch eine
selten genutzte Windows-Not-Installation), aber aus Neugier habe ich
mir trotzdem das neue Lernpakat Mikrocontroller gekauft - teils, um im
neuen Handbuch (das voll auf Bascom setzt) zu schmökern, teils, um
auszuprobieren, wie gut der low-cost USB-Seriell-Wandler CH341 unter
Linux unterstützt wird und ob Burkhards Programmiertool LPMikro85.exe
unter dem Windows-Wrapper Wine ("Wine is not an Emulator") funktioniert.
Um es kurz vorwegzunehmen:
- der USB-Seriell-Wandler wird unter Linux "out of the Box" erkannt
- LPMikro85.exe ist zwar sehr langsam, funktioniert aber
- das
Kommandozeilentool "avrdude" kann den Controller im ISP-Modus
programmieren (ist jedoch noch langsamer), unterstützt aber nicht den
MCS-Bootloader
- Bascom selbst ist unter Linux/Wine Glückssache und nervt ein wenig, wenn es denn halbwegs funktioniert
- TurboCompact, auf das sich ein Buch-Kapitel bezieht, "tut es" unter Linux/Wine schon seit längerer Zeit nicht mehr
USB-Seriell-Wandler
Linux
bringt einen Treiber für den CH341 mit; Zugriff auf Hardware hat aber
erst einmal nur der "Allmächtige" (root), solange die Hardware nicht
explizit für "Normalos" freigegeben ist. Dies geschieht, indem man (mit
root-Rechten) eine udev-Regel anlegt.
Sie besteht aus einer
kleinen Datei, die im Ordner /etc/udev/rules.d liegen muss und einen
"sprechenden" Namen erhalten sollte, damit man am Namen erkennt, wofür
sie gut ist - z.B. "97-ch341.rules". Der etwas kryptische Datei-Inhalt
SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", ATTRS{idProduct}=="7523", GROUP="users", MODE="0660"
gibt
das USB-Gerät mit der Vendor-ID 1a86 und der Product-ID 7523 für alle
Mitglieder der Gruppe "users" frei (man kann die Zugriffsrechte noch
feiner granulieren, auf einem Einzelplatz-Rechner wird das aber wohl
nicht sinnvoll sein).
Wine und LPMikro85.exe
LPMicro85.exe
kopiert man als ordentlicher Mensch in den versteckten Ordner
".wine/drive_c/Program Files" im Home-Verzeichnis, weil da auch alles
landet, was man mit wine "setup.exe" automatisch installiert. Man kann
LPmikro85.exe aber auch irgendwohin kopieren und dann dort in dem
Ordner mit "wine LPmikro85.exe" starten. Wenn LPmikro85.exe dort keine
LPMikro85.ini vorfindet, muss man erst einmal die passende
Schnittstelle im Menü "COM" auswählen.
Vorher ist jedoch noch
etwas Handarbeit nötig: dem Windowsprogramm muss ja eine
Windowsumgebung vorgegaukelt werden - sowohl softwaremäßig als auch in
Bezug auf Hardware. Im oben erwähnten Ordner .wine gibt es einen
Unterordner "dosdevices", in dem schon einige Verknüpfungen für die
Pseudo-Laufwerke liegen, z.B. C: D: Z:, und möglicherweise einige
Verknüpfungen auf fest eingebaute LPT- und COM-Schnittstellen. Die für
USB-Seriell-Wandler werden vermutlich noch fehlen.
Wie der
USB-Seriell-Wandler des LP Mikrocontroller überhaupt unter Linux heißt,
findet man mit dem Kommando "dmesg" heraus. Das muss man mit
root-Rechten aufrufen, z.B. unter den Ubuntus mit "sudo dmesg".
Dmesg
schleudert einem eine sehr lange Ausgabe entgegen; wenn man den
USB-Seriell-Wandler als letztes eingesteckt hat, steht die gesuchte
Angabe aber am Ende der Datei; z.B.
[45139.390025] usbcore: registered new interface driver ch341
[45139.390048] usbserial: USB Serial support registered for ch341-uart
[45139.390071] ch341 2-1.8.6.1.4:1.0: ch341-uart converter detected
[45139.391941] usb 2-1.8.6.1.4: ch341-uart converter now attached to ttyUSB2
Nun
wissen wir also, dass die serielle Schnittstelle /dev/ttyUSB2 heißt
(sie werden aufsteigend durchnummeriert; leider kann sich also die
Nummer ändern, wenn die USB-Seriell-Wandler in einer anderen
Reihenfolge angesteckt werden).
Für "flüchtige" USB-Devices muss
man die Verknüpfungen vermutlich erst mal anlegen. Die ganz Harten
wechseln auf der Kommandozeile in den Ordner .wine/dosdevices und geben
dort z.B. ein:
ln -s /dev/ttyUSB2 com3
Am besten legt man gleich ein paar mehr Verknüpfungen für (noch) nicht existente Devices an, also z.B.
ln -s /dev/ttyUSB3 com4
ln -s /dev/ttyACM0 com5
Dann
sind sie bereits vorhanden, wenn man mal mehrere USB-Seriell-Wandler
angeschlossen hat. Der letzte Eintrag /dev/ttyACM0 ist übrigens kein
normaler USB-Wandler, sondern ein HID-Device - einige alte
USB-Faxmodems oder auch einige Arduino-Boards weisen sich als serielles
HID-Device aus. Für HID-Devices hat Windows Standardtreiber
(HID-Devices wurden in erster Linie für Tastaturen und Mäuse
"erfunden", weil man ohne Tastatur und Maus schlecht Treiber
installieren kann).
Avrdude
Avrdude
unterstützt eine Vielzahl von mittlerweile ausgestorbenen
"Simpel-Programmiergeräten" für die parallele oder serielle
PC-Schnittstelle. Die Zuordnung der Schnittstellenleitungen zu den
AVR-Programmierports erfolgte damals recht willkürlich, denn Hard- und
zugehörige Programmiersoftware waren damals Insellösungen.
Jedoch
weisen die LP Mikrocontroller (das alte und das neue) eine Besonderheit
auf: für den ISP-Modus und den seriellen Bootloader-Modus werden die
gleichen Leitungen und die gleiche Hardware verwendet. Daher passt
keine der alten seriellen "Simpel-Lösungen", die nur den ISP-Modus
beherrschten.
Aber man kann sich einfach weitere
Simpel-Programmiergeräte selbst definieren. Normalerweise "guckt"
avrdude in die Konfigurationsdatei /etc/avrdude.conf - man kann avrdude
aber auch anweisen, eine andere Konfigurationsdatei zu verwenden.
Ich
habe daher eine Datei franzis.conf angelegt, in der nur die zwei
Programmer für die beiden Franzis-Lernpakete Microcontroller definiert
sind und nur ATtiny 13, 25, 45 und 85 eingetragen sind.
Download: 0417-franzis.conf.zip
Nun einige Beispiele. Auf den "nackten" Aufruf "avrdude" antwortet avrdude mit einer langen Liste der Optionen, die es versteht.
Mit dem Aufruf
avrdude -p t85 -c lpmc85 -C ~/franzis.conf -P /dev/ttyUSB2 -i 300
kann
man ausprobieren, ob der Programmer bzw. der Attiny85 ansprechbar ist.
Die Datei franzis.conf muss bei diesem Aufruf im Home-Verzeichnis
liegen (dieses wird durch die Tilde "~" angegeben).
Der
Parameter -i 300 ist unbedingt erforderlich - er bewirkt, dass avrdude
nur sehr langsam mit dem Programmer kommuniziert (300 µs Wartezeit
zwischen den Flankenwechseln beim BitBanging).
Mit
avrdude -p t85 -c lpmc85 -C franzis.conf -P /dev/ttyUSB2 -i 300 -U flash:w:Blink1.hex:i
flasht
man die Datei Blink1.hex in den Controller; das "i" am Ende steht für
das Intel-Hex-Format. Avrdude ist um einiges langsamer als
LPmicro85.exe, weil es auch prüft, ob der Code korrekt übertragen wurde.
Fuses brennen
Im
Lieferzustand ist der ATTiny85 auf 1 MHz Takt geflasht. Für die
Handbuch-Experimente muss man ihn erst einmal mit LPMicro85.exe auf 8
MHz Takt flashen. Man kann stattdessen auch diesen "kryptischen"
avrdude-Aufruf verwenden:
avrdude -p t85 -c lpmc85 -C franzis.conf -P /dev/ttyUSB2 -i 300 -U lfuse:w:0xe2:m -U hfuse:w:0xd6:m -U efuse:w:0xfe:m
Die
Bedeutung von lfuse,hfuse,efuse ist selbsterklärend. Das ":m"
(immediately) bewirkt, dass die Parameter direkt aus dem davor
stehenden Argument gelesen werden sollen (ansonsten würde avrdude das
Argument als Dateinamen interpretieren).
Bascom unter Wine
Die
Bascom-Installation mit "wine setupdemo.exe" dürfte problemlos
verlaufen. Danach sollte man im Terminal mit cd
"~/.wine/drive_c/Program Files/MCS Electronics/BASCOM" in den
Bascom-Programmordner wechseln und dort "wine bascavr.exe" eingeben. Je
nach Wine-Version spuckt der Aufruf nur einige Fehlermeldungen auf die
Kommandozeile aus (Wine 2.x), oder es ploppen außerdem Fenster mit
Fehlermeldungen auf, die quittiert werden wollen. Mit etwas Glück
öffnet sich nach einer Weile das Hauptfenster von Bascom.
Hat
man Glück, kann man - wie im Handbuch beschrieben - Bascom für das
Flashen mit dem MCS Bootloader konfigurieren und Bascom halbwegs wie
unter Windows benutzen. Ein störender Nebeneffekt ist jedoch, dass
Bascom unter Wine auch im Leerlauf sehr viel Prozessorlast erzeugt. Auf
meinem Vierkerner werden zwei Kerne komplett ausgelastet.
Hat
man weniger Glück, weil z.B. Wine zu alt ist, kann man einen angepasste
Linux-IDE (Geany) verwenden, die im Hintergrund zum Kompilieren das
Kommandozeilentool bascomp.exe nutzt. Das nähere Vorgehen ist unter
http://www.elektronik-labor.de/AVR/bascomp-unter-linux.htm
beschrieben.
Elektronik-Labor Projekte AVR Tiny85