AVR-Programmieren mit BASCOM und AVR Studio

Zum Programmieren ("Brennen", "Flashen") von AVR-Controllern über die ISP-Schnittstelle braucht man - egal wie - eine geeignete Verbindung zum PC, auf dem die Software erstellt wird. Früher ging das über eine serielle RS232- oder eine parallele Druckerschnittstelle am PC. Heutige PC kennen nur noch USB-Schnittstellen. Entsprechende Programmer USB zu ISP schaffen den Anschluss an moderne Zeiten und das mit mit einem Affentempo.

Da ich es vor einigen Jahren nicht geschafft habe, den zuerst beschafften ISP-PROG [1] an einer älteren Version von BASCOM zum Laufen zu bringen, gibt es nun einem zweiten Programmer, den USBasp [2]. Beide haben in der vorhandenen Entwicklungsumgebung eigene Vorteile.

Eine Beschreibung zur Installation des DIAMEX PROG-S, die auch sinngemäß für andere USB-Programmiergeräte gilt, ist unten im Download verfügbar. Ebenfalls im Download findet sich die Beschreibung  zu der hiervon abweichenden Installation des USBasp-Treibers.

Mal so vorab: Ist BASCOM (k)eine Programmiersprache?

"C ist eine Programmiersprache, BASCOM ist Müll" hat sich ein C-Nerd bemüßigt gesehen, in einem Forum abzusondern. Warum verwende ich BASCOM, also einen BASIC-Dialekt, und nicht ebenfalls C? Dabei habe ich auch mal als Physiker, der die Welt mit FORTRAN  zu erklären versuchte, hochnäsig auf  die BASIC-Amateure hernieder geschaut. Später dann, an der Wende zum 21-ten Jahrhundert, offenbarte Microsoft Visual Basic for Applications (VBA), hier und da aufgepeppt mit Windows API's, was man alles mit MS Office, insbesondere Access und Excel, anstellen kann. Auch mit BASIC ist einiges möglich. Diese Sprache ist relativ schnell zu lernen. Der Weg zum Erfolg gerät daher kurz und fast geradlinig. Auch als nur noch Gelegenheitsprogrammierer bin ich selbst nach längerer Abstinenz schnell wieder drin. Deshalb programmiere ich AVR mit BASCOM. Spiele halt inzwischen in der Amateurliga und fühle mich sauwohl dabei.

Um einiges schöner als BASCOM, irgendwie seelenverwandt mit Visual Basic und sogar kostenlos ist LunaAVR [6]. Wegen der größeren BASCOM-Gemeinde habe ich Überlegungen zum Umstieg dann doch fallen gelassen. Überaus rege im Web ist die Gemeinde auch noch, etwa mit dem BASCOM WIKI [7].

Kurz und gut: Für die eher übersichtlichen Aufgabenstellungen eines Funkamateurs bietet BASCOM trotz mancher Einschränkungen ausreichende Möglichkeiten. Vorteile insbesondere für Anfänger sind ganz klar mächtige Hochsprachenbefehle wie z.B. "GETADC", mit denen mit einer einzigen Zeile Code ein ganzer Schwall von Funktionen im AVR losgetreten wird. Mit der Vorauswahl des zu program-mierenden Controllers sind das auch gleich die jeweils Controller-spezifischen. Die Häme von C-Freaks ist damit gesichert. Ohne sich um die Controller-Hardware und deren Register zu scheren, geht ja gar nicht. Mit Verzicht  auf solche vorgefertigte Funktionen können jedoch Potenziale einer direkten Programmierung von AVR-Registern, somit näher an der Hardware, auch mit BASCOM erschlossen werden. Kann man, muss man aber nicht. Basisdemokratisch eben nach eigenem Gusto.

Vorbereitung, Fuse Bits setzen mit AVR Studio (Atmel Studio)

Das Brennen eines fabrikfrischen Controllers erfordert zunächst das Setzen/Ändern der Fuse Bits, u.a. um den angeschlossenen Schwingquarz zu aktivieren. PonyProg 2000 ist (war mal) ein nettes Programm zum Setzen der Fuse Bits, sofern der PC noch eine parallele oder serielle Schnittstelle hat und solange man mit älteren AVR-Baureihen arbeitet. RS232 - USB-Wandler funktionieren hier nicht. Den neulich eingesetzten ATmega1284P kennt PonyProg nicht mehr. AVR Studio [3] (bei mir noch in der Version 4.18) ist da besser geeignet. AVR Studio wurde inzwischen umbenannt in Atmel Studio. Der ISP-PROG funktioniert hier bestens, der USBasp mit der Version 4.18 von AVR Studio nicht.

Es geht aber auch einfacher, und das mit dem USBASP ohne einen zweiten Brenner wie den ISP-Prog: mit dem kostenlosen Khazama AVR Programmer [10]. Eine Kurzbeschreibung zum Setzen der Fuse & Lock Bits ist im Download zu finden.

Ein recht universelles Brennprogramm, das auch kostenlos zu haben ist und ohne Installation auskommt, ist das myARV Prog Tool V1.41 [11]. Beide o.g. Programmer funktionieren damit, der ISP-Prog mit der Einstellung "AVR ISP mk-II" direkt auf der Hardware-Übersicht, der USBASP ist in einer schier endlosen Liste weiterer Programmer unter "Sonstige" wählbar.

Wie das Fuse Bits setzen mit BASCOM geht, etwas gewöhnungsbedürftig, aber immerhin, ist im Download beschrieben.

AVR Studio select programmer

Abb. 1: Auswahl des Programmers und der COM-Schnittstelle in AVR Studio.

In AVR Studio muss zunächst der verwendete Programmer, hier der ISP-PROG, festgelegt werden. Als Protokoll ist STK500 zu wählen. Die USB-Schnittstelle zum ISP-PROG liegt bei mir auf COM4. Die COM-Schnittstelle ist im Gerätemanager von Windows festzustellen, siehe Beschreibung unten im Download. Wenn dort z.B. COM6 zugewiesen ist, AVR Studio aber nur bis COM4 zählt, wählt man dort "Auto".

Mit Klick auf Connect wird die Verbindung über USB an COM4 zum Programmer ISP-PROG hergestellt, weiter dann über ISP zum AVR Controller. Wenn der Connect geklappt hat, erscheint nachfolgendes Fenster. Wenn nicht, bleibt das obige Fenster stehen mit dem Hinweis "...failed".

Was tun bei "...failed"? Das kann an den Verbindungen (USB- und ISP-Kabel) liegen, am falschen COM-Port, am falschen Protokoll im Feld "Platform" oder an einem defekten oder zerschossenen AVR oder auch nur am ausgeschalteten Controller-Board. Solch ein Fall war einmal an einem zerschossenen AVR zu klären. Dabei reichte es nicht, nach Behebung eines möglichen Fehlers ein erneutes Connect zu versuchen. Was schließlich half, war den PC herunterzufahren und wieder neu zu starten. Möglicherweise wurden damit die COM-Schnittstellen neu initialisiert. Die Computerei ist manchmal eine unergründliche Welt der Wunder...

Wenn sich also AVR Studio auf dem PC und der über USB am Progger hängende AVR gefunden haben, erscheint dieses Fenster:

AVR Studio Device detection

Abb. 2: Auslesen der Microcontroller-Signatur.

Der AT mega1284P wurde über die ISP-Schnittstelle auf dem Controller-Board richtig erkannt (nach Klick auf Read Signature).

Halt! Dieser Screenshot wurde von einem ATmega1284P gemacht, bei dem die Fuses bereits gesetzt waren. Fabrikfrische AVR sind auf den internen 1 MHz-RC-Taktoszillator eingestellt. Mit der in AVR Studio gesetzten ISP-Frequenz 460,8 kHz kommt ein jungfräulicher AVR nicht zurecht. Die ISP-Frequenz darf maximal 1/4 der Taktfrequenz betragen. Vorerst muss daher die ISP-Frequenz auf ein erträgliches Maß unterhalb 250 kHz eingestellt werden:

Einstellen der ISP-Frequenz

Abb. 3: Setzen der ISP-Taktfrequenz vor dem erstmaligen Brennen des Microcontrollers.

  1. Klick auf "Settings"
  2. Im Fenster Target Settings 115,2 kHz (< 250 kHz) auswählen
  3. Mit Klick auf "Write" wird diese Einstellung übernommen.

Damit sollte nun "Read Signature" im Main-Register funktionieren. Nachdem wie nachfolgend beschrieben der externe Crystal Oscillator (Quarz an XTAL1 und XTAL2) aktiviert ist, kann die ISP-Frequenz wieder höher bis auf 1/4 der Quarzfrequenz gesetzt werden.

Nachdem das geklärt ist, geht es endlich an die Fuse Bits.

AVR Studio fuse bits

Abb. 4: Setzen der Fuse-Bits, hier ATmega1284P.

So wurden die Fuse Bits des ATmega1284P eingestellt. Die Fuse Bits unterscheiden sich je nach Controller. Andere Brennprogramme sind eventuell nicht so vornehm ausgestattet und erwarten die hex-Werte für die Fuses. Diese sind im mittleren Teil von Abb. 4 zu sehen, hier also hex DF und hex EF für das high und low Fuse-Byte.

  • Der Burn out detection level (BODLEVEL) kann auf eine minimale Versorgungsspannung eingestellt werden, unterhalb der der AVR seinen Dienst verweigert statt Unsinn zu machen.
  • SPIEN (Serial program interface enabled) aktiviert die ISP-Programmierschnittstelle. Finger weg! Ist in AVR Studio zum Glück nicht aktiviert. Wurde die ISP-Schnittstelle einmal ausgeknipst, kann der Controller nicht mehr über ISP programmiert werden.
  • Mit BOOTSZ (Boot loader size) wird die Größe des Bereiches festgelegt, der für den Bootloader am oberen Ende des Flash-Speichers reserviert wird, falls ein solcher eingesetzt wird. Wenn nicht, kann man BOOTSZ wie hier auf den minimalen Wert setzen.
  • Mit SUT CKSEL werden die Controller-Taktquelle (CKSEL, je nach Controller mehrere Bits, z.B. 4 Bits CKSEL0...3), hier externer Quarz > 8 MHz, und die Wartezeit (Start up time) nach einem Reset (SUT = 2 Bits SUT0, 1), hier 16k Takte + 4,1 msec, eingestellt. Dazu bietet AVR Studio eine Menge Einstellungen zur Auswahl an. "External Crystal" ist z.B. ein an XTAL1 und XTAL2 angeschlossener Quarz, "External Clock" ist ein an XTAL1 angeschlossener freischwingender Taktgenerator (XTAL2 bleibt dann unbeschaltet).

Mit Klick auf Program werden die vorgenommenen Einstellungen über ISP an den Controller geschickt. Das Übertragungsprotokoll ist unten im Fenster (...OK!) zu sehen. Zu Fuse Bits siehe z.B. [4]. Damit ist der Controller vorbereitet. Die Fuse Bits können natürlich auch nachträglich nach dem Brennen eines Programms geändert werden, z.B. wenn wegen eines stehen gebliebenen JTAGEN (JTAG enabled, ist standardmäßig bei den entspr. Controllern gesetzt) einige Ports, z.B. PortC im ATmega16/32, nicht wie erwartet funktionieren.

Die Fuse Bit-Einstellungen aller Programme auf dieser Website sind im Quellcode angegeben. Sie unterscheiden sich bei den vorgestellten Controllern und Anwendungen nicht oder nur kaum von den in Abb. 4 gezeigten. Unter [8] gibt es einen richtig netten Fuse Calculator.

Vorsicht! Man sollte wissen, was man mit dem Aktivieren und Deaktivieren der Fuses anstellt, siehe z.B. [4].  Also noch einmal alles überprüfen, bevor man auf Program klickt.
Nebenbei bemerkt, sollte jemand die Fuse Bits direkt, z.B. mit AVRDUDE (s.u.) programmieren wollen: Ein Fuse Bit ist mit dem Wert = 0 programmiert (Haken in AVR Studio oder z.B. in PonyProg).
Wert = 1 heißt nicht programmiert - verkehrte Welt.

Programmieren/Brennen mit AVR Studio

Das Programmieren ("Brennen")  des Controllers mit einem .hex-File ist nur noch einen Klick weit entfernt. Oben im Reiter von AVR Studio "Program".

AVR Studio Program

Abb. 5: Programmieren (Brennen) des Microcontrollers mit AVR Studio.

  1. Das Input .hex-File im Computer suchen
  2. Mit Klick auf Program wird der Controller mit dem .hex-File programmiert ("gebrannt"). Mit dem Haken oben an "Verify device after programming" wird das gebrannte Controllerprogramm mit dem Input .hex-File verglichen - sicher ist sicher. Das Brennprotokoll ist unten im Fenster zu sehen (...OK!).

Im Reiter "Auto" geht es noch etwas vornehmer. Da kann man alle denkbaren Optionen einzeln anhaken, nachdem im Fenster Abb. 5 das Input .hex-File gewählt wurde.

Mit AVR Studio lassen sich also mit einer ansprechenden Benutzeroberfläche die Fuse Bits setzen und ein vorhandenes .hex-File brennen.

Programmieren/Brennen mit BASCOM

Für diejenigen, die mit BASCOM-AVR programmieren, ist der Umweg über AVR Studio zum Brennen überflüssig. Das kann BASCOM auch.

Nicht besonders schön, aber mit dem USBasp-Programmer auch für weniger gebräuchliche AVR-Controller, die z.B. der o.a. Khazama AVR Programmer nicht beherrscht, kann BASCOM auch Fuses setzen. Da mehrere OMs danach gefragt haben, ist eine Beschreibung im Download abgelegt.

Das Übertragen der kompilierten .hex-Files in den AVR kann auch mit dem o.g. ISP-PROG über USB vorgenommen werden. Dazu müssen in Bascom unter "Options-Programmer" wieder das STK500-Protokoll im Feld "Programmer" und die Daten der USB-Schnittstelle (COM-Port und Baudrate entsprechend den Einstellungen im Windows-Gerätemanager) angegeben werden. Wenn oben als "Programmer" STK500 ausgewählt wird, erscheint unten automatisch die vollständige Pfadangabe von STK500.exe (C:\Programme\Atmel\...). Voraussetzung ist ein installiertes AVR Studio, das das Programm STK500.exe mitbringt. Wenn nicht, kann es mit dem Windows-Dateisuchen-Dialog lokalisiert werden, gelbes Icon rechts im Feld).

BASCOM ISP-PROG Programmer

Abb. 6: Programmieren (Brennen) des Microcontrollers in BASCOM mit STK500.exe .

Die Programmierung eines AVR-Chips geht richtig flott vor sich, angezeigt in einer kleinen DOS-Box. Die verschwindet allerdings sofort nach Beendigung. Das ist mir dann doch etwas zu flott.

Mit dem zweiten USB-Programmer – USBasp [2] kann man mit Hilfe von AVRDUDE [5] die Steuerung selbst in die Hand nehmen.

BASCOM Programmer USBasp

Abb. 7: Programmieren (Brennen) des Microcontrollers in BASCOM mit AVRDUDE .

Einbindung des USBasp als Programmer in Bascom.

Als "Program" wählt man ein mit dem Windows-Editor selbst erstelltes Batchfile (.bat) aus. Das kann so aussehen:

cls
echo off
@SET Filename="ATU_CONTROLLER_200g.hex"
@SET Device=m1284p
@SET Programmer=usbasp
@SET DudePath="C:\PROGRAMME\AVRDUDE511\avrdude.exe"
%Dudepath% -p %Device% -c %Programmer% -u  -U flash:w:%Filename%
pause
exit 

Erinnert das jemand an alte MS DOS-Zeiten? Anzupassende Eintragungen:

  • SET Filename: Name der zu ladenden .hex-Datei
  • SET Device:  Microcontroller, hier ATmega1284P
  • SET Programmer: Verwendeter Programmer, hier USBasp
  • SET DudePath: Speicherort von avrdude.exe
    darunter AVRDUDE-Kommandozeile

"DudePath" ist hier das Standard-Installationsverzeichnis unter Windows XP.  Windows 7 etwa installiert ARVDUDE in einem anderen Verzeichnis.

Mit dem im obigen BASCOM-Fenster als "Program" mit vollständigem Pfad angegebenen Batchfile wird das zu ladende .hex-File im gleichen Verzeichnis erwartet.

Das Batchfile zeigt auch wieder in einer DOS-Box den Fortschritt an, bleibt aber wegen des vorletzten Statements "pause" stehen. So kann man das Ergebnis erst einmal beäugen, bevor man es mit einem Tastendruck wegklickt. Es könnte ja auch mal was schief gegangen sein.

Zum Ändern das Batch-File auf keinen Fall im Explorer doppelt klicken!
Im Windows-Explorer: Rechtsklick, dann im Kontextmenü: Bearbeiten. Der Editor öffnet das File.
Nach der Anpassung den Editor oben rechts am "X" schließen, Speichern "Ja".
Viele Betriebssysteme, Mail-Server und MS Outlook reagieren allergisch auf .bat-Files. Mit Umbenennen in ".txt" vor der Versenden lässt sich das umgehen.

AVRDUDE kann wesentlich mehr als das hier gezeigte Rüberschieben des .hex in den Controller. Auch Fuse Bits können damit direkt gesetzt werden. Da sollte man aber wissen, was man tut.
Erklärung der Parameter in [5], "... avrdude-doc-5.11.pdf".

Eine Beschreibung zu Installation und Nutzung des USBasp unter BASCOM ist im Donwload zu finden. Treiber für den Diamex ISP-Prog können von [1], drittes Zitat, für den USBASP von [2] heruntergeladen werden, auch für Windows 7 und 10 (64bit) tauglich. Eine ausführliche Diskussion zum Einsatz verschiedener Programmer unter Windows 10 ist in [9] zu finden.

Referenzen

[1]    http://stores.ebay.de/stange-distribution-Shop
        http://www.diamex.de/dxshop/DIAMEX-USB-ISP-Programmer-Stick-fuer-AVR
        http://forum.diamex.de/content.php?26-programmierger%E4te
[2]   http://www.fischl.de/usbasp/
        http://www.protostack.com/blog/2011/05/usbasp-driver-for-windows-7-and-w...
[3]   Übersicht in http://www.mikrocontroller.net/articles/Atmel_Studio
[4]   http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/fusebit_tutorial
        http://mcpg.augusta.de/kmodule/k-cpu-modul/kcpuF.html
[5]   http://www.mikrocontroller.net/articles/AVRDUDE
       unten mit Link auf das 2011 aktuelle AVRDUDE 5.11
       direkter Link: http://www.mikrocontroller.net/attachment/123564/AVRDUDE_5.11.1.zip
       Beschreibung: http://mirrors.fe.up.pt/pub/nongnu/avrdude/avrdude-doc-5.11.pdf
       AVRDUDE-Site: http://savannah.nongnu.org/projects/avrdude/
[6]  http://avr.myluna.de/doku.php
[7]  http://bascom-forum.de/mediawiki/index.php/Hauptseite
[8]  http://www.engbedded.com/fusecalc/
[9]  http://www.mikrocontroller-elektronik.de/isp-programmer-fuer-arduino-bas...
[10] http://khazama.com/project/programmer/
[11] http://shop.myavr.de/index.php?sp=download.sp.php&akt_kategorie=4

 

 

Einordung: