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:


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