AVR-Programmierung

AVR-Foto Viele Einsteiger fragen sich: "Wie bekommt man eigentlich die Software in den Mikrocontroller hinein?" Auf dieser Seite möchte ich zeigen, dass das gar nicht so schwierig ist und hierfür auch keine speziellen Kenntnisse erforderlich sind. Mit einem preiswerten USB-Programmiergerät sowie der kostenlosen Software myAVR ProgTool können die AVR Mikrocontroller aller Projekte dieser Seite programmiert werden. Am Beispiel des Projektes Wohnraumuhr wird demonstriert, wie die Hard- und Software unter Windows richtig konfiguriert und bedient wird.

Symbol Status
Statusaktiv
Letzte Bearbeitung02.01.2013
Symbol Downloads und Links
Stückliste mit den Bauteilen für das Adapterkabel auf 5-poligen ISP
Bezugsquelle für das USB-Programmiergerät mySmartUSB light shop.myavr.de/index.php?sp=article.sp.php&artID=200006
Treiber für das USB-Programmiergerät mySmartUSB light shop.myavr.de/index.php?sp=download.sp.php&suchwort=dl46
Konfigurationsprogramm mySmartUSB light - SupportBox shop.myavr.de/index.php?sp=download.sp.php&suchwort=dl197
Programmier-Software myAVR ProgTool shop.myavr.de/index.php?sp=download.sp.php&suchwort=dl112
Symbol Inhaltsverzeichnis
AllgemeinesAllgemeine Informationen über die Programmierung von Mikrocontrollern
HardwareInstallation des Programmiergerätes mySmartUSB light
SoftwareInstallation und Konfiguration der Software mySmartUSB light - SupportBox und myAVR ProgTool
Andere ProgrammiergeräteWeitere Programmiergeräte und Programmieradapter für AVR-Mikrocontroller
Symbol Allgemeines

Der Begriff Programmieren wird im Zusammenhang mit Mikrocontrollern für 2 verschiedene Dinge verwendet, was oft zu Missverständnissen führt. Zum einen beschreibt dieser Begriff die Tätigkeit, ein Programm für einen Mikrocontroller zu entwickeln und zum anderen beschreibt er den Vorgang, ein fertig entwickeltes Programm in den Speicher eines Mikrocontrollers zu übertragen. Auf dieser Seite soll es um letzteres gehen, d.h. ich möchte am Beispiel eines Projektes zeigen, wie man ein Programm in den Mikrocontroller überträgt und das Projekt damit zum Leben erweckt. Hierfür sind übrigens keine speziellen Kenntnisse über Mikrocontroller und Programmiersprachen erforderlich.

Bis auf eine Ausnahme werden in meinen Projekten Mikrocontroller aus der AVR-Produktreihe der Firma Atmel verwendet. Ein großer Vorteil dieser Controller ist, dass sie über eine relativ einfache Schnittstelle programmiert werden können. Diese besteht aus 4 Leitungen (und einer Masseleitung), über die ein Programm seriell in den Speicher des Mikrocontrollers übertragen werden kann. Der Controller kann bei dieser Prozedur in der Schaltung verbleiben und muss nicht ausgebaut werden. Hier hat sich der Begriff ISP (In System Programming) durchgesetzt und alle Projekte auf meiner Seite können über diese ISP-Schnittstelle programmiert werden. ISP bietet aber noch mehr: Es können neben dem Programm auch Daten (z.B. mit Voreinstellungen) im Controller abgelegt werden und es besteht die Möglichkeit, den Controller über so genannte Fuse-Bits zu konfigurieren.

Folgende Begriffe werden im Zusammenhang mit der Programmierung immer wieder auftauchen, deshalb möchte ich sie kurz erläutern:

BegriffBeschreibung
FlashMit Flash wird der Speicher im Mikrocontroller bezeichnet, in dem das Programm abgelegt wird. Wird der Controller eingeschaltet, dann beginnt er mit dem Lesen des Flash-Speichers bei Adresse 0 und interpretiert diese Informationen als Befehle. Der Flash-Speicher muss also in jedem Fall programmiert werden, damit der Controller überhaupt arbeiten kann. Zu jedem Mikrocontroller-Projekt gehört eine Datei projektname.hex - diese enthält immer das Programm für den Flash-Speicher des Controllers. Dieser Speicher kann übrigens nur komplett gelöscht und neu beschrieben werden, die Änderung einzelner Bytes ist nicht möglich.
EEPROMDieser Speicher ist dafür gedacht, Daten aller Art aufzubewahren (z.B. Einstellungen oder vom Benutzer eingegebene Daten). Bei einigen älteren Projekten ist es erforderlich, Daten in das EEPROM zu programmieren. Dies erkennt man daran, dass dem Projekt eine Datei projektname.eep beiliegt. Fehlt diese Datei, dann braucht man sich nicht um das EEPROM zu kümmern.
Fuse-BitsÜber diese Bits werden grundsätzliche Funktionen des Controllers eingestellt: Taktquelle, Start-Bedingungen, Debug-Funktionen, Bootloader, Speicherschutz und anderes. Die Fuse-Bits können leider nicht als Datei in den Controller geladen werden. Sie müssen zunächst in einer Eingabe-Maske gesetzt und anschließend an den Controller gesendet werden. Bei allen Projekten dieser Seite zeigt ein Bild die richtigen Einstellungen, außerdem befindet sich eine Datei projektname-fusebits.gif im Download-Paket jedes Projektes.

Alle in der Tabelle beschriebenen Elemente haben übrigens die Eigenschaft, dass der programmierte Inhalt dauerhaft gespeichert wird, also auch bei Abschaltung der Stromversorgung erhalten bleibt. Außerdem ist jederzeit eine Neuprogrammierung möglich.

Symbol Hardware

Ich beschäftige mich inzwischen seit vielen Jahren mit AVR-Mikrocontrollern und in dieser Zeit habe ich verschiedene Programmiergeräte oder Programmieradapter benutzt und getestet. Lange Zeit war ein einfacher, selbst gebauter Adapter für die parallele oder serielle Schnittstelle mein Favorit. Aber die Technik entwickelt sich weiter und der USB-Anschluss hat inzwischen die parallelen und seriellen Anschlüsse (LPT und COM) am PC komplett verdrängt. Aus diesem Grund ist es heute sinnvoll, ein Programmiergerät mit USB-Anschluss zu verwenden.

Programmiergerät Gute Erfahrungen habe ich mit dem Programmiergerät mySmartUSB light gemacht. Dieses kann man bei shop.myavr.de/index.php?sp=article.sp.php&artID=200006 zum Preis von 15,95€ bestellen (Stand 12/2012). Neben dem abgebildeten Programmiergerät bekommt man noch ein 6-poliges Programmierkabel und eine gedruckte Anleitung mit Hinweisen zur Treiber-Installation und weiteren Informationen.

Auf der eben genannten Seite befindet sich auch ein Link zum Treiber-Download (shop.myavr.de/index.php?sp=download.sp.php&suchwort=dl46). Wichtig: Nach dem Download muss zunächst der Treiber installiert werden und erst dann darf man das Programmiergerät an den PC anschließen. Die Treiber-Installation kann einige Minuten in Anspruch nehmen und erfolgt in mehreren Schritten, dabei ist immer mal ein Mausklick zur Fortsetzung erforderlich. Wenn das geschafft ist, kann das Programmiergerät angeschlossen werden und ist dann nach kurzer Zeit betriebsbereit. Am Programmiergerät muss dann in der Nähe des USB-Anschlusses eine blaue LED aufleuchten, wahrscheinlich leuchtet außerdem noch die LED 5V auf. Nach der Installation muss in der Systemsteuerung (Geräte-Manager) bei den Anschlüssen ein Silicon Labs CP210x USB to UART Bridge (COMxx) hinzugekommen sein. Wichtig für die weitere Arbeit ist der in Klammern stehende COM-Port und deshalb sollte dieser notiert werden.

Im Prinzip ist das Programmiergerät damit einsatzbereit. Über das beiliegende Kabel, welches dem 6-poligen ISP-Standard von Atmel entspricht, kann man das Programmiergerät mit dem ISP-Anschluss eines Projektes verbinden. Leider haben nur wenige meiner Projekte einen passenden ISP-Anschluss und das hat folgenden Grund: Als ich mit der AVR-Programmierung anfing, benutzte ich einen selbst gebauten Programmier-Adapter und wählte ein eigenes System für den Steckverbinder und die Anschlussbelegung. Bei meinem System kommen einreihige IC-Sockelleisten zum Einsatz, die man ineinander stecken und somit sowohl als Buchse auf der Platine als auch als Stecker für das Programmierkabel verwenden kann. Hier muss also noch ein Adapter-Kabel gebaut werden.

Adapterkabel Schaltung

Die nebenstehende Schaltung zeigt, wie das Adapter-Kabel verdrahtet werden muss. Mit einem Stück 5-poligen Flachbandkabel werden ein 6-poliger Wannenstecker und eine 5-polige IC-Sockelleiste verbunden. In den Wannenstecker wird später das Kabel eingesteckt, welches dem Programmiergerät beiliegt und der 5-polige Stecker kommt später in das entsprechende Gegenstück am Projekt. Der Anschluss VCC bleibt hier ungenutzt. Diese Stückliste enthält die benötigten Bauteile.

Adapterkabel Bild 1

So sieht das Adapter-Kabel in der Realität aus. Bei einem Stück Flachbandkabel werden an beiden Enden die Adern getrennt und abisoliert. Anschließend wird der Wannenstecker und die IC-Sockelleiste angelötet. Bei der Sockelleiste muss man sehr vorsichtig löten, sonst können sich die Plastikteile verformen. Falls man farbiges Flachbandkabel so wie im Bild verwendet, dann sollte man eine markante Farbe für die Masseleitung wählen (hier schwarz). Beim üblichen grauen Flachbandkabel wählt man die rote Ader als Masseleitung.

Adapterkabel Bild 2

Damit die Kabel an den Lötstellen nicht abbrechen, habe ich die kritischen Stellen mit reichlich Zweikomponentenkleber gesichert. Die Klebestelle am 5-poligen ISP-Stecker ermöglicht außerdem ein gutes Greifen beim Einstecken und Lösen der Verbindung. Übrigens: Die Länge des Adapter-Kabels sollte 10cm nicht überschreiten. Muss eine größere Entfernung zwischen PC und Projekt überwunden werden, dann sollte man ein USB-Verlängerungskabel zwischen PC und Programmiergerät stecken.

Ich habe mir übrigens fest vorgenommen, in künftigen Projekten nur noch den 6-poligen Standard-Anschluss von Atmel zu verwenden.

Symbol Software

Für die Arbeit mit dem mySmartUSB light sind mindestens 2 Programme erforderlich:

  1. mySmartUSB light - SupportBox - Dieses Programm wird benötigt, um das Programmiergerät zu konfigurieren.
  2. myAVR ProgTool - Mit diesem Programm kann die Programmierung durchgeführt werden.

Im folgenden Abschnitt werden die beiden Programme noch etwas ausführlicher beschrieben. Wer nicht nur Mikrocontroller-Schaltungen nachbauen, sondern auch modifizieren oder komplett neu entwickeln möchte, dem empfehle ich die Installation des Atmel Studio, welches mittlerweile in Version 6 vorliegt (Stand 12/2012). Dieses enthält auch ein Programmiermodul, welches über die Einstellung STK500 mit dem mySmartUSB light zusammenarbeiten kann.

Übrigens, in früheren Versionen dieses Textes hatte ich das AVR Studio 4 anstatt des myAVR ProgTool empfohlen. Inzwischen sehe ich das etwas anders, denn das AVR Studio 4 ist nicht mehr aktuell und nachfolgende Versionen sind so groß geworden (über 1GB), dass es nicht wirklich sinnvoll ist, diese nur für die Programmierungs-Funktion zu installieren.

SymbolmySmartUSB light - SupportBox

Nach dem Download der mySmartUSB light - SupportBox wird das ZIP-Archiv entpackt und der Inhalt in ein beliebiges Verzeichnis kopiert. Eine Installation ist nicht erforderlich, das Programm kann direkt gestartet werden.

SupportBox

Das Programm findet normalerweise automatisch den richtigen COM-Port und das angeschlossene Programmiergerät und zeigt dies im oberen Auswahlfeld an. Den COM-Port sollte man sich notieren, denn der wird später beim myAVR ProgTool wieder benötigt.

Im großen Feld darunter wird zunächst eine Info-Seite angezeigt. Nach dem Klick auf die Seite Konfiguration erscheint das nebenstehende Bild, wobei im Auslieferungszustand die Option Stromversorgung beim Brennen auf aktiv gesetzt ist.

Über die Einstellung Versorgungsspannung wird der Programmieranschluss auf die Spannung des angeschlossenen Projektes eingestellt. Diese Einstellung hat nicht nur Einfluss auf die Ausgangsspannung zur Versorgung des Projektes, sondern auch auf die Logikpegel der Programmierleitungen. Diese Einstellung muss unbedingt beachtet werden, auch wenn das angeschlossene Projekt nicht vom Programmiergerät versorgt wird. Bis auf wenige Ausnahmen (z.B. den Akku-Alarm für Modell-Helikopter) arbeiten alle Projekte auf meiner Seite mit 5V. Beim erwähnten Projekt Akku-Alarm sind 3V einzustellen.

Die Einstellung Stromversorgung beim Brennen legt fest, ob das Programmiergerät das angeschlossene Projekt während des Programmiervorgangs mit Strom versorgen soll oder nicht. Alle Projekte auf meiner Seite haben eine eigene Stromversorgung und sind nicht für eine Versorgung über das Programmiergerät geeignet. Aus diesem Grund empfehle ich die Einstellung inaktiv wie im nebenstehenden Bild zu verwenden.

Über die beiden Buttons Power On und Power Off lässt sich die Versorgungsspannung zu Testzwecken ein- und ausschalten. Diese Funktion wird hier nicht benötigt.

Über die Seite Firmware lässt sich die Firmware des Programmiergerätes updaten oder durch eine alternative Firmware ersetzen. Ich verwende ausschließlich die STK500-Firmware, die bereits vorinstalliert ist. Gegebenenfalls sollte man diese noch auf den aktuellen Stand bringen.

Die Einstellung der Versorgungsspannung und der Stromversorgung beim Brennen wird übrigens im Programmiergerät gespeichert.

SymbolmyAVR ProgTool

Nach dem Download des myAVR ProgTool wird das ZIP-Archiv entpackt und der Inhalt in ein beliebiges Verzeichnis kopiert. Eine Installation ist auch bei diesem Programm nicht erforderlich, es kann direkt gestartet werden.

ProgTool - Erster Start Nach dem Start präsentiert sich das myAVR ProgTool so wie im nebenstehenden Bild. Hier ist auch schon die Seite Brennen aktiviert, über die später der Programmiervorgang gesteuert wird.

Zunächst müssen noch einige Grundeinstellungen durchgeführt werden. Dafür ist es erforderlich, auf die Seite Hardware zu wechseln.

Jetzt ist übrigens auch ein guter Zeitpunkt, das Programmiergerät und auch den zu programmierenden Mikrocontroller anzuschließen. Ich empfehle dabei folgendes Vorgehen:

  1. Herstellen der Verbindung zwischen dem mySmartUSB light und dem zu programmierenden Mikrocontroller
  2. Anschließen des mySmartUSB light an den PC
  3. Einschalten der Stromversorgung des Mikrocontrollers

Für die nachfolgende Beschreibung habe ich die Wohnraumuhr als Beispiel ausgesucht. Wir verbinden also das 6-polige Kabel des mySmartUSB light mit dem ISP-Anschluss der Wohnraumuhr und stecken dann das mySmartUSB light an einen USB-Port des PCs. Anschließend wird die Wohnraumuhr eingeschaltet.

ProgTool - Hardware-Test

Auf der Seite Hardware erscheinen alle Programmiergeräte, die vom myAVR ProgTool unterstützt werden. Oben rechts ist auch das mySmartUSB light im Angebot und hier setzen wir den Punkt. In meinem Fall verwendet das Programmiergerät COM6 und auch das wird noch angepasst. Ein Klick auf das Fragezeichen neben dem COM-Port startet einen Test und wenn wir alles richtig gemacht haben, erscheint ein Info-Fenster wie im nebenstehenden Bild.

Hier wurde das mySmartUSB light erkannt und auch die aktuellen Einstellungen sind zu sehen. Es ist sogar möglich, die Einstellungen zu ändern, denn alle blauen Felder können angeklickt werden. Interessant ist hier der letzte Eintrag - es wurde nämlich auch der angeschlossene Mikrocontroller erkannt. Ein Klick auf das Feld ATmega8535 übernimmt diesen Controller-Typ und trägt ihn in die entsprechende Auswahlbox ein (siehe nächstes Bild).

Wichtig: Wenn hier ein Fehler auftritt, dann sollte man nicht versuchen, einen Programmiervorgang zu starten. Es muss zuerst der Fehler beseitigen werden - also nochmals alle Verbindungen prüfen und auch kontrollieren, ob die Stromversorgung des Controllers in Ordnung ist.

ProgTool - Controller-Einstellung

Hier ist noch einmal der untere Bereich der Seite Hardware zu sehen und die Auswahl des ATmega8535 wurde übernommen. Selbstverständlich kann man hier den Controller auch manuell auswählen.

Damit sind alle Vorbereitungen abgeschlossen und die eigentliche Programmierung kann beginnen. Für unser Beispiel benötigen wir jetzt die aktuelle Software der Wohnraumuhr. Hier gibt es (abhängig von der Hardware) 4 Versionen, ich entscheide mich einfach mal für die Standard-Version. In diesem Zip-Archiv sind folgende Dateien enthalten:

DateiBeschreibung
wohnuhr.asmDiese Datei enthält den Quelltext für die Wohnraumuhr-Software und wird hier nicht benötigt.
wohnuhr.hexDiese Datei enthält das Programm für den Mikrocontroller, diese muss in den Flash-Speicher programmiert werden.
wohnuhr.eepDiese Datei enthält Daten für die Grundeinstellung der Wohnraumuhr, diese muss in das EEPROM programmiert werden.
wohnuhr-fusebits.gifDieses Bild zeigt die richtige Einstellung der Fuse-Bits, hier stehen im unteren Teil des Bildes die für uns wichtigen Informationen: HIGH 0xD1 und LOW 0x3F

ProgTool - Brennen vorbereiten Nun geht es endlich zur Sache: Nach dem Wechsel auf die Seite Brennen werden hier alle Daten für unser Projekt eingegeben.

Zunächst wird der Haken bei Flash brennen: gesetzt und über den Button Suchen ... die Datei wohnuhr.asm ausgewählt. Da in diesem Projekt auch das EEPROM beschrieben werden muss, wird der Haken bei EEPROM brennen: gesetzt und ebenfalls über den Button Suchen ... die entsprechende Datei wohnuhr.eep ausgewählt. Im unteren Teil des Programmfensters kann man sich übrigens den Inhalt der beiden ausgewählten Dateien anschauen.

Die Fuse-Bits müssen natürlich auch noch richtig eingestellt werden, also werden noch Haken bei Fuses brennen:, Low: und High: gesetzt und das Feld bei Low: mit 3F sowie das Feld bei High: mit D1 ausgefüllt.

Wie kommen diese Werte zustande? Die Fuse-Bits sind wie Speicherzellen organisiert, bestehen also aus 8 Bits, die zu einem Byte zusammengefasst sind. Insgesamt haben AVR-Mikrocontroller bis zu 3 solcher Bytes, die mit Low, High und Extended bezeichnet werden. Der ATmega8535 in unserem Beispiel besitzt nur die Bytes Low und High und die optimalen Einstellungen für die Wohnraumuhr ergeben die beiden genannten Werte. Diese Einstellungen sind (wie bereits erwähnt) auf dem Bild wohnuhr-fusebits.gif ganz unten zu sehen.

Übrigens, über den Button Bearbeiten kann man die Fuse-Bits auch editieren, auf die Default-Werte des Herstellers zurücksetzen und auch direkt aus dem Controller auslesen oder in den Controller schreiben. Hier ist aber immer Vorsicht geboten, denn eine falsche Fuse-Bit-Einstellung kann dazu führen, dass der Controller nicht mehr mit dem Programmiergerät kommuniziert und dadurch unbrauchbar wird. Insbesondere Einsteigern empfehle ich, die in meinen Projekten empfohlenen Werte wie im Bild unverändert zu übernehmen.

Jetzt wird es spannend: Wenn alle Einstellungen nochmals kontrolliert worden sind (insbesondere die der Fuse-Bits), dann wird auf den Button Brennen (F5) geklickt und die Sicherheitsabfrage mit einem Klick auf Ja bestätigt.

ProgTool - Brennen fertig Das myAVR ProgTool wechselt jetzt automatisch zur Seite Ausgabe und zeigt dort alle weiteren Aktivitäten an. So wird zunächst der Flash-Speicher des Controllers geschrieben, anschließend das EEPROM und zum Schluss werden noch die beiden Bytes mit den Fuse-Einstellungen in den Controller übertragen. Das Ganze geht recht schnell und dauert nur wenige Sekunden. Anschließend sollte das Ergebnis so aussehen wie im nebenstehenden Bild und damit ist die gesamte Aktion erfolgreich abgeschlossen.

In unserem Beispiel wird das Programm im Controller der Wohnraumuhr jetzt mit seiner Arbeit beginnen und nach einer kurzen Einblendung der Versionsnummer die Uhrzeit 0:00 anzeigen.

Jetzt kann das Programmiergerät von der Schaltung entfernt werden und hier ist folgende Reihenfolge empfehlenswert:

  1. Ausschalten der Stromversorgung des Mikrocontrollers
  2. Abziehen des mySmartUSB light vom PC
  3. Trennen der Verbindung zwischen dem mySmartUSB light und dem zu programmierenden Mikrocontroller

Der Vollständigkeit wegen möchte ich noch die Seite Auslesen erwähnen. Damit lässt sich sowohl der Inhalt des Flash als auch der Inhalt des EEPROM auslesen und als Datei speichern.

Symbol Andere Programmiergeräte

Es gibt noch eine ganze Reihe weiterer Programmiergeräte für AVR-Mikrocontroller. So bietet natürlich die Herstellerfirma Atmel selbst verschiedene Geräte an, die zum Teil enorm leistungsfähig sind und dadurch auch ihren Preis haben. Als Beispiele sollen hier der Klassiker STK500 (ca. 85€) und das aktuellere Modell AVR Dragon (ca. 60€) genannt werden. Letzteres benutze ich selbst und bietet neben der Programmierung über ISP auch Debugging-Funktionen über JTAG und DebugWIRE.

Weiterhin gibt es noch ganz einfache Programmieradapter, die man mit wenig Aufwand selbst bauen kann. Diese werden an einen parallelen (LPT) oder seriellen Port (COM) an den PC angeschlossen und erfordern eine spezielle Programmier-Software. Ich habe selbst über einen längeren Zeitraum mit solchen Adaptern gearbeitet und diese hier auch dokumentiert. Wer sich für so einen einfachen Programmier-Adapter interessiert, der findet auf der alten Seite AVR-Programmierung alle Informationen.