AVR-Programmierung (alte Seite)
Letzte Bearbeitung: 08.08.2010
Bis auf eine Ausnahme verwenden alle Projekte, die auf diesen Seiten vorgestellt werden, Mikrocontroller aus der AVR-Produktreihe der Firma ATMEL. Ein großer Vorteil dieser Controller ist, dass sie über eine relativ einfache Schnittstelle programmiert werden können. Diese besteht aus 4 Leitungen, über die die zu programmierenden Daten seriell in den Speicher des Controllers übertragen werden. Auch das Auslesen des Speichers und das Konfigurieren des Controllers ist über diese Leitungen möglich. Der Controller kann bei dieser Prozedur in der fertigen Schaltung verbleiben und muss nicht ausgebaut werden. Hier hat sich der Begriff ISP (In System Programming) durchgesetzt. Zur Verbindung mit einem PC genügt ein relativ einfacher Adapter, der an die parallele oder serielle Schnittstelle des PC angeschlossen wird. Weiterhin wird noch etwas Software benötigt und hier hat sich bei mir das kostenlose Programm PonyProg2000 bewährt.
Zunächst zur Hardware des Programmieradapters: Hier gibt es, wie schon erwähnt, zwei Versionen. Eine ist für den Anschluss an eine parallele PC-Schnittstelle (LPT) bestimmt, die andere für den Anschluss an eine serielle PC-Schnittstelle (COM). Beide werden gleichermaßen von PonyProg2000 unterstützt und stellen eine ISP-Schnittstelle zur Verfügung, die direkt mit den AVR-Projekten auf meiner Seite verbunden werden kann. Für welche Version man sich entscheidet, hängt davon ab, welche Schnittstelle zur Verfügung steht.
Das nebenstehende Bild zeigt die Schaltungsversion für den parallelen Port. Hier werden neben den erforderlichen Steckverbindern nur 2 Widerstände benötigt. Diese sind notwendig, um die Ausgänge des LPT-Port sowie die Programmieranschlüsse des angeschlossenen Controllers zu schützen. Der Vorteil dieser Version ist die einfache Schaltung. Nachteilig ist allerdings, dass LPT-Ports beim PC nicht besonders gut geschützt sind und man sehr vorsichtig arbeiten muss.
Diese Stückliste enthält die benötigten Bauteile für die parallele Version.
Diese Stückliste enthält die benötigten Bauteile für die serielle Version. Es ist auch ein Platinenlayout für Standard-Bauteile und
ein Platinenlayout für SMD-Bauteile verfügbar.
Der Standard von ATMEL sieht jedoch ganz anders aus. Hier gibt es 2 Varianten: Weit verbreitet ist der Anschluss über einen 10-poligen Wannenstecker, weniger häufig ist der 6-polige Anschluss (ebenfalls als Wannenstecker) anzutreffen.
Die beiden nebenstehenden Schaltungen zeigen, wie man die Programmieradapter auch für die originalen 6- oder 10-poligen ISP-Anschlüsse verwenden kann.Als Ergänzung zum parallelen und seriellen Programmieradapter hat Lothar Jasper zwei Platinen erstellt, auf die alle 28- und 40-poligen AVR-Controller im PDIP-Gehäuse gesteckt werden können. Eine kleinere Version ist für Standard IC-Fassungen vorgesehen und eine größere Version kann mit Textool-Fassungen bestückt werden. Damit können praktisch alle größeren AVR Mikrocontroller programmiert werden.
Die wenigen Bauteile der Programmieradapter lassen sich mit etwas Geschick im Steckergehäuse unterbringen. Recht problemlos geht das bei der Version für den parallelen Anschluss, hier haben die beiden
Widerstände genügend Platz im großen Gehäuse.
Wer sich so eine Konstruktion nicht zutraut, der kann die Schaltung auch auf einer separaten Platine aufbauen und diese über ein kurzes Kabel mit dem Stecker verbinden.
Und so sieht der Programmieranschluss aus. Ich habe hier (wie schon erwähnt) einreihige IC-Sockelleisten verwendet, die sehr preiswert sind und sich einfach auf die benötigte Länge kürzen lassen. Auf
der Seite, wo normalerweise die ICs eingesteckt werden, habe ich die 5 Leitungen eingelötet und die Stifte, die sonst in die Platine kommen, dienen hier als Stecker. Die Lötstellen habe ich später mit
Zweikomponentenkleber vergossen.
Wichtiger Hinweis: Etwas kritisch ist die Kabelverbindung. Ich verwende hier 4-adriges geschirmtes Kabel, wobei der Schirm gleichzeitig als Masse-Leitung dient. Sehr gut geeignet sind auch Flachbandkabel, Kabel mit verdrillten Adern sollten jedoch nicht verwendet werden. Über die maximale Kabellänge streiten sich noch die Experten, aber es gilt die Regel: so kurz wie möglich. Meine Kabel haben eine Länge von ca. 2m und funktionieren tadellos mit allen AT90Sxxxx, ATtiny und ATmega Typen bei Taktfrequenzen von 1 bis 16MHz. Es gibt aber Fälle, wo auch bei dieser Länge Probleme auftreten. Beim seriellen Adapter liegt die Ursache vermutlich an der MISO-Leitung: Hier wird der CMOS-Pegel des AVR direkt an die RS-232 Schnittstelle geführt und das liegt außerhalb der Spezifikationen. Man könnte zwar einen Treiber zwischenschalten, dieser würde aber den Aufwand enorm erhöhen und eine zusätzliche Stromversorgung benötigen. Deshalb empfehle ich die einfachste Lösung: Kabel kürzen.
Als Programmiersoftware kommt das bereits erwähnte PonyProg2000 zum Einsatz. Dieses kann kostenlos genutzt werden und es ist für Windows und Linux verfügbar. Offiziell handelt es sich bei PonyProg2000 um eine Beta-Version, was vermutlich damit zusammenhängt, dass noch nicht alle der neueren AVR Controller implementiert sind. Die nachfolgende Beschreibung und die Bilder beziehen sich übrigens auf die bei der Texterstellung aktuelle Version 2.07c.
Die Installation von PonyProg2000 bedarf eigentlich keiner weiteren Erklärung. Beim ersten Start des Programms ist eine Kalibrierung erforderlich, also einfach im Menü Setup die Option Calibration aufrufen und den angezeigten Hinweisen folgen. Und so präsentiert sich PonyProg2000:Unter der Menüzeile sind zwei Symbolleisten angeordnet, hier kann man praktisch alle wichtigen Funktionen direkt aufrufen. Im Hauptfenster (welches jetzt noch leer ist) werden später die Daten angezeigt, die in den Controller geschrieben werden sollen. Zunächst muss aber der verwendete Programmieradapter eingestellt werden: Dazu wird im Menü Setup die Option Interface Setup aufgerufen. Alternativ kann man auch auf dieses Symbol klicken.
Das linke Bild zeigt die empfohlenen Einstellungen für den parallelen Adapter, bei Windows 95 oder 98 kann man auch die Option Avr ISP API verwenden. Im rechten Bild sind die Einstellungen für den seriellen Adapter zu sehen. Mit dem Button Probe lässt sich prüfen, ob der angeschlossene Programmieradapter erkannt wird. Kommt hier die Meldung Test Ok, dann hat PonyProg Zugriff auf den Adapter. Dies ist zwar noch keine Garantie, dass der Programmieradapter auch wirklich funktioniert, aber es ist schon ein gutes Zeichen. Falls hier Test Failed gemeldet wird, dann sollten nochmals alle Einstellungen und gegebenenfalls auch die Hardware überprüft werden.
Das im folgenden Abschnitt beschriebene Test-Projekt dient (wie der Name schon sagt) zum Test aller zum Programmieren nötigen Komponenten. Wer noch keine Erfahrungen mit Mikrocontrollern hat, sollte diese kleine Schaltung aufbauen und alle Beispiele testen.
Kurz zur Schaltung: Ein ATmega8 wird in einer Minimalkonfiguration betrieben. C1 dient als Stützkondensator und sollte sich möglichst nah am Controller befinden. X1 sowie C2 und C3 sorgen für einen stabilen Takt von 4MHz und auch diese Bauteile sollten in der Nähe des Controllers angeordnet werden. Am Controlleranschluss PB0 ist über den Vorwiderstand R1 die LED D1 angeschlossen, die später zum Blinken gebracht werden soll. Interessant ist der 5-polige mit ISP bezeichnete Steckverbinder, hier wird der Programmieradapter angeschlossen.Zur Versorgung der Schaltung wird eine stabilisierte Spannung von 5V benötigt. Ein Labornetzgerät ist für diesen Zweck am besten geeignet. Es kann aber auch ein Steckernetzteil verwendet werden, aber man sollte darauf achten, dass dieses Netzteil wirklich eine geregelte Spannung liefert. Für die meisten modernen Schaltnetzteile trifft dies zu, nicht jedoch für viele ältere Trafo-Netzteile.
Diese Stückliste enthält alle Bauteile, die für das Test-Projekt benötigt werden.
Falls nur ein ungeregeltes Steckernetzteil zur Verfügung steht, dann ist das auch kein Problem. Mit der nebenstehenden Schaltung kann daraus eine Spannung von +5V erzeugt werden. Zur Not lässt sich
auch eine 9V Batterie als Spannungsquelle verwenden.
Auf dem Bild wurde der Programmieradapter bereits angeschlossen. Allgemein wird empfohlen, beim Verbinden und Trennen des Programmieradapters alle Geräte auszuschalten. Die Praxis hat aber gezeigt,
dass es nicht notwendig ist, den PC deswegen herunterzufahren. Die Stromversorgung für das AVR-Projekt sollte aber ausgeschaltet werden, wenn die ISP-Verbindung hergestellt oder getrennt wird. Ich
habe mir außerdem angewöhnt, beim Verbinden den ISP-Stecker etwas schräg anzusetzen, so dass beim Einstecken zuerst die Masseleitung verbunden wird und stecke erst dann komplett ein.
Damit der Controller weiß, dass er jetzt eine LED zum Blinken bringen soll, muss er mit dem entsprechenden Programm ausgestattet werden. Für diesen Zweck verfügen alle AVR Mikrocontroller über einen FLASH-Speicher. Wird der Controller eingeschaltet, dann beginnt er mit dem Lesen des FLASH-Speichers bei Adresse 0 und interpretiert diese Daten als Befehle. Der FLASH-Speicher muss also in jedem Fall programmiert werden, damit der Controller überhaupt arbeiten kann. Weiterhin gibt es noch einen EEPROM-Speicher, welcher dafür gedacht ist, Daten (z.B. für die Konfiguration) aufzubewahren. Dieser wird meist vom Controller-Programm verwaltet, es ist aber auch möglich, den EEPROM-Speicher mittels ISP zu beschreiben oder auszulesen. Man sollte sich einprägen, dass es beim EEPROM-Speicher jederzeit möglich ist, einzelne Zellen zu verändern, während der FLASH-Speicher nur komplett gelöscht und neu beschrieben werden kann.
FLASH-SpeicherUm das Test-Projekt zum Leben zu erwecken, soll nun ein Programm in den FLASH-Speicher des ATmega8 übertragen werden. Dieses Programm definiert den Anschluss PB0 als Ausgangsport und wechselt dann ständig das Ausgangssignal von PB0 zwischen Low- und High-Pegel. Zwischen den Pegelwechseln läuft noch ein weiterer Programmteil, den man allgemein als Warteschleife bezeichnet und nur dazu dient, Zeit zu "verbrauchen". Ohne diese Warteschleife würde die LED einige Hunderttausend mal pro Sekunde blinken, was in diesem Fall nicht so sinnvoll wäre. Das Programm wurde so geschrieben, sich eine Blinkfrequenz von ca. 1Hz ergibt, wenn der Controller mit einer Taktfrequenz von 4MHz betrieben wird.
Zunächst ist erforderlich, die Datei avr-test.zip zu downloaden. Hier sind folgende 3 Dateien enthalten:
testprojekt.asm | Diese Datei enthält den Quelltext des Programms in Assemblersprache. Hier sind alle Befehle zum Blinken einer LED für den ATmega8 im Klartext aufgelistet, so dass sie für den Programmierer gut lesbar sind. In dieser Form kann die Datei jedoch nicht vom Mikrocontroller verarbeitet werden, deshalb muss der Quelltext in eine vom Controller lesbare Form umgewandelt werden. |
testprojekt.hex | In dieser Datei befinden sich die Befehle aus dem Assembler-Quelltext in einer vom Controller lesbaren Form. Diese Datei muss in den FLASH-Speicher des ATmega8 unseres Test-Projektes programmiert werden, damit der Controller das Programm ausführen kann. |
testprojekt.eep | Diese Datei enthält einige Daten für den EEPROM des ATmega8. Für die Funktion des Test-Projektes ist diese Datei nicht erforderlich, sie wird hier nur verwendet, um die Programmierung des EEPROM-Speichers zu demonstrieren. |
Aber jetzt zur Praxis: Auf dem PC wird PonyProg gestartet, der Programmieradapter angesteckt (zuerst am PC, dann am Test-Projekt) und als letztes wird die Stromversorgung des Test-Projektes eingeschaltet. In PonyProg geht es folgendermaßen weiter:
Device [AVR micro] [ATmega8] | Über die Menü-Option Device oder die beiden Auswahlfelder auf der oberen Symbolleiste wird zunächst die Chip-Familie und danach der Chip-Typ ausgewählt. |
Open Program Memory (FLASH) File | Ein Klick auf dieses Symbol zeigt einen Öffnen-Dialog, hier wird die Datei testprojekt.hex ausgewählt. PonyProg lädt den Inhalt dieser Datei in einen Puffer und zeigt dessen Inhalt anschließend im Hauptfenster an (hexadezimal und als Text). |
Write Device | Beim Klick auf dieses Symbol erscheint eine Sicherheitsabfrage und nach deren Bestätigung mit Yes startet der Programmiervorgang. Dabei wird der Inhalt des Puffers komplett in den Controller geschrieben und anschließend zum Vergleich wieder ausgelesen. Wurde die gesamte Prozedur erfolgreich abgeschlossen, dann erscheint die Meldung Write successful. |
Zeitgleich zur Erfolgsmeldung auf dem PC wird das Programm im Controller gestartet und die LED blinkt - Herzlichen Glückwunsch! Übrigens, der gesamte Programmiervorgang dauert bei diesem Beispielprogramm ungefähr 20 Sekunden.
EEPROM-SpeicherEinige Projekte wie z.B. die Multifunktionsuhr oder das Anzeigemodul 1 benötigen Einstellungsdaten im EEPROM-Speicher. Hier muss also neben dem FLASH- auch der EEPROM-Speicher des Controllers programmiert werden. Bei einem solchen Projekt wird folgendermaßen vorgegangen:
Device [AVR micro] [ATmega8] | Über die Menü-Option Device oder die beiden Auswahlfelder auf der oberen Symbolleiste wird zunächst die Chip-Familie und danach der Chip-Typ ausgewählt. |
Open Program Memory (FLASH) File | Ein Klick auf dieses Symbol zeigt einen Öffnen-Dialog, hier wird die Datei testprojekt.hex ausgewählt. PonyProg lädt den Inhalt dieser Datei in einen Puffer und zeigt dessen Inhalt anschließend im Hauptfenster an (hexadezimal und als Text). |
Open Data Memory (EEPROM) File | Ein Klick auf dieses Symbol zeigt einen Öffnen-Dialog, hier wird die Datei testprojekt.eep ausgewählt. Gegebenenfalls muss der Dateityp erst auf *.eep oder * geändert werden, damit die richtige Datei im Auswahlfenster angezeigt wird. PonyProg lädt den Inhalt dieser Datei ebenfalls in den Puffer und zeigt dessen Inhalt im Hauptfenster an, wobei die EEPROM-Daten ganz am Ende zu finden sind. |
Write Device | Beim Klick auf dieses Symbol erscheint eine Sicherheitsabfrage und nach deren Bestätigung mit Yes startet der Programmiervorgang. Dabei wird der Inhalt des Puffers komplett in den Controller geschrieben und anschließend zum Vergleich wieder ausgelesen. Wurde die gesamte Prozedur erfolgreich abgeschlossen, dann erscheint die Meldung Write successful. |
Auch hier startet anschließend das Programm im Controller und die LED blinkt. Das war auch nicht anders zu erwarten, denn schließlich hat sich das Programm nicht verändert und die Daten im EEPROM werden bei diesem Test-Projekt nicht verwendet.
Gelegentlich ist es erforderlich, bei einem bereits laufenden Projekt den EEPROM-Inhalt zu ändern, z.B. um einen neuen Geburtstag in die Multifunktionsuhr einzutragen. In einem solchen Fall will man natürlich das Programm im FLASH-Speicher behalten und nur den EEPROM-Inhalt anpassen. Hier geht man folgendermaßen vor:
Device [AVR micro] [ATmega8] | Über die Menü-Option Device oder die beiden Auswahlfelder auf der oberen Symbolleiste wird zunächst die Chip-Familie und danach der Chip-Typ ausgewählt. |
Open Data Memory (EEPROM) File | Ein Klick auf dieses Symbol zeigt einen Öffnen-Dialog, hier wird die Datei testprojekt.eep ausgewählt. Gegebenenfalls muss der Dateityp erst auf *.eep oder * geändert werden, damit die richtige Datei im Auswahlfenster angezeigt wird. PonyProg lädt den Inhalt dieser Datei in den Puffer und zeigt dessen Inhalt im Hauptfenster an, wobei die EEPROM-Daten ganz am Ende zu finden sind. |
Write Data Memory (EEPROM) | Beim Klick auf dieses Symbol erscheint eine Sicherheitsabfrage und nach deren Bestätigung mit Yes startet der Programmiervorgang. Dabei wird nur der Inhalt des EEPROM-Puffers in den Controller geschrieben und anschließend zum Vergleich wieder ausgelesen. Wurde die Prozedur erfolgreich abgeschlossen, dann erscheint die Meldung Write successful. |
Noch ein kleiner Tipp: In der Regel wird bei einem Mikrocontroller-Projekt nur der FLASH-Speicher mit der hex Datei programmiert. Falls ein Projekt die zusätzliche Programmierung des EEPROM-Speichers erfordert, dann erkennt man dies daran, dass dem Software-Paket neben der hex auch eine eep Datei beiliegt.
Fuse-BitsWeiter oben im Text hatte ich erwähnt, dass das Programm für das Test-Projekt mit 4MHz läuft und die LED mit ungefähr 1Hz (also im Sekundentakt) blinken soll. Wer das Test-Projekt aufgebaut und alle Programmierschritte durchgeführt hat, wird feststellen, dass die LED viel langsamer blinkt und zwar nur alle 4s, also mit 0,25Hz. Das lässt darauf schließen, dass der Controller mit einer Taktfrequenz von nur 1MHz arbeitet. In der Tat läuft der Controller im Moment mit einem internen Taktoszillator, welcher mit 1MHz schwingt. Man könnte sogar den Quarz aus der Schaltung entfernen und die LED würde weiterhin blinken. Die nächste Aufgabe ist also, den Quarzoszillator des Controllers zu aktivieren. Hierfür sind die Fuse-Bits zuständig, sie ermöglichen die Konfiguration einiger Controller-Funktionen. Die Fuse-Bits sind unabhängig von den beiden Speichern des Controllers und die Einstellungen bleiben so lange erhalten, bis sie wieder geändert werden, wobei Änderungen jederzeit möglich sind.
Zuerst noch eine Warnung: Einstellungen an den Fuse-Bits sollten sehr gewissenhaft durchgeführt werden. Zwar kann man den Controller mit einer falschen Einstellung nicht beschädigen, wohl aber in einen Zustand bringen, in dem er eine weitere Kommunikation verweigert.
Zur Einstellung der Fuse-Bits wird auf das Schloss-Symbol geklickt. Danach liest PonyProg die aktuelle Einstellung aus dem
Controller und zeigt diese in einem Fenster an. Falls PonyProg bereits mit dem Controller kommuniziert hat, z.B. beim Programmieren der Speicher, dann hat es die Einstellungen bereits gelesen und
zeigt sie direkt an. Bei einem fabrikneuen ATmega8 ergibt sich das nebenstehende Bild.
Mit einem Klick auf Write wird die neue Einstellung in den Controller geschrieben und das Fenster wieder geschlossen. Ein Blick auf das Test-Projekt zeigt: die LED blinkt jetzt
ungefähr im Sekundentakt.
Für weitere Informationen verweise ich auf die Datenblätter der Controller, hier sind alle Fuse-Bits ausführlich beschrieben. Bei eigenen Versuchen sollte man auf eine Besonderheit achten, es gilt hier folgende Definition:
Fuse-Bit nicht programmiert | entspricht dem logischen Wert 1 | |
Fuse-Bit programmiert | entspricht dem logischen Wert 0 |
Diese Definition erscheint etwas verwirrend, aber es gibt eine einfache Erklärung dafür: Die Fuse-Bits funktionieren im Prinzip wie Speicherzellen, so wie sie auch beim FLASH- oder EEPROM-Speicher verwendet werden und diese sind technisch bedingt im leeren bzw. unprogrammierten Zustand auf logisch 1 gesetzt.
Hinweis: Um den Nachbau aller Projekte so einfach wie möglich zu gestalten, enthält jede Beschreibung einen Screenshot von PonyProg mit der richtigen Einstellung der Fuse-Bits.