Home: www.rowalt.de

In der Zeitschrift FUNKAMATEUR 4/2002 habe ich eine AVR-Artikelserie gestartet, zu der monatlich ein Beitrag erscheint. Die Artikel erscheinen hier mit einer Verzögerung von etwa 2-3 Monaten. Das ist einfach eine Frage der Fairness, denn eine Zeitschrift lebt ja immerhin davon, daß die Zeitschriften auch verkauft werden. Wer nicht warten will, kann sich die Hefte aber auch im FUNKAMATEUR-Online-Shop nachbestellen.
Wichtig: Grobe Fehler werde ich auf den einzelnen Seiten natürlich korrigieren. Aber es würde zu viel Zeit kosten, nachträgliche Ergänzungen auf meiner Homepage logisch einzuordnen - dafür ist HTML einfach zu umständlich. Aber es ist langfristig geplant, die Serie in überarbeiteter und erweiterter Form auch als Buch zu veröffentlichen. Das wurde schon oft angefragt, geht aber nicht ganz so schnell - wenn schon, dann soll das Buch auch ordentlich sein.
Keine Angst vor Mikrocontrollern!
Der einfache Einstieg in die Welt der AVRs (1)
Roland Walter, DL7UNO

Die aktuellen Qelltexte und Compilate zu den Beiträgen

In diesem Artikel wird eine einfache Experimentierschaltung für AVR-Mikrokontroller beschrieben. Der Artikel richtet sich vor allem an Leute, die aus den bisher verfügbaren Informationen nicht recht schlau werden konnten. Auf Grundlage der Schaltung wird dann anhand von Beispielprogrammen das Innenleben der AVRs besprochen. Wir beginnen ganz von vorne. Ich hoffe, daß am Ende der eine oder andere Lust bekommt, eigenene Beispiele aufgrund der vorgestellten Schaltung im FUNKAMATEUR vorzustellen.

Es sind diverse Test-Boards für die AVR-Reihe im Angebot. Aber leider haben deren Entwickler nur zu oft versucht, alle denkbaren Probleme gleich mit einem mal zu erschlagen. Das Ergebnis muß einfach unübersichtlich und schwer nachvollziehbar sein. Aber ein Ingenieur ist eben kein Pädagoge und der begeisterte AVR-Fan verliert sich nur allzu schnell in unnötigen Spielereien. Praktisches Beispiel: Das "Hello World" der Mikrokontroller-Welt ist fast immer eine blinkende Leuchtdiode, statt sich erst einmal darauf zu konzentrieren, wie man die Leuchtdiode überhaupt zum Leuchten kriegt. Der Blink-Code ringsherum verwirrt nur und sollte erst der zweite oder dritte Schritt sein.

Als Programmiersprache nehmen wir das BASCOM-AVR-Basic. Diese Sprache ist recht einfach zu erlernen und oft für ihren effzienten Code gelobt worden. Es gibt eine kostenlose Version von BASCOM, die lediglich eine Beschränkung der Codegröße hat. Der AVR vom Typ AT90S2313, den wir verwenden, kann vollständig mit der kostenlosen Version ausgenutzt werden. Sie brauchen also kein Assembler zu lernen. Ohnehin wurden die AVRs speziell für die Programmierung mit Hochsprachen entwickelt. Mit einer guten Einführung und entsprechenden Beispielen kommt man in BASCOM schnell voran. Es soll aber auch nicht verschwiegen werden, daß die Online-Hilfe von BASCOM stark verbesserungswürdig ist und die Sprache selbst an einigen Stellen Inkonsistenzen aufweist. Wir nehmen sie trotzdem.

AVR ganz allgemein

Die kleinen und preiswerten AVR-Prozessoren (der AT90S2313-10PI kostet etwa 6 Euro) gehören zu den modernsten Universal-Mikrokontrollern. Das Design wurde an der Universität für Technologie in Trondheim/Norwegen entwickelt und dann von der Firma Atmel gekauft. Die Entwickler behaupten, daß "AVR" rein gar nichts meint und ganz besonders nicht "Alf og Vegard's RISC". Alf und Vegard sind nämlich die Namen der beiden Studenten, die das AVR-Design in ihrer Diplomarbeit entworfen hatten.

Der AVR-Kern ist außergewöhnlich klein und enthält nur rund 4000 Gates. Atmel als einziger Hersteller von Prozessoren dieses Designs bietet drei Serien an: AT-tiny (tiny=winzig), AT90 und ATmega. Der Prozessor ist hervorragend geeignet für Schaltungen, die früher auf Prozessoren wie dem Motorola 6805 beruhten, dem Intel 8051, MSP 430, oder dem PIC von Microchip. Nicht nur ich bin der Meinung, daß der AVR von allen diesen Prozessoren der innovativste ist und die höchste "Lebenserwartung" hat.

Der AVR ist ein RISC-Prozessor (RISC="Reduced Instruction Set Computer"). Ein traditioneller CISC (CISC="Complex Instruction Set Coding") verfügt über mächtige Befehle, die in einer Vielzahl von Einzelschritten ausgeführt werden. Das macht Sinn, denn z.B. muß der Befehl erst decodiert werden und die CPU hat in dieser Zeit nichts zu tun. Ebenso war der RAM früher viel langsamer als die CPU und wiederum hatte die CPU zu warten. Es lag daher nahe, daß die CPU in der Wartezeit mit komplexen Befehlen beschäftigt wird. Mit der Entwicklung der Technik bot es sich dann an, einfach die Masse der selten benötigten Befehle wegzulassen, und in der Hardware nur diejenigen zu implementieren, die auch häufig benutzt werden. Alle anderen Befehle werden dann vom Compiler aus diesen elementaren Befehlen aufgebaut. Der stark reduzierte RISC-Befehlssatz erfordert keine Dekodierung, und das macht ihn schnell, spart Platz auf dem Chip und macht ihn damit billig.

Einen echten RISC in Assembler zu programmieren, ist manchmal recht umständlich, weil die fehlenden komplexen Befehle eben durch Software ersetzt werden müssen. Der AVR wurde deshalb als RISC mit Anleihen zum CISC entworfen. Neben den Instruktionen, die in einem einzigen Takt ausgeführt werden, gibt es auch solche, die 2 bis 4 Takte zur Ausführung benötigen. Wer lieber mit Assembler programmiert und vom PIC zum AVR umsteigt, wird speziell diese Instruktionen heiß lieben lernen. Außerdem ergibt sich logisch, daß AVR-Programme kürzer sind als PIC-Programme. Der AVR-Befehlssatz ist aber auch nicht ganz so umfangreich, wie es Atmel vortäuscht, denn einige der Instruktionen im offiziellen Befehlssatz beruhen schlicht auf einem anderen, diesmal echten Befehl:
BSET s  1001 0100 0sss 1000   Bit Set in SREG
SEC     1001 0100 0000 1000   Set Carry Flag
SEH     1001 0100 0101 1000   Set Half Carry Flag
SEI     1001 0100 0111 1000   Set Global Interrupt Flag
SEN     1001 0100 0010 1000   Set Negative Flag
SES     1001 0100 0100 1000   Set Signed Flag
SET     1001 0100 0110 1000   Set T Flag
SEV     1001 0100 0011 1000   Set Overflow Flag
SEZ     1001 0100 0001 1000   Set Zero Flag
Atmel schummelt: Von den 9 Befehlen zum Setzen eines Bits im Statusregister ist nur BSET echt.

Alle ICs der AVR-Famile sind im Prinzip gleich aufgebaut. Die Einzeltypen unterscheiden sich nur in ihrer Ausstattung, z.B. Größe des Speichers, Anzahl und Art der Timer, einige haben einen A/D-Wandler u.s.w.. Zum Kennenlernen ist der AT90S2313 völlig ausreichend. Noch preiswerter ist der bekanntere AT90S1200, bei dem aber die Programmiersprache BASCOM nicht einsetzbar ist. Außerdem hat der 1200 keine UART (serielle Schnittstelle), und gerade die kann beim Debuggen mehr als nützlich sein.

Mit der "Peripherie" unserer Testschaltung, die aus Tastern, LEDs, Speaker, Drehreglern und serieller Schnittstelle besteht, kann alles getestet werden, was AVRs zu bieten haben. Die einzige Ausnahme ist der SPI-Bus, mit dem man z.B. den Datenaustausch zwischen mehreren AVRs organisieren kann. Das soll uns aber nicht wehtun, weil der AT90S2313 ohnehin keinen eingebauten SPI-Bus hat.

Für die folgenden Programmbeispiele müssen wir uns auf eine Schaltung festlegen, die bei allen Beispielen verwendet wird. Anderenfalls müßte der Anwender das Programm-Listing jedesmal an seine eigene Schaltung anpassen und es treten einfach zu viele Fehlerquellen auf. Die verwendete Test-Schaltung (Bild 1) ist trotz ihrer Einfachheit völlig ausreichend und läßt genug Raum für eigene Ideen.

Die Bauteilliste (siehe unten) orientiert sich an Bezeichnungen und Preisen des Elektronikladens SEGOR electronics. SEGOR ist schlicht und einfach ein Elektronik-Händler, mit dem ich in der Vergangenheit ausgezeichnete Erfahrungen gemacht habe. Ansonsten verdiene ich nichts an der Nennung des Firmen-Namens.

AVR-Platine und Programmiergerät sind zwei getrennte Einheiten, damit das Programmiergerät für andere Schaltungen wiederverwendet werden kann. Das Programmiergerät eignet sich übrigens für alle AVR-Typen einschließlich der ATMega- und der ATiny-Serie. Davon ausgenonmen sind nur die wenigen AVRs, die sich nicht seriell mit 5 Volt programmieren lassen (ATiny10, ATiny11 und ATiny28).

Das Programmiergerät


Beim Programmiergerät werden die wenigen Bauelemente per Freiluft-Verdrahtung in einem 25poligen SUB-D-Steckergehäuse untergebracht. (Bild 2) Die Bauteile können bei Bedarf mit etwas Heißkleber fixiert werden. Der SUB-D-Stecker wird an die parallele Schnittstelle eines PCs angeschlossen. Sogar die Stromversorgung der gesamten Schaltung kann vom Programmierstecker übernommen werden.

Die Stromversorgung per LPT funktioniert zuverlässig, hat aber auch einen Nachteil: Die LPT liefert leider nicht immer die versprochenen 5 Volt. In der Praxis muß man nur allzuoft mit 3,3 Volt klarkommen. Das geht, aber bei Spannungen unter 4 Volt darf der AVR beim Brennen nur bis maximal 4 MHz getaktet werden. Bitte verringern Sie die Kapazität des Elkos auf keinen Fall auf Werte unter 100uF. Beim Brennen der Speicheradressen treten kurzzeitig relativ hohe Ströme auf und die Betriebsspannung bricht zusammen, wenn sie nicht vom Elko genügend gepuffert wird. Sie würden das daran merken, wenn das Brennen immer wieder bei etwa der selben Adresse abgebrochen wird.

Wenn man ein LPT-Verlängerungskabel hat, kann man den Programmierstecker wie im Foto gezeigt anfertigen. Das Steckergehäuse mit Flachbandkabel stammt von einer alten Multi-I/O-Karte aus der Computer-Schrottkiste. Im anderen Fall nimmt man einen normalen SUB-D-Stecker mit einem maximal 2 Meter langem möglichst geschirmten Kabel. Als Platinenstecker wird eine abgekniffene IC-Fassung verwendet (zu dieser Technik siehe weiter unten), bei der die Reset-Leitung farblich gekennzeichnet wird. Eine SIL-Buchsenleiste bildet das Gegenstück auf der Platine.

Das Brennen des AVRs erfolgt unter Windows mit dem Freeware-Programm TwinAVR (alter Name: WinAVR) oder auch dierkt mit Bascom. Zum Debuggen via RS232 und zum Ein/Ausschalten der LPT-Betriebsspannung habe ich das Programm AVRterm geschrieben. Dieses Programm ist auch in der Lage, die Handshake-Leitungen wie im Schaltbild wiedergegeben zu bedienen. Zum Brennen unter MS-DOS kann alternativ auch die Software SP12 verwendet werden. Für DOS steht aber kein spezielles Terminalprogramm zur Verfügung.

Das Testboard

Das Testboard wurde ursprünglich nur in einer AT90S2313-Variante entworfen. Dieses Board (Variante 1) ist und bleibt auch die Grundlage für meine Einstiegsartikel.
Darüber hinaus habe ich im FUNKAMATEUR 02/2003 aber noch Variante 2 für die AVR-Typen AT90S4433/2333 und ATmega8 vorgestellt. Aber bitte überlegen sie genau, für welches Board Sie sich entscheiden! Für Einsteiger ist Variante 1 mit dem kleinen AT90S2313 erheblich besser geeignet - zum einen, weil sich meine Artikel auf diese Variante direkt beziehen (Sie müssen also nicht umdenken), und zum anderen, weil mehr nicht unbedingt gleich besser (für Einsteiger) ist. Stellen Sie sich bitte plastisch vor, Sie müßten einen neugekauften Videorecorder programmieren. Würden Sie sich in einer solchen Situation eher mehr oder eher weniger Einstellmöglichkeiten wünschen? Wer bereits über Mikrocontroller-Erfahrungen verfügt, wird aber sicher Variante 2 bevorzugen.
Noch einmal, weil es mir wichtig ist: Die Erfolgsquote beim Lernen ist immer höher, wenn man in kleinen Schritten lernt. Und niemand hindert Sie, Variante 2 später aufzubauen.
Die meisten Ingenieur-Professoren begehen in dieser Hinsicht übrigens meist einen pädagogischen Super-Gau nach dem anderen.

Hier ist die Schaltung für Variante 1 und die Bestückung für beide Varianten.
Die Schaltungen und Platinenlayouts beider Varianten können im EMF-(Vektor)-Format als ZIP-Datei (90KB) heruntergeladen werden.
Zum Betrachten und Ausdrucken der EMF-Dateien unter MS-Windows 9x/ME/XP/NT/2000 kann MetaView (18KB) verwendet werden.

Die nötigen Pegel auf der RS232 werden wie gewohnt durch einen MAX232 bereitgestellt. Bitte achten Sie darauf, einen MAX232-Sub-Typ zu kaufen, der wie angegeben, mit 100nF-Kondensatoren arbeitet. Beim MAX232ACPE ist das zum Beispiel der Fall.

Der "krumme" Quarz ist ein billiger Massentyp. Frequenzen wie 3,6864 MHz, 7,3728 MHz und 9,216 MHz erlauben eine fehlerfreie Generierung von Standard-Baudraten wie 9600, 19200, 38400 und 115200. Sie sparen sich viel Ärger, wenn sie eine dieser Frequenzen nehmen. Die Beispielprogramme von mir basieren auf 3,6864 MHz.

Die LED-Vorwiderstände (1,2 KOhm) wurden für Low-Current-Typen bemessen, die bei 1,6...2V nur etwa 2 mA benötigen.

Die beiden Taster sind sogenannte Mini-Impulstaster für Leiterplattenmontage.

Die Einstellregler sind an sich unkritisch und können Werte zwischen 10...50 KOhm haben. Wichtig ist nur, daß zwei gleiche Einstellregler verwendet werden, damit man eine gleiche Einstellung beider Regler optisch wahrnehmen kann.

In vielen Schaltungen wird der Reset-Eingang mit einem Pullup-Widerstand zwischen 10 und 50KOhm nach Vcc gezogen und zusätzlich mit 100nF nach Masse geblockt. Dies macht bei Verwendung eines Reset-Tasters auch wirklich Sinn. Da der Reset-Impuls bei uns aber aus der LPT kommt, benötigen wir diese Bauelemente nicht, der AVR-interne Pullup-Widerstand am Reset-Eingang reicht hier völlig.

Der Speaker ist ein kleiner Piezo-Schallwandler. Ich habe ihn vorgesehen, weil man damit einen viel größeren Frequenzraum darstellen kann als mit einer LED. Ein dynamischer Schallwandler mit einer einem Gleichstromwiderstand (nicht Impedanz) von mindestens 250 Ohm ist ebenfalls verwendbar.

Für die RS232 wird ein abgewinkelter 9poliger SUB-D-Stecker (männnlich) verwendet. Hier wird per Nullmodemkabel die Verbindung zum PC hergestellt. Beim Nullmodemkabel sollten die Handshake-Leitungen beschaltet sein. Die Handshake-Leitungen verwenden wir mit einem speziellen Terminal-Programm (AVRTerm) als zusätzliche digitale Ein- und Ausgänge. Es wäre schade, wenn man diese Möglichkeit verschenkt.

Die Platine (und die Bauteil-Stückliste) sieht zusätzlich eine LED zur Kontrolle der Versorgungsspannung und eine externe Stromversorgung mit 78L05 vor, die im Schaltplan nicht eingezeichnet sind.

Die beiden ICs werden auf Sockel gesteckt. AVRs sind "elektrisch robust". Aber man vermeidet Auslöt-Hinrichtungen, wenn man bei einem Fehler nicht sich selbst, sondern den AVR verdächtigt - und das kommt ganz bestimmt irgendwann vor. Wer mehrere AVRs vorrätig hat, kann sogar doppelstock-sockeln: Man läßt die AVRs grundsätzlich auf je einem eigenen Sockel, der auf den festgelöteten Sockel gesteckt wird. Dies vermeidet das Verbiegen und Abbrechen der empfindlichen IC-Beine.

Die Steckverbindungen

Jetzt kommt ein wichtiges praktisches Detail: Für die Steckverbindung werden sogenannte SIL-Sockelstreifen verwendet, in die einfach starrer Schaltdraht (0,5mm) gesteckt wird. Die SIL-Sockelstreifen sehen aus wie lange einreihige IC-Fassungen, die man an einer beliebigen Stelle trennen kann. Wer keine hat, kann sie mit Hilfe eines Seitenschneiders auch selbst aus IC-Fassungen herstellen. Die IC-Fassung sollte man nicht zwischen den Anschlüssen trennen, sondern genau dort, wo ein Anschluß ist. Anderenfalls bricht das Plastik an ungewünschter Stelle weg. Die Bruchstelle eventuell mit einer Schlüsselfeile nacharbeiten.

Wer nur flexiblen Draht hat, kann sich mit jeweils einem Pin einer IC-Fassungen oder eines SIL-Sockelstreifens behelfen: Man steckt den Draht in einen der Kelche und verlötet ihn dort. Eventuell kann man mit etwas Heißkleber direkt über der Lötstelle einen Knickschutz schaffen, der auch als "Griff" gute Dienste leistet. Diese Art Verbindungsdraht hat sich bei mir passabel bewährt, obwohl ich den starren Draht vorziehe.

Für die Stromversorgung der Testschaltung gibt es zwei Varianten:

1.) Bei voller Bestückung der Platine wird die Betriebsspannung ganz normal aus einem Netzteil gewonnen, der Maximalstrom (alle LEDs und der Speaker an) beträgt hier etwa 34 mA. Wer sich für diese Variante entscheidet, kann natürlich die Schottky-Dioden und den Elko im Programmierstecker weglassen.

2.) Man bezieht die Versorgungsspannung aus der LPT. Bei etwas Pech muß man mit nur 3,3 Volt Betriebsspannung rechnen, die aber ausreichen, um die Schaltung betreiben zukönnen. Bei 3,3 Volt habe ich eine Stromaufnahme von maximal 10mA gemessen (LEDs und Speaker an). Die Bauelemente für die Versorgungsspannung (Graez, Elko, 78L05 und einen der 100nF-Kondensatoren) läßt man entweder ganz weg oder schließt einfach kein Netzteil an. Der 100nF-Kondensator direkt hinterm 7805 sollte keinesfalls eingespart werden. Sowohl TwinAVR als auch die von mir geschriebenen Experimentierprogramme enthalten spezielle Funktionen zum Ein- und Ausschalten der LPT-Versorgungsspannung, was die Handhabung sehr bequem macht. Diese Variante reicht für den Zweck der Schaltung völlig aus. Nachteilig ist sie aber, bei späteren Erweiterungen wie z.B. eine AVR-Taktfrequenz über 4MHz oder die Mitversorgung von weiteren Peripherie-Bauteilen. Außerdem läuft das Berennen des AVRs bei vollen 5 Volt etwas schneller.


Platinenhersteller

Ich habe einen Leiterplattenhersteller kontaktiert, bei dem die gebohrte und vorverzinnte Platine gegen Rechnung (keine Nachnahme erforderlich) unter dem Stichwort "DL7UNO AVR Board, Variante X" bestellt werden kann. Bitte unbedingt die Platinenvariante (1 oder 2) mit angeben. Bestellungen per Mail sind möglich. Der Preis pro Platine ist 5,95€ und der Versand kostet zusätzlich 4,06€. Hier ist die Adresse:
GS Electronic, Lechfeld 6, D-53844 Troisdorf
Tel.: 02241-44751, Fax: 02241-390095
Mail: gselectronic@gsel.de, Web: www.gsel.com

Stückliste für Bestellungen bei Segor Electronic


Artikel          Stück  Preis Preis  Kommentar
                        (Euro)(Euro)
AT90S2313-10PI     1    6,20   6,20  AVR-Mikrokontroller DIP20
MAX 232 ACPE       1    3,94   3,94  RS232-Pegelwandler 2Tx/2Rx 116kbit DIP16
78L05              1    0,30   0,30  Spannungsregler +5V 100mA, TO92
B 80C1000DIL       1    0,40   0,40  DIL-Brücke 1A =DF02M (Graez)
LED 3gn-2mA        1    0,20   0,20  LED 3mm grün 2mA
LED 3ge-2mA        1    0,20   0,20  LED 3mm gelb 2mA
LED 3rt-2mA        2    0,20   0,40  LED 3mm rot 2mA
BAT 46             5    0,21   1,05  Schottky-Diode 100V 0,15A DO-35
33p-R2.5-NPO       2    0,10   0,20  33pF-100V 2% RM2,5 NPO
u10-R2.5-Z5U       7    0,10   0,70  100nF-63V 20% Z5U RM2,5
ELRA 220u-16       1    0,15   0,15  Elko 220uF-16V 6,3x11mm RM2,5
ELRA 470u-16       1    0,21   0,21  Elko 470uF-16V, 8x11mm, RM3,5
MF 220R-1%         3    0,05   0,15  Widerstand 220 Ohm, 0,6W
MF 1k2-1%          4    0,05   0,20  Widerstand 1,2k, 0,6W
Q  3,6864          1    1,00   1,00  Quarz 3,6864 MHz HC18/U
PE 1540P           1    1,20   1,20  Piezo-Element ohneTreiber
PT10LV-25K         2    0,26   0,52  Trimmpoti 25k liegend
KHT 9/18,5mm       2    0,60   1,20  Kurzhubtaster 1xEIN 180'
DILLAB14           1    0,36   0,36  Präzisionsfassung DIL14
DILLAB16           1    0,41   0,41  Präzisionsfassung DIL16
DILLAB20           1    0,51   0,51  Präzisionsfassung DIL20
SILLAB32           2    0,92   1,84  SIL-Sockelstreifen 32polig
DS09M-90'          1    0,82   0,82  Sub D Stecker 90' Print
DS25F              1    0,60   0,60  Sub D Buchse 25pol Lötkelch
DS25-POST/grau     1    2,00   2,00  Sub D Steckergehäuse 180', grau, Kunststoff
Nullmodem-DS09/3m  1    6,60   6,60  RS232 Nullmodemkabel 3m
DS25 Kab.- 2m      1    7,62   7,62  Ser./Par.Kabel 25p.1:1 2m ("LPT-Verlängerung")
Draht 0,5 rt       1    0,92   0,92  Rolle Schaltdraht (starr) YV d=0,5mm rot
Tip: Die 100nF-Kondensatoren kauft man am besten gleich in der 100er-Tüte - man braucht sie ja ohnehin immer wieder mal.

Segor Electronic, Kaiserin-Augusta-Allee 94, D-10589 Berlin-Charlottenburg
Tel: 030-4399843 (Auskunft/Bestellung), Fax: 030-4399855
www.segor.de (Katalog etwa 1,44MB)