Tutorial Microcontroller Teil 2

Hier möchte ich Schritt für Schritt zeigen, wie einfach es ist, einen AVR Microcontroller mit BASCOM AVR zu programmieren.

Der Programmieradapter:

Alle mir bekannten AVR Controller lassen sich über die serielle SPI Schnittstelle programmieren.
Hierzu werden die Anschlüsse MOSI, MISO und CLK benutzt.
Die Pins des Controllers können nach der Programmierung für andere Zwecke benutzt werden, was so auch vorgesehen ist.
Im Programmiermodus (Reset aktiv) dienen die Pins als serielle Programmierschnittstelle.
Damit benötigt man kein spezielles Programmiergerät, sondern kann im einfachsten Fall einen einfachen Adapter verwenden, den man am Parallelport eines PCs anschließt (STK200 Adapter).

Ich habe mir vor vielen Jahren einen Programmieradapter selbst gebaut, der immer noch seinen Dienst verrichtet:

Ich benutze ihn in Verbindung mit einem alten Laptop, welcher unter Windows XP läuft.
Vermutlich wird das direkte Ansprechen des LPT Ports unter Windows 7 oder höheren Betriebssystemen nicht mehr funktionieren.
Wer noch einen alten PC übrig hat, kann diesen Selbstbauadapter verwenden.
Heute sind preiswerte USB Adapter am Markt verfügbar, weshalb ich heute keinen Adapter mehr selbst bauen würde.

Hier das Schaltbild des STK200 Adapters:

Um den LPT Port zu schützen und das Signal zu "regenerieren" wurde der Pufferbaustein 74HC244 zwischen LPT Port und den zu programmierenden Microcontroller geschaltet.
Die Schaltung wird mit +5V aus einem Labornetzgerät versorgt.

Die Software:

Die Software BASCOM-AVR kann von der Website mcselec.com als Demoversion aus dem Downloadbereich heruntergeladen werden.
Die Demoversion ist auf 4KB Code beschränkt, was erst bei größeren Controllern zum Problem wird.
So hat z.B. der ATtiny2313 lediglich 2KB Flash Speicher und kann daher voll ausgereizt werden.
Für kommerzielle Zwecke ist in jedem Fall eine lizenzierte Version nötig.

Einstellungen:

Im Menü Options => Programmer ist der verwendete Programmieradapter auszuwählen.
Ich habe hier den STK200/STK300 Programmer ausgewählt, da ich ja einen LPT Adapter benutze.
Bei diesem Adapter ist die Adresse des Ports (378 für LPT1) und ein Wert für Port delay einzutragen.
Bei meinem alten Gerät funktioniert die Programmierung zuverlässig mit dem Wert "10".

Das erste Programm:

Wird Bascom AVR gestartet, so wird das zuletzt bearbeitete Projekt geöffnet.
Da wir ein neues Projekt erstellen möchten klicken wir auf das entsprechende Symbol in der Menüleiste oder wählen den Dialog File => New aus.

Jetzt wählen wir im Menü unter Options => Compiler => Chip den Controller aus, für den das Programm übersetzt werden soll (hier ein ATtiny2313).

Jetzt beginnen wir mit dem Programm!

Zunächst kommen Compileranweisungen.
Mit $crystal = 1000000 teile ich dem Compiler mit, mit welcher Taktrate der Controller läuft.
Das ist wichtig, damit der Compiler z.B. Zeitschleifen korrekt umsetzt.

Danach folgen Variablen und weitere Einstellungen, die die Hardware betreffen.
Wir haben am Pin 12 des Controllers eine LED angeschlossen und wollen diese blinken lassen.
Laut dem Datenblatt ist das der Portpin PB0 (Pin 0 des I/O Ports "B").

Es muss nun entweder der gesamte Port B oder aber lediglich der Pin PB0 als Ausgangspin definiert werden.
Dies passiert mit der Anweisung "Config Pinb.0 = Output".
Damit wird der bisher in seiner Funktion noch nicht festgelegte I/O Port als Ausgangsport definiert.

In der Regel sollen Mikrocontrollerprogramme endlos laufen.
Daher wird das Hauptprogramm in eine "do - loop" Schleife eingebunden.

Das Demoprogramm schaltet jetzt mit dem Befehl "Portb.0 = 1" den Portpin PB0 ein, wartet 500 Millisekunden (waitms 500), schaltet den Portpin aus und wartet weitere 500 Millisekunden.
Danach beginnt das Programm von vorne.

Da unser Programm jetzt fertig erstellt ist, lassen wir vom Compiler die Syntax prüfen, indem wir auf das Symbol in der Taskleiste klicken oder den Dialog "Program => Check Syntax" auswählen.

Spätestens jetzt werden wir aufgefordert, das Projekt zu speichern.
Wir geben also einen Dateinamen ein und speichern das Projekt ab.
Findet der Compiler einen Fehler, so wird die Zeile angegeben, die für den Compiler ein Problem darstellt.
Ist der Check erfolgreich, kann das Programm nun durch einen Klick auf das Symbol oder den Dialog "Program => Compile" kompiliert werden.

Wir haben jetzt ein fertig kompiliertes Programm und damit den HEX Code für den Controller vorliegen.
Dies muss nun noch auf den Controller übertragen werden.

Für die folgenden Schritte muss der Mikrocontroller mit dem Programmieradapter verbunden sein!

Hierzu klicken wir auf das Symbol um den Programmer aufzurufen oder wählen aus dem Menü "Program => Send to chip => Program" aus.

Jetzt startet das Programm, welches den Programmcode in den Controller überträgt.
Zunächst prüft das Tool, ob der angeschlossene Chip dem entspricht, den wir im Compiler eingestellt haben.
Stimmt er nicht oder liegt ein Kommunikationsfehler vor, gibt es eine Fehlermeldung

Das folgende Bild zeigt die in den nächsten Schritten zum Einsatz kommenden Funktionen:

Sollte der Chiptyp nicht erkannt worden sein, kann der Chip mit einem Klick auf "Identify chip" neu eingelesen werden.

Zunächst testen wir durch einen Klick auf "Blank check of flash ROM", ob der Chip gelöscht ist.
Vor jedem Schreibvorgang muss der Flash Speicher zunächst gelöscht werden!

Sollte der Chip nicht gelöscht sein, kann dies mit einem Klick auf "Erase chip" erledigt werden

Jetzt können wir unser Programm mit dem Button "Write buffer to flash ROM" in den Chip übertragen.

Der Mikrocontroller ist jetzt fertig programmiert!

"Fusing":

Mit den so genannten Fuse Bits werden grundlegende Eigenschaften des Controllers verändert.
Möchte man die Taktrate ändern oder einen externen Takt verwenden sind hier die Einstellungen anzupassen.

ACHTUNG: falsches Setzen der Fusebits macht den Controller unbrauchbar!

Hier die Fusebits für den ATtiny2313 (Werkseinstellungen):

Die oben gezeigten Einstellungen sind die Werkseinstellungen für einen ATtiny2313.
Wie man an Fusebit KLA987 sehen kann, bezieht der Controller seinen Takt von dem internen RC Oszillator, der auf 8MHZ läuft.
Das Fusebit C weist den Controller an, diesen durch acht zu teilen, weshalb wir auf eine Taktrate von einem Megaherz kommen.
Diese hatten wir auch im Demoprogramm angegeben ($crystal= ...).

Unkritisch ist es, den Frequenzteiler abzuschalten (Fusebit C), um den Controller auf 8MHZ zu betreiben.
Möchte man einen externen Quarz anschließen, muss dessen Frequenzbereich bei dem Fusebit KLA987 angegeben werden.
Eine externe Taktversorgung (Quarzoszillator) kann hier auch angegeben werden.
Vorsicht: Setzt man dieses Byte, muss der Quarz auch vorhanden sein, ansonsten komme ich nicht mehr an den Controller ran!
Daher steckt auch meinem Steckbrett immer ein 10 MHZ Quarz an den Anschlüssen für den Controller.

Hat man sich entschieden, wirklich ein Fusebit zu ändern, passiert dies durch einen klick auf die Schaltfläche "Write FS".

Bevor man an den Fusebits etwas ändert, ist ein Blick in das Datenblatt den Mikrocontroller sinnvoll (z.B. System Clock and Clock Options).

Hier endet auch die Einführung in die Welt der AVR Microcontroller.
Im Internet finden sich massenhaft Hinweise zu der Programmiersprache BASCOM AVR.
Weiterhin bietet die Onlinehilfe des Programms immer ein Codebeispiel, wie ein Befehl zu verwenden ist.
Grundlegende Kenntnisse in BASIC sind natürlich hilfreich.
Im Internet finden sich auch Hinweise, wie man zeitkritische Anläufe behandelt.
Durch die Nutzung der internen Timer kann man z.B. Phasenanschnittsteuerungen oder schnelle Zählaufgaben (Frequenzzähler, Durchflussmessung via Impulsgeber) leicht in den Griff bekommen.
Diverse Beispiele zeigen auch die kleinen Programme meiner Rubrik "Microcontroller Projekte"

Ich wünsche nun viel Erfolg bei der Anwendung des neuen Wissens.
Fragen gerne an klaus(at)taeubl.de !

 

 

 

 

 

 

© klaus(at)taeubl.de