Leseprobe-Praxiskurs AVR-XMEGA-Mikrocontroller

Page 1

Die Mikrocontroller-Technik ist eines der wichtigsten Gebiete der modernen Elektronik. Mikrocontroller haben sich in den letzten Jahren in allen Bereichen der modernen Technik etabliert. Der vorliegende Kurs gibt eine umfassende Einführung in diese faszinierende Welt. Der Autor des vorliegenden Kurses ist seit über 20 Jahren im Bereich der Elektronikentwicklung und der Physikalischen Technologie für verschiedene Großkonzerne tätig.

ISBN 978-3-89576-288-8

Der zweite Teil beschäftigt sich detailliert mit der Programmierung des Controllers. Hier kommt die Sprache C zum Einsatz, da diese in der Firmware-Entwicklung eine dominierende Stellung einnimmt. Die überwiegende Mehrheit der professionellen Entwicklungsarbeit wird in C ausgeführt; diese Programmiersprache bietet also eine gute Grundlage für alle Controlleranwendungen. Im dritten Teil des Kurses wird schließlich auf die hardwarenahe Programmierung eingegangen. Nach der Erläuterung von Pin-Ansteuerung, Takterzeugung und Oszillatoroptionen werden die anspruchsvolleren Themen wie Interrupts, Timer und Counter, Pulsweitenmodulation und Analog-Digital-Wandlung behandelt. Der Kurs setzt auf die Philosophie des Learning by Doing. Er eignet sich dadurch hervorragend als praktische Ergänzung für Unterricht und Vorlesungen in • Weiterführenden Schulen • Technischen Berufsschulen und Fachakademien • Fachhochschulen und Universitäten

Elektor-Verlag GmbH 52072 Aachen www.elektor.de

Aber auch der ambitionierte, nichtprofessionelle Anwender kann sich mit dem Lernmaterial einen Überblick des aktuellen Standes der Controllertechnik verschaffen.

MIT C VON ANFANG AN

Neben seiner Tätigkeit als Dozent hat er sehr erfolgreich Fachartikel und Bücher zum Thema Elektronik, Halbleitertechnik und Mikrocontroller veröffentlicht sowie Kurse und Lernpakete zu diesen Themen erstellt.

Nach grundlegenden Betrachtungen der Controllertechnologie wird bereits im ersten Teil des Kurses auf die praktische Umsetzung des Stoffes eingegangen. Als Basis dient dazu ein modernes Entwicklungsboard, das mit einem der aktuellsten Controller des Herstellers Atmel ausgestattet ist.

PRAXISKURS AVR-XMEGA-MIKROCONTROLLER

Günter Spanner

AVR-XMEGA-MIKROCONTROLLER

GÜNTER SPANNER

MIT C VON ANFANG AN

PRAXISKURS

LEARN

AVR-XMEGA-MIKROCONTROLLER

DESIGN

PRAXISKURS

Günter Spanner LEARN

DESIGN

SHARE

SHARE

LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SH RN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● SIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● S RN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE

COVER Praxiskurs.indd All Pages

12/03/15 13:56


L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 2


Dr. Günter Spanner

Praxiskurs AVR-XMEGA-Mikrocontroller Mit C von Anfang an

Elektor-Verlag, Aachen

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 3

R


© 2015 : Elektor Verlag GmbH, Aachen 1. Auflage 2015 Alle Rechte vorbehalten. Die in diesem Buch veröffentlichten Beiträge, insbesondere alle Aufsätze und Artikel sowie alle Entwürfe, Pläne, Zeichnungen und Illustrationen sind urheberrechtlich geschützt. Ihre auch auszugsweise Vervielfältigung und Verbreitung ist grundsätzlich nur mit vorheriger schriftlicher Zustimmung des Herausgebers gestattet. Die Informationen im vorliegenden Buch werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autor können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für die Mitteilung eventueller Fehler sind Verlag und Autor dankbar. Koordination: Rolf Hähle Umschlaggestaltung: Giel Dols Umschlagfotos: Mart Schroijen Satz und Aufmachung: Eric Bogers, Völklingen Druck: WILCO, Amersfoort (NL) Printed in the Netherlands ISBN 978-3-89576-288-8 Elektor-Verlag Aachen 139012-1/D

L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 4


Inhalt Teil I

Einstieg in die Hard- und Software

11

1

Einführung

13

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17

Die Welt der Mikrocontroller Kursvoraussetzungen Kurzer Rückblick auf die Mikrocontroller-Entwicklung Grundlagen der Controllertechnik Von-Neumann- und Harvard-Architektur CISC und RISC Prefetching und Pipelining Unterschiede zwischen Controllern und Mikroprozessoren Aktuelle Mikrocontroller Vergleich verschiedener Controller-Familien Die 8051-Serie Die XMEGA-Technologie im Überblick XMEGA-Controller-Familien: A1, A3 und A4 Leistungsmerkmale der XMEGA-Controller Auswahlkriterien für Mikrocontroller Einsatzgebiete von Mikrocontrollern Kontrolle des Lernerfolgs

14 15 18 20 23 25 25 26 27 28 29 29 33 35 40 41 45

2

Das Mikrocontroller-Board XMEGA-A3BU Xplained

47

2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13

Inbetriebnahme des Boards Die Stromversorgung des Boards Messung der Versorgungsspannungen Bereit zum ersten Test: die vorinstallierte Firmware Die Funktionseinheiten des Controllerboards Der Mikrocontroller ATXMEGA256A3BU Die LEDs Die Bedienelemente Das grafische LCD-Display Der Temperatursensor Sensor für die Umgebungshelligkeit Die I/O-Pins des Controller-Boards Zusätzlicher Speicher: Externes Data Flash

48 49 50 51 52 52 54 55 56 56 58 59 60

5

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 5

R


INHALT

2.14 2.15

Das Batterie-Backup-System Kontrolle des Lernerfolgs

3

Einstieg in die Mikrocontroller-Programmierung

63

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10

Systemvoraussetzungen für das Atmel-Studio 6 Installation der USB-Treiber Das erste Programm Flexible In-Circuit Programmierung: FLIP Laden des Programms in den Controller Erstellen eines neuen Projektes Projekte für Stand-allone-Controller Der Programmer JTAGICE3 Der Bootloader Praxisübungen

64 65 66 69 69 71 75 77 78 81

4

Ausblick

83

Teil II

Embedded C

85

5

Einführung

87

5.1 5.2 5.3

Grundstruktur eines embedded C-Programms Hello World auf dem Controllerboard Praxisübungen und Verständnisfragen

88 91 92

6

Programmentwicklung

93

6.1

Praxisübungen und Verständnisfragen

94

7

Syntaxelemente

95

7.1

Praxisübungen und Verständnisfragen

96

8

C-Schlüsselwörter (Keywords)

97

9

C-Zeichensatz

99

10

Variablen

101

11

Variablen-Typen

105

11.1 11.2 11.3 11.4

Ganzzahlen (Integer) Fließkommazahlen (Float) Weitere Variablen-Typen Verständnisfragen und Übungen

105 106 107 108

12

Konstanten

109

6

L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 6

61 61


INHALT

13

Operatoren und Anweisungen

111

13.1 13.2 13.3 13.4 13.5 13.6 13.7

Arithmetische Operatoren Compound-Operatoren Logische Operatoren Bitweise Verknüpfung Shift-Operatoren Vergleichsoperatoren Übungen und Verständnisfragen

111 112 114 115 116 118 118

14

Kontrollstrukturen

119

14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 14.10 14.11

Die if-Verzweigung Die else-Verzweigung Die else if-Verzweigung Der Ternäre Operator Die switch-Verzweigung Die while-Schleife Die do ... while-Schleife Die for-Schleife Die komplexe for-Schleife Abbruch von Schleifen Verständnisfragen und Praxisübungen

119 120 121 122 123 124 125 126 130 131 133

15

Funktionen

135

15.1 15.2 15.3 15.4

Parameterübergabe Globale und lokale Variablen Rekursiver Funktionsaufruf Verständnisfragen

136 141 144 146

16

Zeiger in C

147

16.1 16.2 16.3 16.4 16.5 16.6

Zeiger auf Variablen Variablen im Speicher Nullzeiger Funktion mit Pointer-Übergabe Verkettete Zeiger Verständnisfragen

147 148 150 151 152 153

17

Arrays und Strings

155

17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8

Arrays (Felder) Initialisierung von Feldern Zwei- und mehrdimensionale Felder Höherdimensionale Felder Zeichenketten (Strings) Stringlänge und Nullterminierung Länge eines Strings ermitteln Vergleichen von Strings

155 156 157 159 160 161 162 163

7

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 7

R


INHALT

17.9 17.10 17.11 17.12 17.13 17.14

Formatierung mit sprintf() Strings kopieren und verknüpfen In einem String nach einem Zeichen oder Unterstring suchen Umwandlung von Strings in Zahlen Umwandlung von Zahlen in Strings Verständnisfragen und Praxisübungen

164 166 167 169 170 173

18

Strukturierte Datentypen

175

18.1 18.2 18.3

Strukturen Vereinfachte Initialisierung Verständnisfragen und Praxisübungen

175 178 180

19

Der Präprozessor

183

19.1 19.2 19.3 19.4

Symbolische Konstanten Vordefinierte Konstanten Makros Verständnisfragen

184 185 186 188

20

Bedingte Kompilierung

191

20.1 20.2 20.3

Bedingte Kompilierung mit Konstanten-Definition Bedingte Kompilierung mit Konstanten-Abfrage Verständnisfragen und Übungen

191 192 194

21

Header-Dateien und Include-Files

195

21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8

Einfügen von Header-Files in Quelltextdateien Vermeidung von Mehrfach-Einbindungen Aufnahme von C-Dateien in das aktuelle Projekt Implementierung einer einfachen Funktion Maximale Auslagerung Standard-Headerdateien Eigene Bibliotheken und kommerzielle Libraries Verständnisfragen und Praxisübungen

196 197 197 198 199 200 201 201

22

Ausblick

203

Teil III

Hardwarenahe Programmierung

205

23

Einführung

207

24

Ansteuerung der I/O-Ports

209

24.1 24.2 24.3 24.4

LED-Blinker an PortR0 Bitweise Portkonfiguration Setzten der Register Verständnisfragen und Praxisübungen

210 211 212 213

8

L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 8


INHALT

25

Anwendung der Registerstruktur der ATX-Mega-Serie

215

25.1 25.2 25.3

Das Datenrichtungsregister (DIR) Ausgänge schalten (OUT) Eingänge einlesen (IN)

215 216 216

26

Direktes Ansprechen von Port-Pins

219

26.1 26.2 26.3 26.4 26.5 26.6 26.7

Bitmanipulation und Bit-Masken Klassische Bit-Manipulation Bitmaskierungen der XMEGA-Register Der Wechselblinker Toggeln von Bits (DIRTGL, OUTTGL) Schnelles Rechtecksignal erzeugen Verständnisfragen und Praxisübungen

219 221 222 225 225 226 227

27

Konfigurationseigenschaften der Ports

229

27.1 27.2 27.3 27.4

Schnelle Bitmanipulation Die Pin-Control-Register Spezielle Pinkonfigurationen (PINxCTRL) Verständnisfragen

230 231 232 235

28

Takterzeugung und Oszillatoroptionen

237

28.1 28.2 28.3 28.4 28.5 28.6 28.7 28.8

Der interne 2 MHz Standard-Oszillator Aktivierung interner Oszillatoren Umschalten auf den internen 32 MHz Ringoszillator Rücksetzen auf den internen 2 MHz-Oszillator Ausgabe der Controller-Taktfrequenz auf einen I/O-Pin Ausgabe der 32 MHz-Taktfrequenz Auswählen externer Taktquellen Verständnisfragen und Praxisübungen

238 239 240 241 242 243 244 245

29

Interrupts

247

30

Timer und Counter

249

30.1 30.2 30.3 30.4 30.5 30.6 30.7 30.8

Leistungsmerkmale der Timer/Counter Timer-gesteuerte Signalerzeugung Timergesteuerte LED Real-Time-Counter (RTC) Leistungsmerkmale des Real-Time-Counters Präziser Sekundentakt mit RTC Externe Interrupts Verständnisfragen und Praxisübungen

250 250 253 254 255 255 257 260

31

Pulsweitenmodulation (PWM)

261

31.1 31.2

Features des PWM-Systems Erzeugung eines PWM-Signals

261 261

9

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 9

R


INHALT

31.3 31.4 31.5 31.6

Dimmen von LEDs Helligkeitssteuerung einer Hintergrundbeleuchtung Berechnung PWM-Frequenz Verständnisfragen und Praxisübungen

265 266 267 268

32

Digital/Analog-Converter (DAC)

269

32.1 32.2 32.3 32.4 32.5 32.6

Leistungsmerkmale der DACs Programmierung der DAC-Register Einstellung der Ausgangsspannung Ausgabe von zeitabhängigen Spannungen Funktionsgenerator Verständnisfragen und Praxisübungen

269 270 271 273 274 276

33

Analog/Digital-Konverter (ADC)

277

33.1 33.2 33.3 33.4 33.5 33.6 33.7

Leistungsmerkmale der ADCs Konfiguration der ADC-Register ADC-Betriebsarten Spannungsmessung ADC Ansteuerung über Funktionen Mittelwertbildung Verständnisfragen und Praxisübungen

277 278 280 282 287 290 292

34

Ausblick

293

35

Literatur

295

36

Die Programme zum Kurs

297

37

Abbildungs-, Tabellen- und Programmverzeichnis

299

37.1 37.2 37.3

Abbildungen Tabellen Programme

299 300 302

10

L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 10


1 Einführung Die Mikrocontrollertechnologie ist eines der faszinierendsten Gebiete der modernen Elektronik. Mikrocontroller haben in sich den letzten Jahren in praktisch allen Bereiche der modernen Technik etabliert. Der vorliegende Kurs gibt eine umfassende Einführung in die Welt der Controllertechnik. Nach ersten grundlegenden Betrachtungen zur Controllertechnik wird bereits im ersten Teil des Kurses auf die praktische Umsetzung des Stoffes eingegangen. Als Basis dafür dient ein modernes Controllerboard, das mit einem der aktuellsten Controller des Herstellers Atmel ausgestattet ist. Der zweite Teil beschäftigt sich mit der Programmierung des Controllers. Hier kommt die Sprache „C” zum Einsatz. Diese nimmt auf dem Gebiet der Firmware-Entwicklung eine dominierende Stellung ein. Die bei weitem überwiegende Mehrheit der professionellen Entwicklungsarbeit wird in C ausgeführt. Andere Hochsprachen spielen nur noch eine marginale Rolle. Auch die klassische Assemblerprogrammierung nimmt bestenfalls eine Randstellung ein und wird nur noch dort eingesetzt, wo es darum geht, auch noch die letzten Möglichkeiten eines Controllers bezüglich Geschwindigkeit oder Speicherbelegung zu nutzen. Im dritten Teil des Kurses wird schließlich auf die hardwarenahe Programmierung eingegangen. Hier wird zunächst erläutert, wie einzelne Pins schnell und effizient angesteuert werden. Nach der Erläuterung von Takterzeugung und Oszillatoroptionen wird auf die anspruchsvolleren Themen wie Interrupts, Timer und Counter, Pulsweitenmodulation und Analog-Digitalwandlung eingegangen. Der Kurs setzt auf die Philosophie des „Learning by doing”. Er eignet sich dadurch hervorragend als praktische Ergänzung für Unterricht und Vorlesungen in

ß ß ß

weiterführenden Schulen, technischen Berufsschulen und Fachakademien und Fachhochschulen und Universitäten.

Aber auch der ambitionierte, nicht professionelle Anwender kann sich mit dem Lernmaterial einen Überblick über den neuesten Stand der Controllertechnik verschaffen.

13

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 13

R


2 Das Mikrocontroller-Board XMEGA-A3BU Xplained Warnhinweise 1.

Das Controller-Board ist ausschließlich für den Betrieb an USB-Spannung (nominal 5,0 V) vorgesehen. Falls das Board mit einem Netzteil betrieben wird, dürfen nur geprüfte, doppelt-isolierte USB-Sicherheitsnetzgeräte verwendet werden, da bei einem Isolationsfehler eines einfachen Netzteils lebensgefährliche Spannungen an nichtisolierten Bauelementen anliegen können.

2.

Autor und Verlag übernehmen keinerlei Haftung für Schäden, die durch den Aufbau der beschriebenen Projekte entstehen.

3.

Elektronische Schaltungen können elektromagnetische Störstrahlung aussenden. Verlag und Autor haben keinen Einfluss auf den Einsatz der in diesem Kurs verwendeten Schaltungen. Der Anwender der Schaltung ist daher selbst für die Einhaltung der relevanten Emissionsgrenzwerte verantwortlich.

Die Firma Atmel bietet für ihre Controller verschiedene sogenannte Evaluation-Boards an. Diese Boards geben den Anwendern und Entwicklern erste Einblicke in die Funktionalität und Leistungsfähigkeit des eingesetzten Controllers. Neben dem Mikrocontroller selbst verfügen diese Boards meist noch über die wichtigsten Zusatzeinheiten, die für ihren Betrieb erforderlich sind. Dazu gehören eine geeignete Stromversorgung, oder auch Steckerleisten, die einen einfachen Zugriff auf die Portpins ermöglichen. Häufig sind auch noch einige Komponenten vorhanden, die es gestatten, die wichtigsten Funktionen des Controllers zu testen. In diesem Kurs steht das Board XMEGA-A3BU Xplained im Vordergrund. Es wurde ausgewählt, da es neben verschiedenen Sensoren, Tastern und den wichtigsten Peripheriefunktionen auch über ein grafisches Display verfügt. Damit ist es hervorragend für alle Praxisübungen im Rahmen des 2. und 3. Kursteils geeignet. Im Folgenden sind die wichtigsten Leistungsmerkmale des XMEGA-A3BU Xplained-Boards zusammengefasst.

47

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 47

R


3 Einstieg in die Mikrocontroller-Programmierung Die Mikrocontroller der XMEGA-Serie wurden auf eine Programmierung mit C optimiert. Natürlich lassen sich die Controller auch in Assembler programmieren. Die Programmierung in einer Hochsprache kann aber naturgemäß deutlich strukturierter und übersichtlicher erfolgen.

ß

C-Compiler Im professionellen Bereich hat sich die Verwendung von C als Programmiersprache praktisch ausnahmslos durchgesetzt. Aber auch bei nicht-professionellen Anwendern nimmt C bei der Programmierung von Mikrocontrollern einen klaren Spitzenplatz ein. Aus diesem Grund wird im vorliegenden Kurs ausschließlich auf die Programmierung mit C eingegangen. Die Programmierung aller AVR- und XMEGA-Controller kann mit der jeweils aktuellen Version des AVR-Studios erfolgen. Seit der Version 5 basiert die Oberfläche dieses umfangreichen Programmiertools auf dem Microsoft Visual Studio. Damit bietet das Studio einerseits einen guten Komfort für die Programmentwicklung, erfordert andererseits jedoch vergleichsweise anspruchsvolle Hardware. Im Sinne einer akzeptablen Arbeitsgeschwindigkeit sollten die im nächsten Abschnitt angegebenen Systemvoraussetzungen daher als absolute Minimalanforderungen angesehen werden.

ß

ATMEL-Studio 6.1 Während der Erstellung diese Kursunterlagen war die Freigabe ATMEL-Studio 6.1 die neueste verfügbare Version. Alle Programmierbeispiele wurden deshalb mit dieser Version erstellt und getestet.

ß

Kompatibilität mit künftigen Releases Falls die im Kurs enthaltenen Programme mit neueren Versionen des ATMEL-Studios verwendet werden, kann es zu Kompatibilitätsproblemen kommen. Bislang waren

63

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 63

R


4 Ausblick Damit ist der erste Teil des Kurses abgeschlossen. Der Kursteilnehmer verfügt nun über ein fundiertes Wissen über die Grundlagen der Controllertechnik. Darüber hinaus ist er in der Lage, vorgegebene Programme auf einen modernen Controller der ATXMEGA-Familie zu übertragen. Im zweiten Teil des Kurses steht nun das Erlernen bzw. Vertiefen der Programmierung in C im Vordergrund. Neben den Grundlagen der C-Programmierung wie

ß ß ß

Syntaxelementen C-Schlüsselwörtern Variablen und Variablen-Typen

werden im zweiten Kursteil auch komplexere Themen wie

ß ß ß ß ß ß ß

Compound-Operatoren Rekursiver Funktionsaufrufe Zeiger Arrays und Strings Strukturierte Datentypen Makros Header-Dateien und Include-Files

behandelt. Dabei steht insbesondere die praktische Arbeit mit dem Controller und dem EvaluationBoard im Vordergrund. Anwender, die den zweiten Kursteil gewissenhaft durcharbeiten, sind auf dem Gebiet der modernen Controllertechnik keine Anfänger mehr. Sie sind in der Lage auch komplexere Programmieraufgaben eigenständig und kompetent umzusetzen.

83

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 83

R


5 Einführung Die Programmiersprache „C” wurde bereits in Jahr 1972 von Dennis Ritchie entwickelt. Die Vorgänger hießen tatsächlich „B” und „A”. Ursprünglich wurde C ausschließlich für das Betriebssystem Unix eingesetzt. Erst allmählich kamen die ersten freien Compiler auf den Markt, und C wurde es immer bekannter und schließlich zu einer der am weitest verbreiteten Programmiersprachen überhaupt. Die objektorientierte Version von C wurde durch Bjarne Stroustrup vorangetrieben. Sie wurde allgemein als C++ bekannt. Dies ist eine Anspielung auf den Compound-Operator „++” in C. Dieser Befehl hat die Bedeutung erhöhe um 1. C wurde also um eine Stufe verbessert. Wie bereits im ersten Teil des Kurses erwähnt wurde, hat sich C im Bereich der professionellen Controllerprogrammierung einen absoluten Spitzenplatz erobert. Andere Hochsprachen spielen lediglich in Nischenbereichen eine Rolle. Der Einsatz von Assembler kann inzwischen als veraltet angesehen werden. Ähnlich wie bei den Prozessoren haben auch moderne Controller einen Leistungsstand erreicht, der es gestattet, auch mit nicht bis ins letzte optimierten Codes eine hervorragende Performance zu erreichen. Assembler für Spezialaufgaben Assembler wird praktisch nur noch für Spezialaufgaben eingesetzt. Nur wenn es auf die optimale Nutzung von Prozessorressourcen ankommt, ist der Aufwand einer Assemblerprogrammierung noch gerechtfertigt. Komplexe Aufgaben wie die Ansteuerung von grafischen Displays, aufwändige Steuer- oder Regelaufgaben könnten in Assembler ohnehin nicht mehr ökonomisch umgesetzt werden. Der personelle Aufwand für Erstellung und Test von Assemblerprogrammen kann kaum mehr gerechtfertigt werden. Meist ist es wesentlich kostengünstiger, die geforderte Performance über eine entsprechend leistungsfähigere Hardware bereit zu stellen, als in einem leistungsschwächeren Controller mit Hilfe von Assembler-Code die letzten Reserven zu mobilisieren. Im Rahmen dieses Kurses wird daher ausschließlich auf die Controllerprogrammierung in C eingegangen.

87

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 87

R


6 Programmentwicklung Bevor die Details die Programmentwicklung besprochen werden, soll hier kurz das prinzipielle Vorgehen bei der Entwicklung eines Programms für ein Mikrocontrollersystem dargestellt werden. Bild 6.1 gibt einen Überblick über die Programmentwicklung und die dafür erforderlichen Werkzeuge (Tools). Die sogenannte Tool-Chain besteht grundsätzlich aus den Elementen: Bild 6.1 Ablauf der Programmentwicklung

93

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 93

R


7 Syntaxelemente Nachdem die ersten Programme erfolgreich auf dem Controllerboard laufen und das grundsätzliche Vorgehen beim Entwickeln eines Programms klar ist, werden im Folgenden die einzelnen Programmelemente detailliert erläutert. Eines der wesentlichen Elemente jeder Sprache sind ihre syntaktischen Grundlagen. Wie jede natürliche Sprache benötigt auch eine Programmiersprache sogenannte SyntaxElemente. Die wichtigsten Syntaxelemente von C sind:

ß

Semikolon:

;

Mit dem Semikolon werden Befehle getrennt. Meist steht das Semikolon am Ende einer Programmzeile. Es kann aber auch innerhalb einer Zeile zur Trennung von Befehlen eingesetzt werden.

ß

Geschweifte Klammern:

{ }

Befehlsblöcke werden durch geschweifte Klammern gekennzeichnet.

ß

Einzeiliger Kommentar:

//

Einzeiligen Kommentaren muss ein Doppel-Slash vorangestellt werden. Der Kommentar endet mit dem Zeilenende.

ß

Mehrzeiliger Kommentar:

/*

*/

Wenn ein Kommentar mehrere Zeilen umfassen soll, denn müssen die Zeichenkombinationen /* für Kommentaranfang und */ für Kommentarende verwendet werden. /* Dies ist ein mehrzeiliger ein Kommentar */ // Dies ist ein einzeiliger Kommentar

95

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 95

R


8 C-Schlüsselwörter (Keywords) In C existiert eine Reihe von sogenannten Schlüsselwörtern. Sie bilden den Grundwortschatz der Programmiersprache. Diese Schlüsselwörter müssen jedem C-Anwender geläufig sein, da sie nicht als Variablennamen o. Ä. verwendet werden dürfen. Aus diesem Grunde werden die Schlüsselwörter im Folgenden gruppenweise aufgelistet. Datentypen Schlüsselwort char short int long float double void unsigned signed struct union enum typedef

Tabelle 8.1

Bedeutung Datentyp Integer, Ganzzahl Datentyp Integer, Ganzzahl Datentyp Integer, Ganzzahl (default) Datentyp Integer, Ganzzahl Gleitkommazahl Gleitkommazahl leer/unbestimmt Integer ohne Vorzeichen Integer (explizit) mit Vorzeichen Beliebig zusammengesetzter Typ (Struktur) Auswahltyp/Vereinigungstyp Aufzählungstyp (Enumeration; integer) Individuelle Typvereinbarung

Schlüsselwörter für Datentypen

Byte-Umfang von Datenobjekten Schlüsselwort sizeof

Tabelle 8.2

Bedeutung Umfang von Datenobjekten wie Array etc.

Schlüsselwort für Byte-Umfang von Datenobjekten

Speicherklassen von Objekten Schlüsselwort Auto Register

Bedeutung default in Funktionen (Möglichst) ein Prozessor-Register verwenden

Static Extern

Name/Symbol wird nicht exportiert; statisch Objekt (public-Kode/-Daten), von außen geholt

Tabelle 8.3

Schlüsselwörter für Speicherklassen von Objekten

97

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 97

R


9 C-Zeichensatz Die folgenden Zeichen dürfen in C-Quellcodes verwendet werden: a b c d e f g h i j k l m n o p q r s t u v w x y z _ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

Tabelle 9.1

C-Zeichensatz

Aus diesen Zeichen können beliebige Namen zusammengesetzt werden, etwa für Variablen und Konstanten. Der Unterstrich _ gilt dabei als Buchstabe. Namen müssen stets mit einem Buchstaben beginnen. Die ersten 31 Zeichen eines Namens sind signifikant. Die Sonderzeichen sind Syntax- oder Operatorenzeichen und haben entsprechende Bedeutungen. Weitere Details dazu finden sich in späteren Kapiteln. ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ {

Tabelle 9.2

}

Sonderzeichen

Leerzeichen, Tabs, Zeilenvorschübe, Wagenrücklauf, etc. sind Zwischenraumzeichen, die beliebig in einen Quelltext gesetzt werden dürfen. Sie können beispielsweise für Texteinrückungen verwendet werden. Schlüsselworte oder Operatoren (aus zwei oder mehr Zeichen) oder sonstige Syntaxeinheiten dürfen natürlich nicht durch Zwischenraumzeichen getrennt werden.

99

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 99

R


10 Variablen Variablen gehören zu den grundlegendsten Elementen der Programmierung. Sie dienen zum Speichern von Daten in allen möglichen Variationen. Beispiele hierfür sind

ß ß ß ß

Messwerte, Geldbeträge, Texte und Rechenergebnisse.

Variablen können im Gegensatz zu den in Kapitel 12 erläuterten Konstanten während des Programmablaufs verändert werden. Variablendeklaration Bevor man in C Variablen benutzen kann, müssen sie deklariert werden. Die Deklaration kann am Anfang eines beliebigen Blocks erfolgen. Eine Deklaration beginnt mit dem Typ der Variablen, gefolgt vom Variablennamen. Mehrere Variablennamen des gleichen Typs können durch ein Komma getrennt werden. int var1, var2; Es ist möglich, Variablen direkt bei der Deklaration zu Initialisieren, d. h. ihnen einen ersten Wert zuzuweisen int highTemp = 100; int lowTemp = -10; int temp[10];

/* Maximum Temperature */ /* Minimum Temperature */ /* 10 temperature readings */

Variablen verbrauchen immer eine gewisse Menge an Speicherplatz. Da dieser im Allgemeinen und insbesondere in der Mikrocontrollertechnik knapp ist, wurden Variablen-Typen mit einer Länge von 8 bis 64 Bits festgelegt. In C existiert daher eine vergleichsweise große Anzahl von Variablen-Typen. Um die Ressourcen des Controllers bezüglich Speichernutzung und Arbeitsgeschwindigkeit optimal zu nutzen, sollte immer der jeweils optimale Typ für eine Variable verwendet werden.

101

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 101

R


11 Variablen-Typen Prinzipiell könnte man natürlich häufig den Typen LONG oder FLOAT den Vorzug geben. Bei den bereits erwähnten begrenzten Speicherplatzressourcen eines Mikrocontrollers sollte man allerdings doch besser immer den Typen auswählen, der nicht mehr Speicher belegt als notwendig. Die Datentypen können in drei Kategorien eingeteilt werden:

ß ß ß

11.1

Ganzzahlen – Integer, Fließkommazahlen – Float und spezielle Zahlentypen für Mikrocontrollerapplikationen.

Ganzzahlen (Integer)

Ganze Zahlen oder auch Ganzzahlen entsprechen im Wesentlichen ihrer mathematischen Definition:

ß ß ß

die natürlichen Zahlen: 1, 2, 3, ... die Null: 0 und die negativen ganzen Zahlen: –1, –2, –3, ...

Für Ganzahlen stehen die folgenden Typen zur Verfügung:

ß

Integer: Wertebereich:

int –32 768 ... 32 767

ß

Long integer: Wertebereich:

long –2 147 483 648 ... 2 147 483 647

Das folgende Programmbeispiel verdeutlicht die Anwendung von Ganzzahlen.

105

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 105

R


12 Konstanten Neben Variablen werden in einem Programm häufig auch konstante Werte benötigt. Die Definition von Konstanten ist insbesondere dann von Vorteil, wenn immer wieder die gleichen Werte an vielen verschiedenen Stellen in einem Programm benötigt werden. Typische Beispiele sind: ! ! !

Kalibrationskonstanten bei der Erfassung von Messwerten, Umrechnungskonstanten für Einheiten (z. B. Celsius – Fahrenheit) und Mathematische Konstanten wie Pi = 3,14 oder die Eulersche Zahl e = 2,71...

Durch aussagekräftige Konstantennamen werden auch magische Zahlen vermieden. Damit sind verstreute Werte in einem Programm gemeint, deren Bedeutung nicht immer gleich ersichtlich ist. Konstante Werte Eine Konstante ist also ein Wert, welcher nach seiner Initialisierung im Programm nicht mehr geändert werden kann. Zur Kennzeichnung einer Konstanten wird das Schlüsselwort const verwendet. Der Typ der Konstanten wird über das Schlüsselwort der entsprechenden Variablen ausgewählt (int, float etc.), Symbolische Konstanten Die symbolischen Konstanten haben prinzipiell die gleiche Funktion wie die über const definierten Werte. Die softwaretechnische Umsetzung erfolgt allerdings auf komplett andere Weise. Eine symbolische Konstante ist eine reine Textersetzung und bereits beim Kompilieren werden alle symbolischen Konstanten im Quellcode durch deren Werte ersetzt. Symbolische Konstanten werden im Präprozessor durch #define

109

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 109

R


13 Operatoren und Anweisungen 13.1

Arithmetische Operatoren

In C haben arithmetische Operatoren ihre üblichen mathematischen Bedeutungen: +

Addition

-

Subtraktion

*

Multiplikation

/

Division

%

Modulo, d. h. Rest der Division

Tabelle 13.1 Arithmetische Operatoren

Hierzu wieder ein Beispiel. Das nachfolgende Programm berechnet Summe, Differenz, Produkt und Quotient von 2,5 und 4,0. // operations #include <asf.h> #include <gfx_mono.h> #include <sysfont.h> float a = 2.5, b = 4.0; char strng[20]; int main (void) { board_init(); gfx_mono_init(); // display backlight on gpio_set_pin_high(NHD_C12832A1Z_BACKLIGHT); // Clear screen gfx_mono_draw_filled_rect(0, 0, 128, 32, GFX_PIXEL_CLR); Programm 13.1

ß

Mathematische Operationen (operations)

111

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 111

R


14 Kontrollstrukturen In C existieren die folgenden Kontrollstrukturen für den Programmablauf.

ß

Verzweigungen Hierbei wird im Programm eine Bedingung definiert. Je nachdem, ob diese wahr oder falsch ist, wird das Programm an unterschiedlichen Stellen fortgesetzt.

ß

Schleifen Schleifen dienen dazu, Anweisungen zu wiederholen.

ß

Sprünge Bei einem Sprung wird die Programmausführung unterbrochen und an einer bestimmten, durch eine Sprungmarke definierte Stelle fortgesetzt.

14.1

Die if-Verzweigung

Ein if-Zweig wird durchlaufen, wenn die Bedingung in den runden Klammern zutrifft. Ist die Bedingung nicht zutreffend, wird die Verzweigung übersprungen. If(Bedingung) { Anweisung(en); } // if #include <asf.h> #include <gfx_mono.h> #include <sysfont.h> Programm 14.1

ß

if Verzweigung (if)

119

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 119

R


15 Funktionen Die Aufgabe von Funktionen ist es, größere Programme in leicht überschaubare Teilprobleme zu untergliedern. Besonders vorteilhaft ist der Einsatz von Funktionen, wenn bestimme Programmteile immer wieder benötigt werden. Eine Funktion muss dann nur einmal erstellt werden und ist an beliebigen Stellen eines Programms immer wieder aufrufbar. Der einfachste Funktionstyp hat weder ein Argument noch liefert er einen Wert zurück: void functionname(void) Der Ausdruck void steht dabei für ungültig, nicht erforderlich bzw. nicht vorhanden. Der Funktionsname wird nach den gleichen Regeln wie bei den Variablen festgelegt. Natürlich dürfen auch hier keine vordefinierten Namen verwendet werden. Zunächst muss eine Funktion im Programm bekannt gemacht werden: void functionname(void); Diese Definition wird auch als Festlegung eines Funktionsprototyps bezeichnet. Prototypen werden ohne geschweifte Klammern geschrieben, da sie keinen Funktionskörper besitzen. Sie müssen aber stets mit einem Strichpunkt ; (Semikolon) abgeschlossen werden. Nach Festlegung der Prototypen kann der Funktionskörper void functionname(void); { Anweisung(en); } an einer beliebigen Stelle des Programms stehen. Der besseren Übersicht halber kann es sinnvoll sein, die Funktionsdefinitionen am Ende eines Programms zusammenzufassen. Der Aufruf der Funktion im Hauptprogramm erfolgt einfach über ihren Funktionsnamen.

135

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 135

R


16 Zeiger in C Zeiger (engl. Pointer) liefern die Speicheradressen von Variablen und Funktionen. Sie werden häufig in maschinennahen Programmiersprachen wie beispielsweise Assembler eingesetzt und stellen dort ein mächtiges Instrument für die Verarbeitung von Daten dar. In manchen höheren Programmiersprachen ist der Gebrauch von Pointern dagegen eingeschränkt, da bei der Arbeit mit Zeigern leicht schwerwiegende Programmierfehler unterlaufen. In C ist die Anwendung von Zeigern durchaus üblich, jedoch sollte man sie aus den genannten Gründen immer mit Bedacht einsetzen. Bei korrekter Verwendung erlaubt der Einsatz von Zeigern jedoch häufig eine schnelle und effiziente Verarbeitung von allen im Speicher abgelegten Daten. Alle in einem Controller gespeicherten Daten werden in einer Speicherzelle abgelegt. Allen Speicherzellen ist eine bestimmte Adresse zugeordnet. Ein Zeiger zeigt auf die Daten, indem er lediglich die Adresse der Daten abspeichert. Soll einer Funktion eine bestimme Datenmenge übergeben werden, kann ihr über einen Zeiger die Adresse mitgeteilt werden. Die Daten werden somit nicht verändert, die Funktion greift lediglich über die Adresse auf die Daten zu. Häufig werden Daten durch Variablen repräsentiert. Ein Zeiger speichert dann die Adresse einer Variablen und kann diese auf Anfrage weitergeben.

16.1

Zeiger auf Variablen

Benötigt man einen Zeiger, der auf eine bestimme Variable zeigt, so ist zunächst die Variable zu definieren. Danach wird der Zeiger erstellt, der auf diese Variable zeigen soll. Ein Zeiger wird erstellt, indem bei der Deklaration dem Zeiger-Namen ein Stern (*) vorangestellt wird. Damit ist der Zeiger zwar definiert, er zeigt aber noch nicht auf einen sinnvollen Wert. Er ist also noch auf die Adresse der Variablen zu setzen. Dies erfolgt über die Zuweisung mit dem Kaufmanns-Und (&): int myNumber = number; int *myPointer; myPointer = &myNumber;

147

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 147

R


17 Arrays und Strings 17.1

Arrays (Felder)

Arrays (dt. Felder) kommen zum Einsatz, wenn größere numerische Datenmengen gespeichert werden müssen. Ein typisches Beispiel ist das Erfassen einer Reihe von Messwerten. Dass Messwerte in Variablen gespeichert werden können, ist bereits bekannt. Soll beispielsweise eine Spannung über mehrere Stunden hinweg automatisch einmal pro Minute gemessen werden, so führt das zu einer ganz erheblichen Anzahl von benötigten Variablen. Will man beispielsweise einen Zeitraum von 8 Stunden abdecken, so sind bereits 8 x 60 = 480 Variablen erforderlich. Eine so große Anzahl von Variablen zu deklarieren wäre sehr aufwändig: float myValue1, myValue2, myValue3, ..., myValue479, myValue480; Wird ein Array verwendet, benötigt man lediglich eine Deklaration: float myValue[480]; Damit werden 480 float-Variablen angelegt. Die Deklaration eines Feldes beginnt, wie auch bei einfachen Variablen, mit Datentyp und Namen. Danach folgt in eckigen Klammern die Feldgröße, also die Anzahl der benötigten Variablen. Der Zugriff auf diese Variablen erfolgt mittels Indexvariablen. Wichtig Die Indexvariable erstreckt sich über den Bereich 0 bis Feldgröße minus 1, da auch hier die Zählung wieder bei Null beginnt.

Wird ein beispielsweise ein Feld mit der Größe 5 erstellt, kann das Feld 5 Werte speichern. Der erste Wert wird mit dem Index 0 und der letzte Wert mit dem Index 4 angesprochen.

155

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 155

R


18 Strukturierte Datentypen 18.1

Strukturen

Variablen sind das Grundgerüst der meisten Programme. Man kann die Variablen in folgende Verwendungskategorien einteilen:

ß ß ß ß

Durchführung von Berechnungen, Zählen von Schleifendurchläufen, Festlegen von Zuständen (hier spricht man auch von Flags) und Abspeichern von Daten und Informationen.

Steht man im letzten Anwendungsfall vor der Aufgabe, große Datenmengen zu verarbeiten, ist es sehr hilfreich, wenn dies in einer fest definierten Art und Weise geschehen kann. Häufig sind Daten bereits vom Anwendungsfall her in gewisse Gruppen strukturiert. Will man beispielsweise die Adressdaten von Personen speichern, so weisen diese Daten bereits eine natürliche Struktur wie Vornamen, Nachnamen, Straßennamen oder Hausnummern auf. Es ist daher sinnvoll, die Struktur dieser Daten im Programm nachzubilden. Eine Möglichkeit wäre, zusammengehörende Daten mit einen Präfix zu versehen. Alle Variablen, welche die Adresse einer Person beinhalten, könnte man beispielsweise mit dem Präfix adr beginnen lassen. char char char int char int

adrName[50]; adrPrename[50]; adrStreet[50]; adrNumber; adrTown[50]; adrCode;

Damit wäre zwar rein optisch ein gewisser Zusammenhang zwischen den Daten erkennbar. Allerdings wären alle Daten immer noch in einzelnen, voneinander unabhängigen Variablen gespeichert, ein realer Zusammenhang auf Programmebene ist hier nicht gegeben. Für eine echte Bündelung solcher Daten stehen in C jedoch sogenannte Strukturen, (englisch structures) oder kurz structs zur Verfügung.

175

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 175

R


19 Der Präprozessor Der sogenannte Präprozessor (englisch preprocessor) ist ein Bestandteil der C-Entwicklungsumgebung. Er verändert den ursprünglichen Quellcode aufgrund von bestimmen Anweisungen. Wie schon aus der Bezeichnung abgeleitet werden kann (Prä = lateinisch für vor), werden diese Veränderungen vor dem Compilier-Vorgang ausgeführt. Erst danach wird der neu erzeugte Quellcode übersetzt. Die Anweisungen für den Präprozessor werden auch als Präprozessor-Direktiven bezeichnet. Bild 19.1 Funktion des Präprozessors

183

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 183

R


20 Bedingte Kompilierung Die bedingte Kompilierung bietet die Möglichkeit, bestimmte Quelltextblöcke von der Kompilierung auszuschließen. Neben dem Einsatz zum Testen von umfangreichen Programmprojekten eignet sich die bedingte Kompilierung auch zur Vermeidung von Mehrfacheinbindungen von Bibliotheken.

20.1

Bedingte Kompilierung mit Konstanten-Definition

Mit den Direktiven #ifdef, #ifndef, #endif und #else kann man Quelltextbereiche so eingrenzen, dass sie nur kompiliert werden, wenn bestimmte symbolische Konstanten definiert wurden. Die Direktive #ifdef wird ausgeführt, wenn die Konstante definiert ist, #ifndef wird abgearbeitet, falls die betreffende Konstante nicht definiert ist. Entsprechend wird ein einem optionalen #else zugeordneter Block kompiliert, wenn die Bedingung in #ifdef nicht wahr ist. Mit #endif wird der konditionale Block abgeschlossen. Zusätzlich existiert noch die elseif-Direktive #elif Diese stellt eine alternative if-Anweisung dar, wenn vorangegangene if-Anweisungen (#if, #elif, #ifdef, #ifndef) nicht wahr sind. Damit sieht das allgemeine Konstrukt der bedingten Kompilierung allgemein so aus:

191

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 191

R


21 Header-Dateien und Include-Files Bei größeren Programm-Projekten kann es aus Gründen der Übersichtlichkeit sinnvoll sein, umfangreiche Quelltexte in mehrere Dateien aufzuteilen. Man kann so komplexe oder häufig benötigte Funktionen in eigene Files ausgliedern. Die einzelnen Teilprojekt-Dateien können dann beispielsweise von verschiedenen Programmierteams bearbeitet werden. So kann ein Projektteam dann etwa die Ansteuerung eines LCD-Displays programmieren, während ein anderes Team das Einlesen von Sensorwerten übernimmt. In einem Header-File werden schließlich alle Informationen gesammelt, die notwendig sind, um ein dieser Header-Datei zugeordnetes C-File benutzen zu können. Header-Dateien werden mittels der Include-Direktive #include filename.h in das Hauptprogramm, also die C-Quelltextdatei mit der main-Funktion, eingebunden. Header-Dateien enthalten üblicherweise

ß ß ß

Vereinbarung von Makros und symbolischen Konstanten, Beschreibungen der Aufrufschnittstellen externer Funktionen und Deklarationen von Datentypen.

Darüber hinaus können Header-Dateien auch Deklaration von globalen Variablen enthalten. Prinzipiell ist es auch möglich, ausführbare Anweisungen in eine Header-Datei aufzunehmen. Bei kleineren Projekten wird das auch immer wieder umgesetzt. Bei umfangreichen Projekten sollten aber Funktionen und ausführbare Anweisungen immer in zugeordneten .c-Dateien stehen. Bei größeren Projekten sollte man also immer entsprechend der folgenden Konventionen arbeiten.

ß

Deklarationen (Prototypen) werden in den .h-files festgelegt. Das .h-file ist aber nur die Schnittstelle für alle in der zugehörigen .c-Datei implementierten Funktionen.

195

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 195

R


22 Ausblick Damit ist Kursteil Embedded C abgeschlossen. Der Kursteilnehmer ist nun in der Lage, auch komplexe C-Programme für einen Mikrocontroller zu erstellen. Die Syntaxelemente, Variablen und Kontrollstrukturen dieser weit verbreiteten Sprache sind nun bestens vertraut. Darüber hinaus wurden grundlegende Kenntnisse zum Thema Compilerdirektiven und bedingte Compilierung vermittelt. Im dritten Kursteil wird auf die hardware-nahe Programmierung eingegangen. Diese stellt das Grundgerüst für die Praxisanwendung von Mikrocontrollern zur Verfügung. Zunächst werden hier die Themen

ß ß ß ß ß ß

Ansteuerung der I/O-Ports, direktes Ansprechen von Port-Pins, Bitmanipulation und Bit-Masken, Konfigurationseigenschaften der Ports, schnelle Bitmanipulation sowie Takterzeugung und Oszillatoroptionen

detailliert beschrieben. In weiteren Kapiteln werden dann bereits fortgeschrittene Themen wie

ß ß ß ß ß

Interrupts, Timer und Counter. Real Time Counter (RTC), externe Interrupts und Pulsweitenmodulation (PWM)

diskutiert. Den Abschluss des dritten Kursteils bilden die Analogschnittstellen:

ß ß ß ß

Digital/Analog-Converter (DAC), Analog/Digital-Konverter (ADC), Spannungsmessung und Mittelwertbildung.

Neben den grundlegenden Funktionsbeschreibungen stehen im dritten Kursteil insbesondere auch wieder Praxisübungen und Anwendungen zu allen Themengebieten im Vordergrund.

203

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 203

R


23 Einführung In diesem Teil wird auf die Anwendung der Programmiersprache C speziell für die Controller der ATXMEGA-Familie eingegangen. Während in Teil II noch die allgemeinen Grundlagen von embedded C im Vordergrund standen, soll hier konkret die Umsetzung für eine Controller-Familie erläutert werden. Im Umfeld der hardwarenahen Programmierung unterscheiden sich die XMEGA-Controller z. T. ganz erheblich von der älteren ATmega-Familie. Da die AVR Mega- und Tiny-Controller jedoch sehr weit verbreitet sind, wird hier auch immer wieder auf Unterschiede und Gemeinsamkeiten der beiden Familien eingegangen. So soll Anwendern mit Erfahrungen in der Programmierung älterer Controller der Umstieg erleichtert werden. Umstieg von AVR zu ATXMEGA Im Bereich der Pin-Ansteuerung haben die Controller der XMEGA-Reihe kaum noch Gemeinsamkeiten mit der AVR-Serie. So ist es nicht möglich, für ATmega geschriebene Programme ohne Änderungen auf einen XMEGA zu übernehmen. Das gilt auch bereits für so einfache Anwendungen wie LED-Blinker oder Lauflichter. Auf den ersten Blick ist dies natürlich ein erheblicher Nachteil. Die Neustrukturierung hat aber bei genauerem Hinsehen auch viele Vorteile mit sich gebracht.

ß

Die Namensgebung der Register wurde wesentlich vereinfacht.

ß

Registerbezeichnungen bei den XMEGA-Varianten sind deutlich konsequenter.

Dadurch sind die neuen XMEGA-Register-Strukturen deutlich übersichtlicher geworden. Darüber hinaus gibt es kaum mehr fehlerträchtige Ausnahmen und Sonderfälle. Ein weiterer Grund für diese vergleichsweise großen Änderungen sind selbstverständlich auch die vielen neuen Funktionen der XMEGA-Controller, die kaum mehr in die alten Strukturen integrierbar waren. Hat man jedoch das Grundprinzip der neuen ATX-Struktur aber erst einmal verstanden, findet man sich im neuen System leicht zurecht, da alle Ports und Funktionen sehr strukturiert aufgebaut sind. Die Namen der Register für Grundfunktionen wie Timer, ADC, Interrupts sind für jeden Port gleich strukturiert und unterscheiden sich nur in der Bezeichnung für den jeweiligen Port.

207

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 207

R


24 Ansteuerung der I/O-Ports Zu den grundlegendsten Funktionen eines Mikrocontrollers gehört die Ansteuerung der Eingabe/Ausgabe-Pins (engl. I/O-pins oder Input/Output-pins). Allgemein werden Mikrocontroller-Ports über GPIO-Register (General Purpose Input/Output) gesteuert. Jedem Port sind dafür entsprechende Register zugeordnet. Die Controller der XMEGA-Familie besitzen für jeden Port einen Satz von 32 Registern. Aktuell werden davon aber nur 21 verwendet. Diese Register haben folgende Aufgaben:

ß ß ß

es wird festgelegt, ob ein bestimmter Pin als Ein- oder Ausgang dienen soll, bei Ausgängen wird der Zustand (High oder Low) geschaltet und bei Eingängen wird der anliegende Spannungspegel erfasst.

Wie bereits erwähnt, gibt es bei den Ein- und Ausgangspins der XMEGA-Controller im Vergleich zur AVR ATmega- bzw. ATtiny-Serie einige Änderungen. Die ATmega- und ATtinyController haben für jeden Port nur drei Register:

ß ß ß

Data Direction Register (DDR), PORT-Register und PIN-Register.

Aufgrund der deutlich erweiterten Register-Struktur besitzten die XMEGA-Controller wesentlich umfangreichere Konfigurationsmöglichkeiten für die Ports. I/O-Ports werden neben dem Austausch von binären Daten auch als Schnittstelle zu anderen Peripherieeinheiten verwendet. Daher stammt auch die Breite von 8 Bit entsprechend einem Byte für einen typischen Controller-Port. Wie bereits bei den ATmega- und ATtiny-Familien können natürlich auch beim ATXMEGA alle operativen I/O-Pins als Ein- oder Ausgänge konfiguriert werden. Darüber hinaus bieten die XMEGA-Controller aber weit mehr Einstellmöglichkeiten, wie etwa für Pull-up- oder Pulldown-Konfigurationen.

209

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 209

R


25 Anwendung der Registerstruktur der ATX-Mega-Serie Nach den grundlegenden Betrachtungen soll in diesem Kapitel die Anwendung der PortRegisterstruktur genauer betrachtet werden.

25.1

Das Datenrichtungsregister (DIR)

Über das Register DIR kann die Datenrichtung der einzelnen Pins des jeweiligen Ports bestimmt werden. In der Defaulteinstellung sind die Bits auf 0 gesetzt und somit als Eingänge deklariert. Standardmäßig wird

ß ß

High (logisch 1) für Output und Low (logisch 0) für Input

festgelegt. Will man beispielsweise den kompletten Port C als Ausgang zu konfigurieren, dann setzt man alle Bits des DIR-Registers des PORTC auf 1 (High). PORTC.DIR = 0xff; oder PORTC.DIR = 0b11111111; Die Verwendung der binären Schreibweise bietet hier ein besonders anschauliches Bild, da die Bitpositionen direkt den Pins entsprechen. Analog kann so auch wieder ein kompletter Port als Eingang konfiguriert werden. PORTA.DIR = 0x00;

215

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 215

R


26 Direktes Ansprechen von Port-Pins Zusätzlich den Registern DIR, OUT und IN existieren bei den XMEGA-Controllern jeweils drei neue Register: DIRSET

Direktes Setzen der Portfunktion als Ein- oder Ausgang.

DIRCLR

Direktes Rücksetzen der Portfunktion als Ein- oder Ausgang.

DIRTGL

Direktes Toggeln der Portfunktion als Ein- oder Ausgang.

OUTSET OUTCLR

Direktes Setzen eines Ausgangs. Direktes Rücksetzen eines Ausgangs.

OUTTGL

Direktes Toggeln eines Ausgangs.

Tabelle 26.1

Zusätzliche I/O-Register der ATXMEGA-Controller

Setzen von Ports über Bitmasken Mit diesen Registern können die Ports direkt beschrieben werden. Die bei den AVRControllern notwendige LMS-Operation (Lesen-Modifizieren-Schreiben-Operation) für Setzen oder Löschen einzelner Bits sind damit nicht mehr erforderlich. Mit dieser neuen Registerstruktur und der damit entfallenden Notwendigkeit der LMS-Operationen können Programme also kompakter und schneller werden, da die Schritte für das Lesen und Wiederbeschreiben im Hintergrund ausgeführt werden. Um einzelne Portpins anzusprechen, wird über sogenannte Bitmasken der gewünschte Wert in das jeweilige Register geschrieben. Danach setzt, löscht oder toggelt der Controller automatisch die entsprechenden Bits. Da Bitmasken und Bitmanipulationen in der hardwarenahen Programmierung von grundlegender Bedeutung sind, werden sie ausführlicher erläutert.

26.1

Bitmanipulation und Bit-Masken

Die Bit-Operationen wurden bereits im 2. Teil des Kurses diskutiert. Die sogenannten Bitmanipulationen sind bei der Arbeit mit Port-Registern natürlich von zentraler Bedeutung. Da die einzelnen Pins eines Controllers intern als Bits in einem Register behandelt werden, spielt die Steuerung und Manipulation auf Bit-Ebene eine entsprechend wichtige Rolle.

219

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 219

R


27 Konfigurationseigenschaften der Ports Die Ports der XMEGA-Reihe bieten die folgenden Leistungsmerkmale:

ß ß

Flexible pin-Konfiguration Konfigurierbarer Ausgangstreiber mit folgenden Pull-Up-Optionen: Totem-pole hartes Setzen des Pins auf 0 oder 1 Wired-OR hartes Setzen auf 1 Wired-AND hartes Setzen auf 0 Pull-up/-down Setzen von Pull-up/Pull-down Widerständen ! Bus keeper weiches Setzen des Pins ! Inverted I/O Invertierung des Ein- oder Ausgangs ! ! ! !

ß

Slew rate Kontrolle

ß

Konfiguration von mehreren Pins mit einer einzigen Operation

ß

Virtuelle set/clear/toggle Option für Ausgabe- und Richtungsregister

ß

Mapping von Ports in virtuelle Ports für schnellen Zugriff

Hart bedeutet in diesem Zusammenhang ein niederohmiges Schalten des betreffenden Pins. Dagegen bedeutet weich ein hochohmiges Setzen, sodass der Ausgang auch durch externe Signale auf einen bestimmten Pegel gesetzt werden kann. Portbezeichnungen Wie üblich sind die I/O-Pins in Ports mit jeweils 8 einzelnen Pins gruppiert. Die verschiedenen I/O-Ports haben den Namen PORTx, wobei x ein Buchstabe ist. Konkrete Portnamen lauten also, z. B. PORTA, PORTB oder aber auch PORTR etc.

229

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 229

R


28 Takterzeugung und Oszillatoroptionen Die Controller der XMEGA-Familie bieten ein sehr umfangreiches System, um den CPU-Takt für den Controller zu generieren. Neben der Möglichkeit einen internen Takt von

ß ß ß

32 kHz, 2 MHz und 32 MHz

zu verwenden, verfügen die Bausteine auch noch über

ß ß ß ß ß ß ß

einen Ultra Low Power Oszillator (ULP) für den Watchdog, eine interne PLL mit einem Multiplikator von 1 bis 31, einen Eingang für externe Quarzoszillatoren bzw. Einzelquarze, eine sichere Clock-Umschaltung, eine externe Oszillator Ausfallerkennung, eine 1x bis 2048x System Takt Rescaler Option und eine automatische Kalibration des internen Oszillators.

Über den externen Takteingang können die Controller via externen Taktgeber oder Quarz mit einer Frequenz zwischen 400 kHz und 16 MHz versorgt werden (Bild 28.1).

Bild 28.1

Clocksystem der XMEGA-Controller

237

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 237

R


29 Interrupts Unter einem Interrupt versteht man die Unterbrechung eines Programmablaufs durch ein bestimmtes Ereignis. Interrupts werden verwendet, wenn Ereignisse zeitkritisch oder aus anderen Gründen von besonderer Wichtigkeit sind. Alarmmeldungen eines Systems werden beispielsweise meist durch Interrupts abgefangen. Meldet etwa ein Sensor einen Übertemperaturalarm, so muss unverzüglich reagiert werden. Ist der Controller gerade mit komplexen Berechnungen ausgelastet, so müssen diese unterbrochen werden. Erst wenn Maßnahmen zur Gefahrenbeseitigung, wie etwa das Aktivieren eines Ventilators ergriffen wurden, kann die normale Prozessorarbeit fortgeführt werden. Bild 29.1 zeigt den prinzipiellen Ablauf beim Einsatz von Interruptfunktionen. Bild 29.1 Programmablauf unter Verwendung von Interrupts

247

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 247

R


30 Timer und Counter Ein Timer ist ein Register im µC, das rein hardwaregesteuert arbeitet und bei bestimmten Zählerständen einen Interrupt auslösen kann. Ein solches Ereignis ist beispielsweise ein Überlauf (Overflow). Da ein Register nur einen bestimmen Maximalwert fassen kann, wird bei fortlaufendem Aufwärtszählen irgendwann ein Zählerstand erreicht, der mit der vorgegebenen Bitbreite nicht mehr darstellbar ist. Der Zähler läuft über, wird wieder auf 0 zurückgesetzt und kann dabei einen Interrupt auslösen. Bei den XMEGA-Controllern sind jedem I/O-Port mehrere Timer/Counter-Module zugeordnet. Diese können verwendet werden, um einen Interrupt auszulösen oder um die Ausgänge der I/O-Pins anzusteuern. Der Name des jeweiligen Timer/Counter-Moduls (kurz TC-Moduls) setzt sich aus dem I/OPort X, an dem er angeschlossen ist und einer zugeordneten Kennzahl n zusammen (TCxn). Die Kennzahl n ist die T/C-Nummer innerhalb des PORTx. So ist beispielsweise TCE0 Timer/Counter 0 an PORTE. Timer sind jeweils an

ß ß ß ß

PORTC, PORTD, PORTE und PORTF

verfügbar. Bild 30.1 zeigt die Zuordnung der Timer zu den Controller-Ports. Hinweis Die Ausgänge von Timer 0 sind mit den Pins 0…3 innerhalb eines Ports verbunden, während die Ausgänge von Timer 1 mit den Pins 4 und 5 verbunden sind.

249

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 249

R


31 Pulsweitenmodulation (PWM) Unter Pulsweitenmodulation versteht man ein Verfahren, das es erlaubt, quasi-analoge Signale mit einem einfachen I/O-Pin zu erzeugen. Der Pin wird dabei mit einer festen, vergleichsweise hohen Frequenz ein- und ausgeschaltet. Um verschiedene Ausgangsspannungen zu erhalten, wird das Taktverhältnis, d. h. das Verhältnis der High- und Low-Zeit, des Signals variiert. Mittels eines Tiefpasses kann dann eine variable analoge Spannung erzeugt werden. Die Timer/Counter-Module der XMEGA-Reihe haben alle eine Auflösung von 16-Bit. Damit lassen sich hochauflösende und sehr schnelle PWM-Signale erzeugen. Mit Hilfe einer High-resolution-Einheit kann die Auflösung bzw. die Geschwindigkeit eines PWM-Moduls um Faktor 4 gesteigert werden. Damit wird ermöglicht, dass trotz des internen Taktes von nur 32 MHz ein 128 MHz Taktsignal am Eingang der Timer/Counter-Module zur Erzeugung von verschiedenen Signalen zur Verfügung gestellt wird.

31.1 ß ß ß

31.2

Features des PWM-Systems 16 bit Auflösung Verschiedenste Betriebs-Modi High Resolution Modus mit bis zu 128MHz

Erzeugung eines PWM-Signals

Die Einstellung des Taktverhältnisses einer PWM erfolgt über einen Timer. Im Beispielprogramm soll der Timer D0 zum Einsatz kommen. Dazu wird zunächst der interne Takt auf 32 MHz eingestellt. // set clock to 32 MHz OSC.CTRL |= OSC_RC32MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

261

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 261

R


32 Digital/Analog-Converter (DAC) Die XMEGA-Controller sind mit schnellen 12-Bit Analog-Modulen ausgestattet. Dazu gehört unter anderem auch ein high-performance Digital-Analog-Wandler, kurz DAC (für Digital zu Analog Converter), mit einer Geschwindigkeit von bis zu einer Million Wandlungen pro Sekunde bei einer Auflösung von 12 Bit. Der XMega256A3BU besitzt zwei DACs, die es dem Mikrocontroller erlauben, simultan zwei analoge Spannungen auszugeben. Anders als bei der PWM werden diese Spannungen als reale, stabile Spannungswerte ausgegeben und nicht als Effektivwerte eines bestimmten Impuls-Pausen-Verhältnisses. Weitere Eigenschaften wie duale Sample-hold Ausgänge, ein optionales Routing der DACAusgänge zu den On-Board-Komparatoren oder zum Analog/Digital-Wandler (ADC) des Controllers schaffen ein sehr flexibles Modul. Die Anwendungen erstrecken sich von qualitativ hochwertigem Stereo-Sound über High-Speed-Signalerzeugung bis hin zu KalibrierAnwendungen. Durch diese Ausstattung stoßen die XMEGA-Controller bereits bis in die Anwendungsbereiche einfacher Digitaler Signalprozessoren (DSP) vor. Die ehemals klar definierte Grenze zwischen DSP und Mikrocontroller beginnt also langsam zu verschwimmen. Insbesondere auch durch die DMA-Einheit (Direct Memory Access) und das interne Event System des XMEGA-Controllers kann die für die Wandlungen benötigte CPU-Leistung auf ein Minimum reduziert werden. Damit lässt sich die Bandbreite der erzeugten Signalformen weiter verbessern, sodass auch komplexere Anwendungen problemlos abgedeckt werden können. Der DAC des ATmega256A3BU besitzt zwei Kanäle und kann als Referenzspannung für die ADCs genutzt werden. Weiterhin ist sowohl eine interne als auch eine externe Spannungsreferenz wählbar.

32.1 ß ß ß ß

Leistungsmerkmale der DACs Auflösung: 12 bit Geschwindigkeit: bis zu 1 Millionen Wandlungen pro Sekunde kontinuierlicher oder Sample-and-hold Betrieb Integrierte Offset- und Verstärkungskalibrierung

269

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 269

R


33 Analog/Digital-Konverter (ADC) Analog/Digital-Wandler (bzw. engl. analog/digital converters oder ADCs) ermöglichen die Umwandlung von analogen Signalen in digitale Werte. Sie stellen somit also das Gegenstück zu den DACs dar. Der XMEGA 256 besitzt zwei ADCs mit jeweils 8 Eingängen und einer Auflösung von 12 Bit. Die ADCs können bis zu 2 Millionen Messwerte pro Sekunde (2 MSPS) erfassen. Zusätzlich verfügt jeder ADC über 4 Kanäle für die Messwertaufnahme. Dadurch können mit den ADCs bis zu vier Wandlungen durchgeführt werden, ohne dass die CPU des Mikrocontrollers den ADC unterbrechen muss. Die Eingangsstufen des ATXMEGAs ermöglichen sowohl unipolare als auch differentielle Messungen. Die ADCs sind jeweils dem Port A bzw. dem Port B des Controllers zugeordnet.

33.1

Leistungsmerkmale der ADCs

ß

Zwei Analog zu Digital Converter (ADCs)

ß

12-bit Auflösung

ß

Bis zu zwei Millionen Samples pro Sekunde Simultane Abtastung von zwei Kanälen 2,5 µs Conversion Time bei 8-bit Auflosung ! Bis zu 3,5 µs Conversion Time bei 12-bit Auflosung ! !

ß

Differentielle und single-ended Eingänge

ß

Bis zu 16 single-ended Eingänge

ß

16 x 4 differentielle Eingänge mit Verstärkungsfunktion

ß

Eingebaute differentielle Verstärkerstufe

277

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 277

R


34 Ausblick Damit ist der dritte Kursteil mit dem Thema Hardware-nahe Programmierung abgeschlossen. Die Ansteuerung von Controllerpins, der Einsatz von Timern, Countern und Interrupts stellen nun kein Problem mehr dar. Die peripheren Elemente eines Controllers wie ADCs und DACs wurden ausführlich diskutiert und anhand von praktischen Beispielen angewendet. Darüber hinaus wurden die Themen Takterzeugung und Oszillatoroptionen, Pulsweitenmodulation oder Real-Time-Counter etc. umfassend behandelt. Der Kursteilnehmer ist damit in der Lage, alle wichtigen Mikrocontroller-Elemente in der Praxis einzusetzen. Natürlich sind die Möglichkeiten eines modernen Controllers damit noch lange nicht ausgeschöpft. Die Komplexität der modernen Controllertechnik erfordert jahrelange Erfahrung, wenn man umfangreiche Aufgaben in Angriff nehmen und professionelle Lösungen erstellen will. Insbesondere bei zeitkritischen oder besonders ressourcenintensiven Anwendungen sind immer wieder neue Programmiertechniken und spezielle Optionen erforderlich. Wenn es um sicherheitsrelevante oder gar lebenserhaltende Systeme geht, wie z. B. im Bereich der Flugzeugsteuerung, der Medizintechnik oder der Steuerung von kerntechnischen Anlagen etc. sind spezielle Methoden und Erfahrungen erforderlich, die den Rahmen dieser Kursfolge natürlich bei weitem sprengen würden. Das hierfür erforderliche Spezialwissen kann nur durch jahrelange Arbeit und entsprechende Ausbildungen erworben werden. Weitere Teile zu dieser Kursfolge sind bereits in Planung. So werden spezielle Kapitel zu den Analogschnittstellen dieses umfassende Gebiet weiter vertiefen. Darüber hinaus sind Spezialkapitel zu den Themen

ß ß ß ß ß ß ß ß

Sensortechnik und Mikrocontroller, I2 C-Bus, DMA – Direct Memory Access, SPI – Serial Periperial Interface, USB-Interface, Displaytechnik, QTouch, etc. ...

in Vorbereitung. Zu diesen Themen werden, soweit möglich und erforderlich, Hardwaresätze angeboten werden. Diese gestatten es, im gewohnten Stil die erlernte Theorie in die Praxis umzusetzen.

293

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 293

R


35 Literatur Die folgenden Literaturhinweise sollen Hilfestellungen bieten, falls Grundlagen im Bereich der C-Programmierungen oder der Elektronik fehlen. Andererseits bieten sich die Werke auch als Weiterführung und Ergänzung zum vorliegenden Kurs an. o

B. W. Kernighan, D. Ritchie; The C Programming Language, Pearson (2004)

o

U. Tietze, C. Schenk, E. Gamm; Halbleiter-Schaltungstechnik, Springer-Verlag (2012)

o

P. Horowitz, W. Hill; The Art of Electronics, Cambridge University Press (1989)

295

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 295

R


36 Die Programme zum Kurs Sämtliche Quellcodes sowie die zugehörigen compilierten .hex-Dateien zu allen Projekten stehen auf der Elektor-webste unter www.elektor.de/... zum Download bereit. Falls Quellcodes verändert, erweitert oder ergänzt werden sollen, müssen die Programme auf die Festplatte des Rechners kopiert werden. Wer eigene Programmbeispiele anlegt, muss bestimmte Module in das Programm einbinden (siehe Abschnitt 3.6). In der Regel sind dies folgende Module aus dem ASF-Wizard:

ß ß ß ß ß ß ß

Generic board support (driver) GFX Monochrome – Monochrome Grafik Library (service) GFX Monochrome – System Font (service) GPIO – General purpose Input/Output (service) USART – Serial interface (service) Standard serial I/O Stdio (driver) IOPORT – Input/Output Port Controller (driver)

297

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 297

R


37 Abbildungs-, Tabellenund Programmverzeichnis 37.1 Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild

Abbildungen

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17

Beispiel für ein geeignetes Digitalmultimeter Aktiver USB-Hub Komplettes USB-Netzteil mit Mini-Stecker Programmiergerät JTAGICE3 Prinzipieller Aufbau eines Mikrocontrollers Leistungsumfang der Atmel-Controller im Vergleich Die Struktur eines ATMEL-Controllers Die XMEGA-Takt-Erzeugung Controlleranwendungen im KFZ-Bereich Einsatz von Controllertechnologie im Kraftfahrzeug Das XMEGA-A3BU Xplained-Board Das Board steht unter Strom! Messung der geregelten 3,3-V-Spannung mit einem Multimeter Menu-Übersicht zur vorinstallierten Software Menu-Übersicht auf dem LCD ATXMEGA256A3BU im TQFP-Gehäuse Anschlussbild für die Taster Die Temperaturkennlinie des verwendeten NTCs Kennlinie des Lichtsensors Neue Hardware wurde gefunden Das Xplained-Board wurde erkannt Manuelle Fortsetzung der Treiberinstallation Abschluss der Treiber-installation Erfolgreicher Start des Atmel-Studios Öffnen eines bestehenden Projekts Das Projekt LED0 ist erfolgreich geladen und kompiliert FLIP nach dem Start Auswahl des Controllertyps Installationsfenster für den DFU-Treiber Laden des Treibers Verbindung zum Controller herstellen Flip ist aktiv mit dem Controller verbunden Öffnen eines neuen Projektes Auswahl des Controllerboards Ein neues Projekt LED0_fast ist angelegt Fehlermeldung „implicit declaration...”

16 16 17 18 21 30 31 36 44 44 48 49 50 51 52 53 55 58 58 65 65 66 66 66 67 67 69 69 70 70 70 71 71 72 72 73

299

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 299

R


37 ABBILDUNGS-, TABELLEN- UND PROGRAMMVERZEICHNIS

Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild Bild

3.18 3.19 3.20 3.21 3.22 3.23 3.24 3.25 3.26 3.27 3.28 5.1 5.2 5.3 6.1 15.1 17.1 19.1 21.1 24.1 28.1 28.2 28.3 29.1 30.1 30.2 31.1 31.2 31.3 32.1 32.2 33.1 33.2 33.3

37.2 Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle

Start des ASF-Wizards Erfolgreiche Compilierung Auswahl eines GCC C Executable Projects Auswahl des Controllers Neues Projekttemplate Blinkprogramm ohne ASF-Unterstützung Integration des JTAGICE3 in das Atmel-Studio Der Bootloader in der ZIP-Datei Device-Programming-Fenster Device-Signature und Target Voltage Auswahl des Bootloaders Die Displaykoordinaten für die Textausgabe Das Programm Hello World in der IDE Hello World auf dem Display des Xplained-Boards Ablauf der Programmentwicklung Fehlermeldung wegen unbekannten Variablen Zweidimensionales Array mit 3 Zeilen und 4 Spalten Funktion des Präprozessors Aufnahme einer C-Datei in ein aktuelles Projekt LEDs und Taster des Controllerboards mit Portbelegung Clocksystem der XMEGA-Controller 2 MHz-Signal an PC7 32 MHz-Signal an PC7 auf einem Spektrumanalyzer Programmablauf unter Verwendung von Interrupts Zuordnung der Timer zu den Ports Timergesteuertes 1 kHz-Signal an PC0 Erzeugung eines Single-Slope-PWM-Signals Die PWM-Ausgangspannung gemessen an Pin 7 von J4 PWM-Signale für 0 %, 25 %, 50 % und 100 % Ausgangsspannung DAC-Ausgangsspannung mit unterschiedlichen Auflösungen Das Controllerboard als Funktionsgenerator Betriebsarten des ADCs Spannungsmessung mit dem Controllerboard Das Controllerboard als Voltmeter

Tabellen 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15

Untereinheiten der CPU CPU-Befehlsarten Die unterschiedlichen Registertypen Die Controller-Bussysteme Die verschiedenen Speichertypen Die wichtigsten Peripherie-Einheiten moderner Controller Aufgelistet sind hier die Vorteile der Harvard-Architektur Vergleich der Eigenschaften zwischen CISC und RISC Die bekanntesten Mikrocontroller-Hersteller und deren Umsatz Vergleich verschiedener Controller-Familien unterschiedlicher Hersteller Vergleich zwischen AVR und ATXMEGA Die Klassiker der AVR-Serie Die XMEGA-A1-Familie Die XMEGA-A3-Familie Die XMEGA-A4-Familie

300

L

74 75 75 75 76 77 78 79 80 80 80 90 91 92 93 143 158 183 197 210 237 243 244 247 250 253 262 264 264 274 276 281 285 286

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 300

22 22 22 22 23 23 24 25 27 28 30 33 33 34 35


TABELLEN 37.2

Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle

1.16 1.17 1.18 1.19 1.20 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 8.1 8.2 8.3 8.4 8.5 9.1 9.2 11.1 13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 16.1 17.1 21.1 24.1 24.2 25.1 26.1 26.2 26.3 26.4 27.1 27.2 32.1 32.2 32.3 33.1 33.2 33.3 33.4 33.5

Stromaufnahme der XMEGA-Controller Kenndaten der A/D-Wandler der XMEGA-Familie Kenndaten der D/A-Wandler der XMEGA-Familie Eigenschaften der Analogkomparatoren bei der XMEGA-Familie Auswahlkriterien für den richtigen Mikrocontroller Leistungsmerkmale des XMEGA-A3BU Xplained-Boards Die LEDs des Controllerboards Zuordnung der Taster zu den Controller-Pins Anschluss der Sensortaste QTB0 an den Controller Basisdaten des NTCs NCP18WF104J03RB von Murata Temperaturkennwerte des auf dem Board verwendeten NTCs Kennwerte des Helligkeitssensors Erweiterungsstecker J1 für Port C Erweiterungsstecker J2 für Port B, Port A und Analogeingänge Erweiterungsstecker J3 für PORT A und PORT B Erweiterungsstecker J4 für PORT E und PORT D Pin-Belegung der Flash-Einbauplätze Schlüsselwörter für Datentypen Schlüsselwort für Byte-Umfang von Datenobjekten Schlüsselwörter für Speicherklassen von Objekten Schlüsselwörter für Typqualifizierer von Daten-Objekten Schlüsselwörter für Strukturanweisungen C-Zeichensatz Sonderzeichen Variablen-Typen in C Arithmetische Operatoren Compound-Operatoren Logische Operatoren NOT-Operator AND-Operator OR-Operator Bitweise Verknüpfung Shift-Operatoren Vergleichsoperatoren Speicherinhalte bei Pointeroperationen Bezeichner für sprintf Standard-Headerdateien Die LEDs des Controllerboards mit Portbelegung Die Haupt-I/O-Register Mikrotaster des Controllerboards mit Portbelegung Zusätzliche I/O-Register der ATXMEGA-Controller Macros für Bitmanipulationen Abfrage-Makros Bitmasken der XMEGA-Serie Pin-Control-Register Ausgangs- und Pull-Konfigurationen im Pin-Control-Register DAC-Kontrolregister A (CTRLA) DAC-Kontrolregister B (CTRLB) DAC-Kontrolregister C (CTRLC) ADC-Kontrollregister B (CTRLB) ADC-Referenzkontrollregister (REFCTRL) Prescaler-Register-Bits Channel Control Register Belegung der ADCA-Kanäle

37 39 39 40 40 48 54 55 55 56 57 59 60 60 60 60 61 97 97 97 98 98 99 99 108 111 112 114 114 114 114 115 116 118 148 164 201 210 212 217 219 220 220 222 231 231 270 270 270 278 278 279 282 289

301

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 301

R


37 ABBILDUNGS-, TABELLEN- UND PROGRAMMVERZEICHNIS

37.3

Programme

Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm

3.1 3.2 3.3 5.1 5.2 11.1 11.2 12.1 13.1 13.2 13.3 13.4 13.5 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 14.10 14.11 14.12 14.13 14.14 15.1 15.2 15.3 15.4 15.5

Programm 15.6 Programm 15.7 Programm 15.8 Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm

15.9 15.10 16.1 16.2 16.3 16.4 16.5 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8

Ansteuerung der LED0 Programm LED0_fast.c Programm zur direkten Steuerung der Ports (GccApplication2.c) Hello World Hello World auf einem Standard-Unix-Rechner Anwendung von Ganzzahlen (integer) Fließkommazahlen (float) Konstante (const) Mathematische Operationen (operations) Compound-Operatoren (compound) Logische Verknüpfungen (logic) Bitweise und logische Verknüpfung (binary) Shift-Operatoren (shift) if Verzweigung (if) if … else Verzweigung (if_else) Die else-if-Verzweigung (else_if) Ternärer Operator (ternary) Die switch Verzweigung (switch) Die while-Schleife (while) Die do...while Schleife (do_while) Die for-Schleife (for) Verschachtelte Schleifen (for_interlaced) Externe Definition der Zählvariablen (for_ext_ini) Die Forever-Endlosschleife (for_ever) Komplexe for-Schleife Schleifenabbruch mit break (for_break) Schleifenabbruch mit continue (for_continue) Einfache Funktion (function_void_void) Funktion mit Argument und Rückgabewert (function) Funktion Quadratsumme (function_sum_sqr) Die Funktion des Pythagoras (function_pytagoras) Die Funktion des Pythagoras mit Fließkomma-Ergebnis (function_pytagoras_float) Funktion mit globalen Variablen (function_global_var) Funktion mit lokalen Variablen (function_local_var) Funktion mit doppelt definierten lokalen Variablen (function_local_double_var) Rekursiver Funktionsaufruf (recursion) Fibonacci-Zahlen (fibonacci) Zeiger auf eine Integer-Variable (pointer_int) Zeiger auf eine Long-Integer-Variable (pointer_long_int) Null-Zeiger (pointer_NULL) Pointer-Übergabe (pointer_add) Pointer auf Pointer (pointer_pointer) Einfaches Feld (array) Initialisiertes Array (array_initalized) Zweidimensionales Array (array_2_dim) Strings (string) Stringlänge ermitteln und Strings abschneiden (string_termination) Stringvergleich (string_compare) Formatierung mit sprintf (sprintf) Strings kopieren und verknüpfen (strcpy_strcat)

302

L

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 302

68 73 76 88 88 106 107 110 111 113 114 116 117 119 120 121 122 124 125 126 127 128 129 130 130 132 132 136 137 138 138 140 141 142 143 144 145 148 149 151 152 152 156 157 158 160 162 163 165 166


PROGRAMME 37.3

Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm Programm

17.9 17.10 17.11 17.12 18.1 18.2 19.1 19.2 19.3 19.4 20.1 20.2 21.1 21.2 21.3 21.4 21.5 21.6 24.1 25.1 26.1 26.2 26.3 26.4 26.5 27.1 27.2 28.1 28.2 28.3 28.4 28.5 30.1 30.2 30.3 30.4 31.1 31.2 31.3 32.1 32.2 32.3 33.1 33.2 33.3 33.4

Strings oder Character suchen (strstr_strchr) Strings in Zahlen umwandeln (atoi) Integer-Zahlen in Strings umwandeln (itoa) Float-Zahlen in Strings umwandeln (dtostrf) Strukturierte Programmierung (structures) Initialisierungsmöglichkeiten für Strukturen (structures_init) Symbolische Konstante (symb_const) Vordefinierte Konstanten (predef_const) Makro für die Berechnung eines Kreisumfangs (macro_PI) Makro für die Min/Max-Berechnung (macro_min_max) Bedingte Compilierung (conditional_compilation) Debug-Stufen (conditional_compilation_level) Das Hauptprogramm main.c Das Header-File functions.h Die zugehörige C-Datei functions.c Minimalistisches Hauptprogramm main.c Das Header-File functions.h Die zugehörige C-Datei functions.c mit allen Routinen Blinker für LED0 an PortR0 (io_port_LED_blink) Tasterstatus abfragen (read_SW0) LED0-Blinker mit Macros (sbi) LED0-Blinker XMEGA-Masken (LED0_blink_XMEGA) Wechselblinker (io_port_LED_double_blink) Toggeln eines Ausgangs (io_port_toggle) Schnelles Rechtecksignal (io_port_fast_toggle) Input-Optionen (Read_input_C0) Invertierung (Invert) Test des 2 MHz Standard-Oszillators (clk_std) Aktivierung des 32 MHz-Oszillators (clk_32_MHz) Rücksetzen auf 2 MHz (clk_2_MHz) 2 MHz-Systemtakt auf PC7 ausgeben (clk_at_PC7) Ausgabe von 32 MHz auf PC7 (clk_32_MHz_at_PC7) Erzeugung eines timer-gesteuerten 1 kHz-Signals (timer_interrupt) Timer-gesteuerte LED (timer_LED_control) Real Time Clock 32-Modul (RTC32) Externer Interrupt (ext_interrupt) PWM-gesteuerte Analogspannungen (PWM) PWM-gesteuerte LEDs (PWM_LED_dimmer) PWM-gesteuerte Backlight-LED (PWM_backlight_dimmer) Statische DAC-Ausgangspannung (DAC_static) Ansteuerung des DACs (DAC_coarse) Funktionsgenerator (function_generator) Ausgabe eines ADC-Wertes (ADC) Ausgabe eines präzisen Spannungsmesswertes (ADC_voltage) ADC-Steuerung über Funktionen (ADC_w_function) Mittelwertbildung (ADC_average)

168 169 171 172 177 179 184 185 186 188 192 193 198 198 199 199 199 200 211 217 221 224 225 226 227 233 234 239 240 241 242 243 252 253 256 259 263 266 267 272 273 274 283 285 289 291

303

atxmega-kurs – spanner elektor international media – 139012-1/D pagina 303

R


Die Mikrocontroller-Technik ist eines der wichtigsten Gebiete der modernen Elektronik. Mikrocontroller haben sich in den letzten Jahren in allen Bereichen der modernen Technik etabliert. Der vorliegende Kurs gibt eine umfassende Einführung in diese faszinierende Welt. Der Autor des vorliegenden Kurses ist seit über 20 Jahren im Bereich der Elektronikentwicklung und der Physikalischen Technologie für verschiedene Großkonzerne tätig.

ISBN 978-3-89576-288-8

Der zweite Teil beschäftigt sich detailliert mit der Programmierung des Controllers. Hier kommt die Sprache C zum Einsatz, da diese in der Firmware-Entwicklung eine dominierende Stellung einnimmt. Die überwiegende Mehrheit der professionellen Entwicklungsarbeit wird in C ausgeführt; diese Programmiersprache bietet also eine gute Grundlage für alle Controlleranwendungen. Im dritten Teil des Kurses wird schließlich auf die hardwarenahe Programmierung eingegangen. Nach der Erläuterung von Pin-Ansteuerung, Takterzeugung und Oszillatoroptionen werden die anspruchsvolleren Themen wie Interrupts, Timer und Counter, Pulsweitenmodulation und Analog-Digital-Wandlung behandelt. Der Kurs setzt auf die Philosophie des Learning by Doing. Er eignet sich dadurch hervorragend als praktische Ergänzung für Unterricht und Vorlesungen in • Weiterführenden Schulen • Technischen Berufsschulen und Fachakademien • Fachhochschulen und Universitäten

Elektor-Verlag GmbH 52072 Aachen www.elektor.de

Aber auch der ambitionierte, nichtprofessionelle Anwender kann sich mit dem Lernmaterial einen Überblick des aktuellen Standes der Controllertechnik verschaffen.

MIT C VON ANFANG AN

Neben seiner Tätigkeit als Dozent hat er sehr erfolgreich Fachartikel und Bücher zum Thema Elektronik, Halbleitertechnik und Mikrocontroller veröffentlicht sowie Kurse und Lernpakete zu diesen Themen erstellt.

Nach grundlegenden Betrachtungen der Controllertechnologie wird bereits im ersten Teil des Kurses auf die praktische Umsetzung des Stoffes eingegangen. Als Basis dient dazu ein modernes Entwicklungsboard, das mit einem der aktuellsten Controller des Herstellers Atmel ausgestattet ist.

PRAXISKURS AVR-XMEGA-MIKROCONTROLLER

Günter Spanner

AVR-XMEGA-MIKROCONTROLLER

GÜNTER SPANNER

MIT C VON ANFANG AN

PRAXISKURS

LEARN

AVR-XMEGA-MIKROCONTROLLER

DESIGN

PRAXISKURS

Günter Spanner LEARN

DESIGN

SHARE

SHARE

LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SH RN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● SIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● S RN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE

COVER Praxiskurs.indd All Pages

12/03/15 13:56


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.