Standardisierte Hardware hat dem PC zu seinem Erfolg verholfen. In der Mikrocontrollertechnik ist dem Arduino ein vergleichbarer Erfolg gelungen. Mit aufsteckbarer Hardware, die als Shield bezeichnet wird, stehen Schaltungen wie Motorbrücken oder EKG, Ethernet oder XBEE-Karten und vieles mehr zur Verfügung. Da ist es naheliegend, diese Hardware auch in C zu programmieren. Aus diesem Blickwinkel ist dieses Buch geschrieben. Es wendet sich an Mikroelektroniker, die bereits »Hello world« hinter sich haben und auch mit einem Steckbrett umgehen können. Es wird gezeigt, dass nicht nur der Arduino infrage kommt, sondern auch mit älteren Prozessoren wie dem ATmega8 und mit verschiedensten Programmiergeräten gearbeitet werden kann. Geordnet nach Preisklassen, wird die Hardware vorgestellt.
Wer Mikrocontroller in C programmieren will, findet in diesem Buch einen entsprechenden Kurs, bei dem zumindest einfache C-Kenntnisse vorausgesetzt werden. Inhalt ist die Grundlage für die Programmierung von Mikroprozessoren.
Auch die serielle Schnittstelle wird besprochen. Die Programme sind so geschrieben, dass sie für den ATmega8 und ATmega328P verwendet werden können. In Kapitel 6.3 wird die Standardein- und -ausgabe, wie scanf und printf, festgelegt. Die Methoden, um die serielle Schnittstelle mit dem Atmel Studio anzusprechen, werden in den Projekten angewandt.
Programmentwicklung mit Zustandsdiagrammen und Automatentabellen wird ebenfalls behandelt. Die damit gelösten Probleme sind vollständig in C-Programme umgesetzt. Lesern, die Zustandsdiagramme noch nicht in der Praxis eingesetzt haben, sei dieser Abschnitt besonders ans Herz gelegt.
Zur Behandlung abgeschlossener und vollständig gelöster Probleme werden Physik, Elektronik, Regelungstechnik und Programmierung besprochen. Die Projektbeschreibungen beschränken sich nicht auf eine Anleitung, um die Projekte nachbauen zu können, sondern behandeln auch die wesentlichen theoretischen Grundlagen zur Problemlösung. Nach der Lektüre dieses Buchs wird der Leser dank der diskutierten Grundlagen neue Probleme lösen können.
Weitere Informationen zu diesem Buch finden Sie im Internet unter www.avr-ploetzeneder.com.
1Zahlendarstellung
1.1Zehner- oder Dezimalsystem
1.2Binärsystem
1.2.1Positive Binärzahlen
1.2.2Positive und negative Zahlen im Binärsystem
1.2.3Rechnen im Binärsystem
1.3Oktalsystem
1.4Hexadezimalsystem
2Hardware
2.1Richtlinien zur Auswahl der Hardware
2.2Hardware-Auswahl bei einer Investition von 100 Euro
2.2.1STK500
2.2.2Dragon mit Arduino
2.3Hardware-Auswahl bei einer Investition von 50 Euro
2.3.1STK500-kompatibler Programmieradapter mit Arduino
2.4Hardware-Auswahl bei einer Investition von deutlich unter 50 Euro
2.4.1Arduino mit Bootloader
2.5Alternative Entwicklungs-Boards
2.6Alternative Programmiergeräte
2.7Empfehlung
3Softwaretools zur Programmierung
3.1Entwicklungsumgebung
3.2Blinklicht mit dem Atmel Studio 6
3.3Blinklicht mit CodeVisionAVR
4Perfektionskurs in C
4.1Variablen und Konstanten
4.1.1Character
4.1.2Integer
4.1.3Long
4.1.4Float und Double
4.2Entscheidungsstrukturen
4.2.1If
4.2.2If-else
4.2.3If-else-Kette
4.2.4Kurzform für die Kontrollstruktur mit ternärem Operator
4.2.5Switch
4.3Modulooperator
4.3.1Zerlegen einer Zahl in Einer- und Zehnerstelle
4.3.2Umwandlung einer dreistelligen Zahl in einen String
4.3.3Modulo in einer Schleife mit dem Schleifenindex
4.4Bitweiser Zugriff auf ein Byte
4.4.1Setzen von Bits mit dem Oder-Operator
4.4.2Löschen von Bits mit dem Und-Operator
4.4.3Toggeln von Bits mit dem Exklusiv-Oder-Operator
4.5Unterprogramme
4.5.1Definition, Deklaration und externe Vereinbarung
4.6Zeiger
4.6.1Zeiger auf Integer
4.7Schleifen
4.7.1For-Schleife
4.7.2While-Schleife
4.7.3Do-while-Schleife
4.7.4Schleifen aussetzen
4.8String
4.8.1Aufbau von Strings
4.8.2String-Funktionen mit Format-String
4.9Ausgabe mit Formatangabe
4.10Eingabe mit Formatangabe
4.11Arrays und Zeiger
4.11.1Zeiger und Adressen
4.11.2Funktion String-Länge mit Zeiger
4.11.3Funktion strlen() mit Zeigerarithmetik
4.11.4Zeichenketten und Character-Zeiger
4.11.5Array von Zeigern
5Die serielle Schnittstelle
5.1Die serielle Schnittstelle am PC
5.2Elektrisches Signal der seriellen Schnittstelle
5.3Verdrahtung der RS-232-Schnittstelle
5.4Verfügbares Terminal-Programm
5.4.1Hyperterminal
5.4.2HTerm
5.4.3Terminal der Entwicklungsumgebung CodeVisionAVR
5.5Terminal-Programme im Sourcecode
5.5.1Terminal-Programm mit LabVIEW
5.5.2Terminal-Programm mit C#
5.6Terminal-Programm testen
6Programmierung der seriellen Schnittstelle des AVR
6.1Programmierung mit CodeVisionAVR
6.2Programmierung im Atmel Studio
6.3Programmierung der seriellen Schnittstelle mit formatierter Ein- und Ausgabe
6.4Interruptgesteuerte Programmierung mit verfügbarer Bibliothek
7Grundfunktionen der Timer
7.1Timerinterrupt mit CodeVisionAVR
7.2Timerinterrupt mit Atmel Studio
7.3CTC-Modus des Timers ohne Interrupt
7.4CTC-Modus des Timers mit Interrupt
7.5Pulsweitenmodulation (PWM) mit Timer 1
7.5.1Ein PWM-Signal mit Timer 1 erzeugen
7.5.2PWM-Signal erzeugen und Interrupt auflösen
7.5.3Gleichzeitig zwei PWM-Signale mit dem Timer 1 erzeugen
8Digitale Ein- und Ausgabe ohne externe integrierte Schaltkreise (ICs)
8.1Einlesen von digitalen Signalen
8.1.1Direktes Einlesen eines einzelnen digitalen Signals
8.1.2Einlesen eines Tasters
8.1.3Taster einlesen und entprellen mit nachfolgender Auswertung einer Flanke
8.1.4Einlesen einer 4x4-Tastatur
8.1.5Einlesen einer 3x4-Tastatur mit Diodenlogik
8.2Ausgabe digitaler Signale
8.2.1Ansteuerung einer einzelnen Siebensegmentanzeige
8.2.2Ansteuerung von zwei Siebensegmentanzeigen nach dem Multiplexprinzip
8.2.3Ansteuerung eines Siebensegmentdisplays mit 2½ Stellen nach dem Multiplexprinzip
8.2.4Ansteuerung von Leuchtdiode mit möglichst wenigen Leitungen
9Ein- und Ausgabe mit ICs zur Verminderung der Port-Leitungen
9.1Tastatur mit Demultiplexer und Prioritätsencoder
9.2Siebensegmentanzeige mit Schieberegister
10Endlicher Automat
10.1Allgemeine Einführung
10.2Vor-Rück-Zähler mit endlichen Automaten und Zustandsdiagramm
10.3Codeschloss
10.4Entprellen von Kontakten
10.5Auswertung von Schaltflanken
10.6Auswertung eines Inkrementalgebers (Drehgeber)
11Schrittmotor
11.1Allgemeine Informationen
11.2Prinzipielle Arbeitsweise
11.3Aufbau und Ansteuerung von Elektromagneten
11.4Endstufe für bipolare und unipolare Schrittmotoren
11.5Wicklungsarten
11.6Programme zur Ansteuerung
11.6.1Einfaches Programm
11.6.2Schrittmotoransteuerung im Interrupt
11.6.3Schrittmotoransteuerung über die RS-232-Schnittstelle
11.7Mikroschrittansteuerung
12Distanzmessungen mit Ultraschallsensoren
12.1Funktionsweise
12.2Ultraschallsensor SRF02
12.3Ultraschall-Eigenbausensor
13Transistorkennlinie aufnehmen und grafisch darstellen
13.1Arbeitsweise des Kennlinienschreibers
13.2Darstellung der Daten in Excel
13.3Darstellung der Daten mit einem grafischen LCD
14Schwebende Kugel
14.1Prinzip und Versuchsaufbau
14.2Regelungstechnisches Modell
14.3Schaltplan
14.4Programm für die schwebende Kugel
14.5Aufbau und Inbetriebnahme
15EKG
15.1Grundlegendes zum Elektrokardiogramm
15.2Sicherheitshinweis
15.3Einfache EKG-Schaltung
15.4EKG-Shield von Olimex
15.5Darstellung der Daten in Excel
15.6Darstellung der Daten in einem grafischen LC-Display
Anhang
Stichwortverzeichnis
Das Zahlensystem mit der Basis zehn ist uns aus dem Alltag bekannt. Jede Stelle einer Zahl hat eine bestimmte Wertigkeit, so unterscheiden wir die Einer-, Zehner- und Hunderterstelle.
Um Verwechslungen auszuschließen, schreiben wir die Zahl mitunter so: 165D.
Zahlensysteme, deren Stellen eine Wertigkeit haben, die um Potenzen ansteigen, bezeichnet man als polyadisch. (Eine Uhrzeit mit Stunden, Minuten und Sekunden ist nicht polyadisch.) In der Computertechnik sind neben dem Dezimalsystem noch zweier-(binär), achter-(oktal) und 16er-Systeme (hexadezimal) verbreitet.
Im Binärsystem gibt es nur zwei Ziffern mit den Werten Null und Eins. Diese werden üblicherweise mit »0« und »1« dargestellt. Die Wertigkeit der Stellen ist in Zweierpotenzen ansteigend.
Damit wir die Binärzahl 1011 von der Dezimalzahl Eintausendelf unterscheiden können, schreiben wir im Text »1011B«. In einem C-Programm, das von einem Compiler einen Maschinencode erzeugt, schreibt man »0b1011«. (Die im Buch verwendeten C-Compiler können diese Schreibweise verarbeiten, obwohl sie nicht dem ANSI-Standard für C entspricht.)
Bei einem 8-Bit-Mikrocontroller werden nicht einzelne Bits abgespeichert, sondern 8 Bits als kleinste Einheit. Einen Block von 8 Bit bezeichnet man auch als Byte. Ein Byte, das nur positive Zahlen darstellt, hat als größten Wert 1 * 128 + 1 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 255.
Der erste Gedanke, eine negative Zahl darzustellen, ist ein Bit für das Vorzeichen zu reservieren. Diese Methode hat aber zwei Nachteile. Der Wert Null kommt als +0 und -0 vor. Noch schwerwiegender ist, dass die arithmetischen Operationen Fallunterscheidungen benötigen. Werden z. B. eine positive und eine negative Zahl addiert, muss statt der Addition eine Subtraktion ausgeführt werden. Diesen Aufwand will man vermeiden. Gesucht ist ein Zahlensystem, das bei einer Addition, unabhängig davon, ob die Zahlen positiv oder negativ sind, den richtigen Wert ermittelt. Gelöst wird das Problem, indem man die negativen und positiven Zahlen im Zweierkomplement darstellt. Eine 4 Bit lange Zahl kann in der Zweierkomplementdarstellung Werte von -8 bis +7 annehmen.
Tabelle 1.1: 4 Bit Binärzahl im Zweierkomplement
Dezimalzahl | Binärzahl in Zweierkomplementdarstellung |
7 | 0111 |
6 | 0110 |
5 | 0101 |
4 | 0100 |
3 | 0011 |
2 | 0010 |
1 | 0001 |
0 | 0000 |
-1 | 1111 |
-2 | 1110 |
-3 | 1101 |
-4 | 1100 |
-5 | 1011 |
-6 | 1010 |
-7 | 1001 |
-8 | 1000 |
Das Bit-Muster für die positiven Zahlen entspricht unseren Erwartungen. Wie man von einer positiven Zahl zu einer negativen Zahl kommt, ist nicht sofort ersichtlich. Deshalb werden zuerst noch die Rechenregeln und Beispiele für Zahlen im Binärsystem erläutert.
Rechenregel:
0B + 0B = 0B
0B + 1B = 1B
1B + 0B = 1B
1B + 1B = 10B
1B + 1B + 1B = 11B
Beispiel 1
Addition von zwei positiven mehrstelligen Zahlen
3D 0011B
2D 0010B
----------------
5D 0101B
Es erfolgt einmal ein Übertrag.
Beispiel 2
Addition mit negativer Zahl
3D 0011B
-2D 1110B
----------------
1D 0001B
Es werden nur vier Stellen berücksichtigt!
Beispiel 3
Addition von zwei positiven Zahlen
4D 0100B
4D 0100B
----------------
8D 1000B (ist aber laut Tabelle 1.1 der Wert -8)
Die Addition von 4D + 4D überschreitet den Wertebereich einer mit 4 Bit vorzeichenbehafteten Zahl (-8D bis 7D) und führt daher zu einem falschen Ergebnis.
Wie kommt man zu dem Bit-Muster für negative Zahlen? Eine positive Zahl wird in zwei Schritten in eine negative umgewandelt. Zuerst sind die Bits einer positiven Zahl zu invertieren und danach ist zu dieser Zahl 1 dazuzuzählen.
Beispiel 4
Umwandlung von 5D nach -5D
1. Schritt
5D = 0101B
nach Inversion der Bits 1010B
2. Schritt
1010B + 1B = 1011B
Mit der gleichen Methode kann man von einer negativen Zahl den entsprechenden positiven Zahlenwert ermitteln.
Beispiel 5
Umwandlung von -5D nach 5D
1. Schritt
-5D = 1011B nach Inversion der Bits 0100B
2. Schritt
0100B + 1B = 0101B
Beispiel 6
Multiplikation einer Binärzahl mit 2
3D * 2D = 6D
0011B * 0010B = 0110B
Eine Multiplikation mit 2 erfolgt im Binärsystem durch das Verschieben der Bits einer Zahl um eine Stelle nach links.
In der Programmiersprache C kann eine Linksverschiebung um eine Stelle wie folgt geschrieben werden:
i = 3 << 1;
Danach hat i den Wert 6;
Das Oktalsystem wird in der Sprache C unterstützt. In diesem Zahlensystem gibt es 8 verschiedene Ziffern (0 bis 7), und die Stellen einer Zahl werden mit Potenzen der Basis 8 bewertet.
Die oktale Zahl 123 hat den Wert 1 * 82 + 2 * 81 +3 * 80 = 1 * 64 + 2 * 8 +3 * 1 = 83D.
In der Programmiersprache C werden Zahlen mit führenden Nullen als Oktalzahlen interpretiert.
Beispiel
i = 0123;
ist gleichwertig zu:
i = 83;
Das Hexadezimalsystem arbeitet mit der Basis 16. Der Ziffernvorrat sind 0123456789ABCDEF. Dabei hat A den Wert 10D usw.
Tabelle 1.2: Werte von Ziffern im Hexadezimalsystem
Hexadezimale Ziffer |
Wert im 10 er System |
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
Jede hexadezimale Ziffer hat einen Wert im Bereich von 0D bis 15D. Das entspricht einer Binärzahl mit 4 Bits. Das macht die Umrechnung zwischen Hex- und Binärsystem sehr einfach.
Um eine Hexadezimalzahl von einer Dezimalzahl sicher unterscheiden zu können, schreiben wir z. B. »123H« oder »FFFH« . Bei einer Eingabe im C-Compiler ist 0x vor die Zahl zu schreiben, z. B. »0x1FFF.«
Beispiel 1
Welchen Wert hat 2AH?
2 * 16 + 10 * 1 = 42D
Beispiel 2
Umwandlung von 2AH ins Binärsystem
2H entspricht 0010B
AH entspricht 1010B
Zusammengefügt, ergibt es die Binärzahl von 00101010B.
Beispiel 3
Umwandlung der Binärzahl 11000101B ins Hexadezimalsystem
1. Schritt ist die Einteilung der Binärzahl in Gruppen mit vier Stellen
(1100)(0101)
1100B entspricht CH
0101B entspricht 5H
Zusammengefügt, ergibt das das Ergebnis C5H.
Für den C-Compiler GCC, der im Atmel Studio eingesetzt ist, und CodeVisionAVR bewirkt i = 0b11000101; das Gleiche wie i = 0xC5;.
Beim Auswählen einer optimalen Hardware sind der finanzielle Rahmen und das Ziel der Anwendung zu berücksichtigen. Nachfolgend wird davon ausgegangen, dass ein Anfänger mit AVRs selbstständig kleine Projekte realisieren will. Die folgenden Vorschläge sind nach dem Investitionsaufwand geordnet. Die Einteilung nach Investitionskosten sollte nicht mit dem Nutzen gleichgesetzt werden.
Dieses Board ist von Atmel. Auf der PC-Seite gibt es dazu eine gute Software-Unterstützung. Alle Funktionen des STK500 können mit dem Atmel Studio angesprochen werden. Auch in CodeVison werden die Funktionen des STK500 gut unterstützt.
1.Spannungsversorgung: Es ist noch ein Brückengleichrichter und Spannungsregler am Board. Daher ist bei der Spannungsversorgung nicht einmal eine Verpolung problematisch.
2.RS-232-Schnittstelle: Über diese Schnittstelle kann das selbst erstellte Programm in den Mikrocontroller geladen werden (Programm-Download). Es besteht auch die Möglichkeit, ein Programm vom Mikrocontroller zum PC hochzuladen oder auch Fuses zu setzen.
3.RS-232-Schnittstelle für die Kommunikation mit dem Mikrocontroller am STK500
4.Steckplatz für Quarz
5.Jumper für Clock und Referenzspannung (ADU)
6.Steckplätze für verschiedene Prozessoren
7.Stiftleiste zu den Ports des Prozessors
8.Stiftleiste für LEDs und Taster: Diese können mithilfe eines Flachbandkabels mit einem Port verbunden werden.
9.Signale zur Programmierung: Je nachdem, welcher Prozessor programmiert werden soll, wird das Signal über ein Flachbandkabel mit einer Stiftleiste (x) verbunden.
Eigenschaften des STK500
Mit dem STK500 kann man den AVR-Mikrocontroller im ISP(In System Programming)-Modus oder HV(High Vage)-Modus programmieren. Der oft verwendete ISP-Modus benötigt eine Ansteuerung mit den Signalen MOSI, MISO, SCK, Reset und GND. Diese Signale werden von der Stiftleiste (9) abgegeben und mit einem Fachbandkabel zur Stiftleiste (x) geführt. Der Prozessor, der programmiert werden soll, ist in die richtige Fassung im Bereich (6) zu stecken.
Ist an einem Mikrocontroller noch eine Hardware angeschlossen und soll das Programm zum Prozessor heruntergeladen werden, darf die Last an den Pins nicht niederohmig sein. Mit einer Last größer 4 kΩ funktioniert die Programmierung erfahrungsgemäß aber immer. Arbeitet man mit einem Laptop, der in der Regel keine serielle Schnittstelle besitzt, ist ein Schnittstellenwandler zweifach-USB-zu-RS-232 zu empfehlen.
Mit dem Jumper 2 (im Bild oben) wird an Vtarget 5 V angelegt. Der Mikrocontroller erhält dadurch die Versorgungsspannung. Am Stecker 1 ist ein Verbindungskabel mit sechs Leitungen angeschlossen. Es ist zur Programmierung mit einem ATtiny verbunden. Leider ist es nicht möglich, einen ATtiny in einem Sockel des STK500 zu programmieren (man muss zusätzliche Verbindungsleitungen legen).
In der IDE von Atmel Studio kann man für den Prozessor ATmega328P, also den Arduino, ein C-Programm erstellen. Dieses Programm ist leider aus der Entwicklungsumgebung im Atmel Studio mit dem STK500 nicht zu flashen. Das STK 500 hat den Vorteil, dass damit viele verschiedene Prozessoren programmiert werden können. Zusätzlich hat das Board acht LEDs und acht Taster, die an verschiedene Ports angeschlossen werden können. Ein großer Nachteil am STK500 ist, dass man eine serielle Schnittstelle zur Programmierung und eine weitere zur Kommunikation benötigt.
Der Dragon ist ein Programmiergerät von Atmel, das gegenüber dem STK500 zwar keine Steckplätze für Prozessoren hat, jedoch zusätzliche Möglichkeiten bietet.
Mit dem Dragon ist es möglich, mit dem Atmel Studio den ATmega328P zu programmieren. Zusammen mit einem Arduino hat man eine Hardware, bei der man keine Netzgeräte und keine USB/RS-232-Wandler benötigt (siehe Bild unten).
Mit der oben gezeigten Verbindung kann man den Arduino über ISP (SPI-Schnittstelle) vom Dragon aus programmieren. Dabei überschreibt man unter Umständen unabsichtlich den Bootloader im ATmega328P. Die positive Seite ist, dass man auf diese Art auch den Bootloader von Arduino (aus der Entwicklungsumgebung des Atmel Studios) in den ATmega328P laden kann. Die genaue Anleitung, wie Sie in einen neuen ATmega328P den Bootloader in den Flash-Speicher schreiben können, finden Sie im Anhang. Der Dragon bietet unterschiedliche Programmiermethoden an.
Dabei bedeutet:
ISP: | In-System Programming |
HVPP: | High Vage Parallel Programming (12 V an Reset) |
JTAG: | Joint Test Action Group (nur für große AVR verfügbar) |
Der Dragon kann auch die neuen Xmega-Prozessoren aus dem Atmel Studio ansprechen. Der populäre Klassiker ATmega8 wird leider vom Dragon nicht mehr unterstützt.
Die Arduino-Hardware besteht aus einer Platine mit einem RS-232/USB-Umsetzer, einer LED an PB5, einem Reset-Taster und einem standardisierten Stecker (6-pol) zum Programm-Download. In Verbindung mit einem Programmieradapter ist das eine für Experimente geeignete Hardware. Ein Programmieradapter mit STK500v1- oder STK500v2-Protokoll kann im Atmel Studio wie ein STK500 angesprochen werden.
Der Arduino ist mit einem ATmega8-Prozessor bestückt. Der Adapter AVR-ISP/500 ist bei http://elmicro.com/ erhältlich.
In den Arduino kann man auch den Prozessor ATmega8 stecken und über eine sechspolige Flachbandleitung mit dem Programmiergerät verbinden (siehe Bild 2.5). Aus der IDE des Atmel Studios kann das Programm in den Prozessor geschrieben werden.
Ein ATmega328P, der Originalprozessor am Arduino, kann nicht direkt aus der IDE des Atmel Studios im STK500-Modus beschrieben werden. Eine Lösung bietet das Programm avrdude, dessen Einsatz im nächsten Kapitel beschrieben wird. Dabei wird der Programmieradapter mit avrdude angesprochen. (Das Lesen des Flash-Speichers mit einem Olimex Programmieradapter und einem ATmega328P wurde mit dem Befehl avrdude -F -v -pm328p -c stk500v2 -P COM4 -b115200 -D -Uflash:r:x.hex:i erfolgreich getestet.)
Der Arduino verwendet den ATmega328P als Prozessor. Auf höheren Speicheradressen im Flash befindet sich ein Ladeprogramm, das auch als Bootloader bezeichnet wird. Mit dem Bootloader kann man über die serielle Schnittstelle den Prozessor programmieren und danach sogar über die Schnittelle kommunizieren. Dabei muss der Arduino nur an der USB-Schnittstelle angeschlossen werden, da ein RS-232/USB-Umsetzer auf dem Arduino bereits vorhanden ist. Auf der PC-Seite wird die USB-Schnittstelle wie eine serielle Schnittstelle angesprochen. Da am Computer keine physikalische serielle Schnittstelle vorhanden ist, die USB-Schnittstelle wie eine serielle Schnittstelle angesprochen wird, bezeichnet man das auch als virtuelle serielle Schnittstelle. Die Umsetzung auf USB erfolgt bei älteren Arduinos mit einem FDTI-Chip, neuere verwenden den ATmega8u2-Chip. Wird ein Programm in den Flash-Speicher geschrieben, steht es auch nach Abschalten der Versorgungsspannung später wieder zur Verfügung. Der Prozessor kann auf diese Weise mindestens 10.000-mal mit einem neuen Programm überschrieben werden. Ein weiteres Argument für den Arduino ist sein einfacher Einsatz. Für diese standardisierte Hardware sind fertige Zusatzplatinen verfügbar. Diese werden als Shield bezeichnet und können auf den Arduino gesteckt werden. Später werden eine Motorendstufe, ein EKG und ein selbst aufgebauter Ultraschallsensor in Form von Shields vorgestellt. Es existieren auch Prototyp-Shields, mit denen man auf einfache Weise eine beliebige Schaltung aufbauen kann (siehe Ultraschallsensor).
Auf diese Lochrasterplatine können beliebige Schaltungen aufgebaut werden.
Fertig aufgebaute Shields gibt es außerdem für GPS, Bluetooth, Zigbee oder Ethernet, SD-Karten, RFID und vieles mehr. Die Verwendung eines Arduinos mit verfügbaren Shields führt in der Regel zu einer preiswerten Lösung.
Anleitung zum Auslesen des Flash-Speichers aus dem Arduino aus der DOS-Ebene
Sie finden das notwendige Programm in der Software für den Arduino. Dazu müssen Sie sich die Entwicklungsumgebung von Arduino herunterladen. Diese finden Sie unter http://www.arduino.cc. Dabei ist nichts zu installieren, sondern es ist nur eine Zip-Datei zu entpacken.
Verbinden Sie den Arduino mit einem USB-Kabel mit dem Computer. Es wird dabei ein Fenster geöffnet und ein Treiber angefordert. Sie finden den Treiber unter D:\arduino-0023\arduino-0023\drivers (D: ist das Laufwerk und 0023 die Version der Software). Öffnen Sie in der Systemsteuerung den Geräte-Manager und klicken Sie auf Anschlüsse. Sie können dann die COM-Schnittstelle auslesen (z. B. COM8). Alternativ kann man im DOS-Fenster den Befehl Mode eingeben. In einem Ordner (im Beispiel wurde c:\temp verwendet) sind drei Dateien zu speichern: avrdude.exe, avrdude.conf und libusb0.dll. Diese Dateien finden Sie in der entpackten Arduino-Software unter Arduino\arduino-0023\arduino-0023\hardware\tools\avr\bin\avrdude.exe, Arduino\arduino-0023\arduino-0023\hardware\tools\avr\etc\avrdude.conf und Arduino\arduino-0023\arduino-0023\hardware\tools\avr\utils\libusb\bin\ libusb0.dll.
Aufruf des Programms
Methode 1:
Gehen Sie in die DOS.Ebene und geben Sie Folgendes ein:
Flash-Speicher mit Avrdude auslesen; die Daten des Flash-Speichers werden in die Datei ccc.hex geschrieben.
Die Bedeutung der Schalter –F –v –p –c –P –b –D –U wird weiter unten erläutert. Die genaue Erklärung ist im Manual von Avrdude zu finden. Dieses Manual finden Sie unter Arduino\arduino-0023\arduino-0023\hardware\tools\avr\doc\avrdude\avrdude.pdf.
Methode 2:
Erstellen Sie eine Batch-Datei.
Öffnen Sie dafür Wordpad und schreiben Sie »avrdude -F -v -pm328p -c stk500v1 -P\\.\COM5 -b115200 -D -Uflash:r:D:\ccc.hex:i«.
Da der Dateiname in Anführungszeichen angegeben ist, wird die Datei unter x.bat und keinesfalls unter .bat.txt abgelegt. Gehen Sie ins DOS (mit Ausführen) und wechseln Sie ins Verzeichnis c:\temp (mit cd \temp).
Die erfolgreiche Ausführung des Programms (nach Methode 1 oder Methode 2) erkennen Sie in den letzten Zeilen, die von avrdude ausgegeben werden.
Falls das Programm einen Fehler meldet, drücken Sie am Arduino die Reset-Taste und starten Avrdude erneut. Nach ca. einer Sekunde geben Sie die Reset-Taste wieder frei. Es kann auch ein mehrmaliges Ausführen von Avrdude nötig sein.
Erläuterung der Schalter in der Kommandozeile beim Aufruf von avrdude:
-F: | Die Signatur des Controllers wird ignoriert. |
-v: | Verbose; das bedeutet, dass ein ausführlicher Text über Aktionen oder Fehler ausgegeben wird. |
-p: | PART; welche CPU verwendet wird |
-c: | Programmer Type (Protokoll) |
-P: | PORT; auf welchem Port der Arduino anzusprechen ist; Sie finden den Port unter Systemsteuerung • Geräte-Manager • Anschlüsse (bei höheren Port-Nummern als com9 ist die Schreibweise »\\.\com10« erforderlich) |
-b: | Baudrate; 115.200 Baud für Arduino, 57.600 für Mega und Duemilanove |
-D: | Disable; verhindert prinzipiell automatisches Löschen vor dem Programmieren |
-U: | Speicheroperationen |
Beachten Sie bei diesen Kommandos unbedingt Groß- und Kleinschreibung.
Falls Sie ein Programm im Mikrocontroller schreiben wollen, müssen Sie den Ausdruck -Uflash:r:ccc.hex:i ändern. Wir nehmen an, Sie wollen ein Blinkprogramm, wie es im nächsten Kapitel beschrieben wird, in den Flash-Speicher schreiben. Mit dem Explorer suchen Sie die Datei Blink1.hex unter C:\Dokumente und Einstellungen\fp\Eigene Dateien\AVRStudio\Blink1\Blink1\Debug\Blink1.hex. Dann ist der neue Ausdruck, der im DOS-Fenster einzugeben oder in eine Batch-Datei zu schreiben ist »avrdude –F –v –pm328p –cstk500v1 –P\\.\COM5 –b115200 –D –Uflash:w:C:\Dokumente und Einstellungen\fp\Eigene Dateien\AVRStudio\Blink1\Blink1\Debug\Blink1.hex:i«.
Mit Avrdude kann ein Programm also ohne Programmiergerät, falls im Prozessor ein Bootloader ist, in die Hardware geladen werden. Avrdude kann aber auch alle anderen Bits (Fuses) des Prozessors verändern. Das geht sogar so weit, dass man durch ungeschickte Programmierung den Prozessor nicht weiter mit Avrdude bearbeiten kann und man sich selbst »aussperrt«. Daher sind beim Setzen der Bits große Sorgfalt und ein sicheres Wissen nötig. Keinesfalls sollte man ohne ausreichendes Wissen experimentell verschiedene Bits setzen oder löschen. Sie können mit avrdude sowohl den Prozessor ATmega328P von Arduino programmieren, der den Bootloader enthält, als auch STK500- und STK500-kompatible Programmiergeräte (Olimex) ansprechen.
Sollten Sie das Arbeiten mit DOS-Befehlen nicht schätzen, kann das Beschreiben oder Lesen des Flash-Speichers auch mit einem Windows Programm durchgeführt werden.
Anleitung zum Auslesen oder Beschreiben des Flash-Speichers vom Arduino unter Windows
Das erforderliche Programm ist leicht anzuwenden und steht unter http://www.ngcoders.com/downloads/arduino-hex-uploader-and-programmer/ zum Download bereit.
Die Dateien avrdude.exe, avrdude.conf und libusb0.dll sind in der heruntergeladenen Zipdatei enthalten. Für die meisten Anwender ist dieses Programm die richtige Wahl. Sollten Sie das Arduino-System aus dem Franzis Verlag (Lernpaket) verwenden, sind im ArduinoUploader für Mikrocontroller »m168« und für die Baudrate »19200« einzugeben.
Infrage kommt das ATMEL-Evaluations-Board von Polin (www.polin.de, Version 2.0.1, Bausatz 810 038), das für ca. 15 Euro erhältlich ist. Zur Programmierung verwendet man das frei erhältliche Programm Ponyprog (http://www.lancos.com/prog.html). Der Bausatz von Polin ist gut beschrieben und kann leicht aufgebaut werden. Für Einsteiger, die noch nie einen Lötkolben in der Hand gehabt haben, ist auf jeden Fall ein fertig aufgebautes Board vorzuziehen. Für das Polin-Board spricht, dass im Internet dazu Informationen vorhanden sind und es auch Zusatzplatinen gibt.
Ein Nachfolger des STK500 ist das von ATMEL favorisierte STK600. Das Board ist auch für AVR32-Prozessoren geeignet und kostet ca. 200 Euro. Es erfordert noch Zusatzplatinen für unterschiedliche Prozessoren. Einsteiger, die mit den kleinen AVRs arbeiten wollten, haben von der Universalität des STK600 keinen Nutzen.
Für den Einstieg in die Mikrocontrollertechnik mit Programmierung in C ist ein Arduino völlig ausreichend. Diese Hardware wird deshalb empfohlen. Die Programmierung des Chips (Download) erfolgt am einfachsten mit http://www.ngcoders.com/downloads/arduino-hex-uploader-and-programmer/.