AVR-Einstieg leicht gemacht


Artikel von Scott-Falk Hühn

Viele Einsteiger fragen sich: "Wie bekommt man eigentlich die Software in den Mikrocontroller hinein?" Zur Beantwortung dieser Frage möchte ich auf dieser Unterseite zeigen, wie ich mit Hilfe der kostenlosen Software "PonyProg2000" und einem einfachen Adapter für die parallele oder serielle PC-Schnittstelle meine AVR-Controller programmiere. Zum Test aller Komponenten dient eine kleine Schaltung mit dem AT90S2313 (LED-Blinker), die auf einem Steckbrett aufgebaut werden kann. Außerdem wird in einem weiteren Abschnitt auf die Programmierung der Fuse-Bits eingegangen (Quarz aktivieren etc.).


Allgemeines

Die Firma Atmel bietet unter dem Namen STK500 ein leistungsfähiges Entwicklungssystem an, mit dem man AVR Mikrocontroller nicht nur programmieren, sondern auch testen kann. Eigentlich ist es damit sowohl für Einsteiger als auch für Fortgeschrittene ideal, aber es hat auch seinen Preis von über 100€.

Ich bin deshalb einen anderen Weg gegangen und habe mir das nötige Equipment selbst gebastelt und das ist gar nicht so kompliziert: Alle AVR Mikrocontroller können über eine einfache Schnittstelle programmiert werden, die aus 5 Leitungen besteht. Über diese Leitungen werden die zu programmierenden Daten seriell in den µC übertragen und können ebenso auch wieder ausgelesen werden. Die dazu erforderliche Software kann kostenlos aus dem Internet geladen werden und man benötigt praktisch nur noch ein Minimal-Interface, um die 5 Leitungen vom AVR an die parallele oder serielle PC Schnittstelle anzuschließen. Dabei muss der Controller nicht ausgebaut werden und kann in der Schaltung verbleiben. Man spricht in diesem Zusammenhang auch von ISP (In System Programming).

Schaltung

Die folgenden beiden Programmieradapter sind für ISP vorgesehen, d.h. es wird davon ausgegangen, dass der zu programmierende AVR bereits in der Schaltung eingebaut ist und von dieser mit Strom versorgt wird. Soll ein einzelner AVR programmiert werden, dann sind noch weitere Bauelemente und eine Stromversorgung erforderlich. Die Schaltung muss dann so aussehen wie das weiter unten beschriebene Test-Projekt, wobei die LED entfallen kann. Sollen öfters einzelne AVRs programmiert werden, dann empfiehlt sich der Aufbau des "PonyProg Circuit", welches auf der Links, Software Seite zu finden ist. Dieses enthält bereits den hier vorgestellten seriellen Programmieradapter und auch einen Anschluss für ISP.

Im Folgenden soll es um einen einfachen ISP Adapter gehen, wobei es eine Version für den Anschluss an einen parallelen Port (LPT) und eine Version für den seriellen Port (COM) gibt:


1. Anschaltung an den parallelen Port: Diese Variante ist am einfachsten zu realisieren. Es werden praktisch neben den erforderlichen Steckverbindern nur 2 Widerstände benötigt. Allerdings hat diese Variante auch Nachteile. Meist ist der einzige parallele Port bereits durch einen Drucker oder andere Hardware belegt und man müsste zum µC-Programmieren immer erst Geräte umstecken, was auf die Dauer recht umständlich ist. Außerdem ist der Port nicht besonders gut geschützt, er kann also durch Fehler in der angeschlossenen Schaltung durchaus beschädigt werden.

Stückliste für die parallele Version



2. Anschaltung an den seriellen Port. Hier ist der Material-Aufwand etwas größer, trotzdem bietet diese Variante Vorteile: Da an den meisten PCs eine freie Schnittstelle vorhanden ist, entfällt das lästige Umstecken. Außerdem ist diese Schnittstelle robuster als der Parallelport und verträgt auch mal einen Kurzschluss. Die Schaltung ist übrigens eine etwas vereinfachte Version des Si-Prog-Interfaces, welches auf der PonyProg-Homepage vorgestellt wird. Zusätzlich wurde noch der Kondensator C1 hinzugefügt, er beseitigt Kommunikationsprobleme, die gelegentlich auftreten können. Im Test funktionierte die Schaltung mit Werten von 220p bis 1n einwandfrei.

Stückliste für die serielle Version
Platinenlayout für die serielle Version. Dieses wurde von harry@dspl.de erstellt, vielen Dank. Hinweis: C1 ist noch nicht im Layout enthalten.

Noch einige Worte zu dem 5-poligen Programmieranschluss K2: Abgesehen vom ISP-Anschluss des STK500 gibt es hier eigentlich keinen Standard, deshalb habe ich ein eigenes System entwickelt. Alle AVR-Projekte dieser Seite sind mit diesem Anschluss versehen und können damit jederzeit problemlos neu programmiert werden.

Aufbau

Die wenigen Bauteile der Programmier-Interfaces lassen sich mit etwas Geschick im Steckergehäuse unterbringen. Recht problemlos geht das beim Parallel-Interface, hier haben die beiden Widerstände genügend Platz im großen Gehäuse.


Etwas schwieriger ist es beim seriellen Interface. Ich habe hier eine kleine Punktraster-Platine passend zurechtgesägt und dort alle Bauteile aufgelötet. Hier ist sehr wenig Platz und es ist recht knifflig, aber durchaus machbar, wie man auf dem Bild sehen kann. Da sich bei so einem engen Aufbau auch schnell Fehler einschleichen können, sollte man vor der Inbetriebnahme unbedingt nochmals alle Verbindungen kontrollieren.
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 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. Das Gegenstück auf der µC-Schaltung ist übrigens auch ein Stück dieser Stiftleisten, welches dann einfach als 5-polige Buchse verwendet wird.

Wie man im nachfolgenden Test-Projekt sehen kann, ist diese Steckverbindung recht praktisch, da man eine direkte Verbindung zu einem Experimentier-Steckbrett herstellen kann. Der einzige Nachteil ist, dass man den Stecker auch verkehrt herum aufstecken kann, was aber unbedingt vermieden werden sollte. Deshalb habe ich bei allen ISP-Anschlüssen meiner Projekte den Masseanschluss mit einer Markierung versehen (schwarzer Punkt auf der Platine) um Verwechslungen auszuschließen.

Wichtiger Hinweis: Etwas kritisch ist die Kabelverbindung zwischen dem PC und dem Programmieranschluss. Ich verwende hier 4-adriges geschirmtes Kabel, wobei der Schirm gleichzeitig als Masse-Leitung dient. Ü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. Aber ich erhielt einige Zuschriften, in denen auch bei 2m Kabellänge von Problemen berichtet wurde. Beim seriellen Interface liegt die Ursache vermutlich an der MISO-Leitung, wo der CMOS-Pegel des AVR direkt an die RS-232 Schnittstelle geführt wird 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: möglichst kurze Kabel von maximal 1m benutzen und dann klappt das.

Software

Als Programmiersoftware kommt das bereits erwähnte "PonyProg2000" zum Einsatz. Dieses ist enorm leistungsfähig, kann neben den AVRs auch PICs und EEPROMs programmieren und es ist kostenlos. Auf der Link-Seite befindet sich eine Downloadmöglichkeit für PonyProg2000 (Windows und Linux), eine deutsche Programm-Version ist dort ebenfalls verfügbar, allerdings erscheint diese oft etwas später als die englische Version. Offiziell handelt es sich bei PonyProg2000 um eine Beta-Version, die aber bei mir bisher ohne Probleme funktionierte.

Die Installation von PonyProg2000 bedarf eigentlich keiner weiteren Erklärung. Wenn man sich für die deutsche Version entschieden hat, dann muss trotzdem zuerst die komplette englische Version installiert werden. Die deutsche Sprachversion enthält nur eine modifizierte "ponyprog2000.exe" und diese wird einfach nur entpackt und ins Programmverzeichnis von PonyProg kopiert (die bereits vorhandene Datei wird dabei überschrieben). Die nachfolgenden Bilder beziehen sich übrigens auf die bei der Texterstellung aktuelle englische Version 2.06c.

Beim ersten Start des Programms muss eine Kalibrierung durchgeführt werden, also einfach im Menü "Setup" die Option "Calibration" aufrufen und den angezeigten Hinweisen folgen. Und so präsentiert sich PonyProg2000:



Als nächstes wird das verwendete Interface eingestellt: Dazu wird im Menü "Setup" die Option "Hardware-Setup" aufgerufen. Alternativ kann man auch auf dieses Symbol klicken.


Das linke Bild zeigt die empfohlenen Einstellungen für das parallele Interface, bei Windows 95 oder 98 kann man auch die Option "Avr ISP API" verwenden. Im rechten Bild sind die Einstellungen für das serielle Interface zu sehen.

Zum Schluss muss noch der verwendete IC-Typ ausgewählt werden, im Screenshot des Hauptfensters weiter oben ist gerade "AVR micro" und "ATmega8" eingestellt. Damit sind alle Vorbereitungen abgeschlossen und es wird Zeit für einen Test.

Test-Projekt

Das im folgenden Abschnitt beschriebene kleine Test-Projekt dient nur zur Demonstration des Programmierinterfaces. Es wird nicht benötigt, wenn man Projekte von dieser Seite nachbauen möchte oder eigene AVR-Schaltungen programmiert. Aber es soll dem Einsteiger die Möglichkeit bieten, auf einfache Art die Programmierung der AVR-Controller kennen zu lernen.


Zur Schaltung: Ein AT90S2313 wird in einer Minimalkonfiguration betrieben. Mithilfe von X1 sowie C1 und C2 erzeugt der Controller einen stabilen Takt von 4 MHz. R1 und C3 generieren einen Reset-Impuls beim Einschalten der Betriebsspannung, danach sorgt R1 für einen stabilen High-Pegel am Reset-Eingang des Mikrocontrollers. C4 dient als Stützkondensator und sollte so nah wie möglich am Controller angeordnet werden. Die LED1, die wir später zum Blinken bringen wollen, wird über den Vorwiderstand R2 an den Portanschluss PB0 angeschlossen. Übrig bleibt noch K1 und hier kommt das Programmierinterface dran.

Zur Versorgung der Schaltung wird eine stabilisierte Spannung von 5V benötigt, die am besten von einem Labornetzgerät bereitgestellt werden sollte.


Es kann aber auch ein unstabilisiertes Steckernetzteil oder eine 9V-Batterie verwendet werden, dann ist aber zusätzlich ein 5V Spannungsregler, z.B. 7805 erforderlich. Die nebenstehende Schaltung zeigt den Aufbau einer einfachen 5V Versorgung.



Hier ist das auf einem Steckbrett aufgebaute Test-Projekt zu sehen. Der Anschluss des Programmierinterfaces sollte am besten im spannungsfreien Zustand erfolgen, d.h. PC und Steckbrett abschalten, das Programmierinterface an PC und Schaltung anschließen und erst dann alle Geräte einschalten. Es ist aber auch ein "Hotplugging" möglich, wenn man folgendermaßen vorgeht: Man steckt zunächst das Programmierinterface an den PC. Danach hält man den 5-poligen ISP-Anschluss etwas schräg und führt ihn so an die Schaltung, dass zuerst der Massekontakt verbunden wird. Erst dann wird der Stecker komplett eingesteckt. Nach erfolgreicher Programmierung werden alle Verbindungen in umgekehrter Reihenfolge wieder getrennt.

Damit die LED in unserer Schaltung auch wie gewünscht blinkt, muss noch die entsprechende Software in den Controller geladen werden. Die Datei avr-test1.zip enthält das nötige Programm als Quelltext und als fertige HEX-Datei für den AT90S2313. Starten wir also PonyProg2000 und kontrollieren zunächst die Einstellungen des Device-Typs "AVR micro" und "AT90S2313". Nun wird die in der Zip-Datei enthaltene "test1.hex" mittels Klick auf [Open Program Memory (FLASH) File] geöffnet. Im Hauptfenster sollten jetzt einige Zeilen Hexcode angezeigt werden. Nun kommt der spannende Moment: Ein Klick auf [Write Device] bewirkt den Start des Programmiervorganges. Dabei wird zunächst der Flash-Speicher gelöscht, dann der Speicher programmiert und nach dem Programmiervorgang zur Sicherheit noch ein Vergleich der geschriebenen Daten durchgeführt. Dieser Vorgang dauert einige Sekunden und danach wird automatisch das Programm im Mikrocontroller gestartet - die LED blinkt.

Genau genommen passiert bei der Funktion "Write Device" noch mehr: Es wird nämlich nicht nur der Flash-Speicher beschrieben, sondern auch der EEPROM-Speicher, der beim Test-Projekt allerdings nicht genutzt wird. Bei vielen Projekten ist es aber erforderlich, den Flash und den EEPROM zu programmieren, da in letzterem zusätzliche Daten enthalten sind, die vom Programm im AVR benötigt werden. In diesem Fall müssen vor dem Start der Programmierung zwei Dateien geladen werden: Die HEX-Datei wie bereits beschrieben über und die EEPROM-Datei über [Open Data Memory (EEPROM) File] geladen. Das Programmieren beider Speicherbereiche erfolgt dann, wie bereits erwähnt, durch Klicken auf in einem Durchgang.
PonyProg2000 bietet über die Menü-Funktion "Command" auch die Möglichkeit, die Speicherbereiche einzeln zu programmieren, zu vergleichen oder zu lesen, einige dieser Funktionen sind auch über Icons direkt auswählbar. Das ist sinnvoll, wenn z.B. nur eine kleine Änderung im EEPROM-Bereich nötig ist. Bei unserem Test-Projekt wird das EEPROM zwar nicht verwendet, trotzdem bietet es sich an, alles einmal auszuprobieren. Aber bitte beachten: Der Hersteller garantiert laut Datenblatt des AT90S2313 das Beschreiben des Flash-Speichers nur 1000 mal, beim EEPROM ist das weniger kritisch, hier sind ca. 100.000 Schreibzyklen möglich. In der Praxis hat sich aber gezeigt, dass diese Werte weit überschritten werden können und die ATmega-Serie garantiert sogar 10.000 Schreibzyklen beim Flash.

Fuse-Bits

Dieser Abschnitt wendet sich einer besonderen Funktionalität der AVR Mikrocontroller zu: den Fuse-Bits. Mit diesen lassen sich bei einigen AVRs bestimmte Funktionen einstellen, wie z.B. Brown-out-Detection (Reset bei Unterspannung), Clock-Selection (Taktauswahl), Memory Protection (Schutz gegen Lesen/Schreiben des Speichers), Boot-Optionen (für Selbstprogrammierung z.B. über RS-232) und einige mehr.
Der im oben verwendeten Test-Projekt 1 benutzte AT90S2313 besitzt nur 2 Fuses, die zum Schutz des Speichers dienen. Diese eignen sich nicht zum Experimentieren, deshalb verwende ich für die Demonstration der Fuse-Bits einen ATmega8L. Um die Sache praxisnah zu gestalten, zeige ich im Folgenden die Programmierung der Fuses für das Sensormodul des Temperatur-Messsystems. Wer also dieses System nachbauen möchte, kann die folgende Anleitung Schritt für Schritt durchgehen und am Ende sicher sein, dass die Fuse-Bits richtig gesetzt sind. Wer einfach mal so mit den Fuses experimentieren möchte, der kann die folgende Schaltung auf einem Steckbrett oder einer Punktrasterplatine aufbauen:

Diese Schaltung ist fast identisch zum Test-Projekt 1 weiter oben, der einzige Unterschied ist hier der ATmega8L. Damit man auch sieht, dass der Controller etwas tut, sollte man die in avr-test2.zip enthaltene Hex-Datei in den Controller laden. Es ist im Prinzip das gleiche Programm wie im Test-Projekt 1, dieses wurde aber an den ATmega8L angepasst. Wenn das Programm in einen fabrikneuen ATmega8L geladen wurde, dann sollte die LED ungefähr im Rhythmus 2s ein / 2s aus blinken.

Zuerst noch eine Warnung: Alle folgenden Manipulationen sollten nur dann ausgeführt werden, wenn die Kommunikation mit dem ATmega8L fehlerfrei funktioniert. Außerdem sollte man vor dem Absenden eines Fuse-Schreibbefehls genau prüfen, ob man wirklich die richtigen Fuses gesetzt hat, denn eine kleine Unachtsamkeit kann im schlimmsten Fall den Controller unbrauchbar machen!

An dieser Stelle gehe ich davon aus, dass alles richtig angeschlossen ist und funktioniert. Nun wird auf das Symbol [Security and Configuration Bits] geklickt und folgendes Bild sollte angezeigt werden:


Es kann durchaus sein, dass hier schon einige Haken gesetzt sind. Falls man vorher andere Aktionen mit PonyProg durchgeführt hat, dann hat das Programm möglicherweise die Fuse-Bits bereits ausgelesen und zeigt sie nun in diesem Bild an. Wie auch immer, an dieser Stelle sollte man unbedingt als erstes auf "Read" drücken, damit man wirklich den aktuellen Zustand der Fuses angezeigt bekommt und das sieht bei einem jungfräulichen ATmega8L so aus:


Im ersten Moment mag es etwas konfus klingen, aber: Ein Haken bedeutet hier: das Fuse-Bit ist programmiert und das entspricht einer logischen "0". Da dies immer wieder zu Missverständnissen geführt hat, liefert PonyProg seit der Version 2.06c eine kleine Hilfezeile mit, die im unteren Teil des Fensters zu sehen ist. Es gilt also:

= Fuse nicht programmiert = logisch "1"
= Fuse programmiert = logisch "0"

Die Datenblätter von Atmel verwenden immer die logischen Werte der Fuse-Bits und man sollte immer das Datenblatt zum verwendeten Controller bereithalten, wenn man Fuse-Bits ändern möchte. Das Datenblatt des ATmega8L verrät uns nun die Bedeutung der programmierten Fuses:

  • BOOTSZ1 und BOOTSZ0 (Zustand=00): Bootloader-Größe=1024 Words, Startadresse 0xC00 (Tabelle 82 des Datenblattes, wird im folgenden Test nicht weiter berücksichtigt und auch nicht verändert)
  • SUT1 und SUT0 (Zustand=10): Start-up Time 65ms nach Reset, Einstellung für internen Oszillator und langsam ansteigende Betriebsspannung (Tabelle 9 und 10 des Datenblattes)
  • CKSEL3-CKSEL0 (Zustand=0001): Interner Taktoszillator 1MHz (Tabelle 9 und 10 des Datenblattes)


Wer die Testschaltung aufgebaut hat, wird feststellen, dass die LED ungefähr in einem Takt von 4s blinkt. Das Testprogramm wurde jedoch so geschrieben, dass die LED bei einer Systemtaktfrequenz von 4MHz etwa im Sekundentakt blinken sollte. Daran kann man sehr gut erkennen, dass der interne 1-MHz-Oszillator aktiv ist. Das soll allerdings jetzt geändert werden und zwar folgendermaßen:

  • SUT1 und SUT0 (Zustand=11): Start-up Time 65ms nach Reset, Einstellung für Quarzoszillator und langsam ansteigende Betriebsspannung (Tabelle 5 des Datenblattes)
  • CKSEL3-CKSEL0 (Zustand=1111): Quarzoszillator im Bereich 3-8MHz (Tabelle 4 des Datenblattes)
  • CKOPT (Zustand=1): schneller Quarzoszillator (Tabelle 4 des Datenblattes)
  • BODEN (Zustand=0): Brown-out einschalten
  • BODLEVEL (Zustand=1): Brown-out Schwelle auf 2,7V setzen


Unter Beachtung der invertierten Logik der Fuse-Bits sollte man also die Fuses so setzen wie im folgenden Bild:


Wenn wirklich alles richtig gesetzt ist, dann kann man diese Einstellung durch einen Klick auf "Write" zum Controller senden. Wenn PonyProg die Programmierung erfolgreich abschließen konnte, dann verschwindet das Fenster und der Hauptbildschirm wird wieder sichtbar. Wer wirklich sicher sein möchte, dass die Fuse-Bits richtig geschrieben worden sind, kann jetzt nochmals die Funktion "Security and Configuration Bits" aufrufen und mittels "Read" den aktuellen Zustand einlesen, der natürlich mit dem vorher geschriebenen Zustand übereinstimmen sollte.

Übrigens, die LED in der Testschaltung blinkt jetzt im Sekundentakt und somit hat der Quarzoszillator die Taktversorgung des Controllers übernommen. Die Brown-out Funktion lässt sich auch kontrollieren, wenn man ein Labornetzgerät verwendet und dieses langsam auf eine Spannung unter 2,7V herunterstellt. Der Controller wird dann ein Reset ausführen und LED verlöschen.
Falls man die Programmierung am "lebenden Objekt", also am Sensormodul durchgeführt hat, dann sollte dieses jetzt vollständig funktionsfähig sein. Angeschlossene Temperatursensoren werden nun erkannt und die gemessenen Daten werden nun mit der richtigen Baudrate gesendet.

Damit ist dieser kleine Exkurs abgeschlossen. Das Arbeiten mit den Fuse-Bits ist eigentlich recht einfach, wenn man die invertierte Logik verstanden hat. Dennoch sollte man immer vorsichtig arbeiten und kritische Fuses, wie z.B. LOCK und RSTDISBL besser nicht ausprobieren.

Autor: Scott-Falk Hühn
Quelle: http://s-huehn.de/elektronik/ Hier lohnt es sich mal rein zu schaun, sehr schöne Elektronik-Seite!

Eine Bauanleitung für einen ISP-Adapter mit üblichen 10 poligem Wannenstecker (wie z.B. bei RN-Control und vielen anderen Boards) findet man hier:
http://www.roboternetz.de/phpBB2/vie...?p=18987#18987

Eine interessante Möglichkeit für den AVR Einstieg stellt auch unser Roboternetz-Projekt dar. Oft werden auch 10polige Wannenstecker als ISP-Anschluß zum programmieren genutzt. Dafür findet man fertige ISP-Programmieradapter (auch ISP-Dongle genannt) z.B. hier.