Vorwort und »Gebrauchsanweisung«

Ein gutes Kochbuch erkennt man an zwei Dingen: Zum einen verfügt es über einen allgemeinen Teil, der nützliche grundlegende Tipps und Anweisungen rund ums Kochen enthält, ohne deren Kenntnis das tollste Rezept nicht gelingt. Darunter fallen beispielsweise die korrekte Zubereitung der verschiedenen Fleischsorten, die Lagerung von Gemüse oder einige einfache Saucen. Zum anderen sollen die Rezepte selbst von einer Qualität sein, die es erlaubt, aus möglichst einfachen Zutaten ohne großen Aufwand ein möglichst schmackhaftes Ergebnis zu zaubern. Idealerweise gefolgt von möglichen Variationen, falls eine Zutat gerade nicht zur Hand ist.

Die Grundlagen sind zwar vielleicht für erfahrene Hobbyköche eher uninteressant. Aber wenn sie nicht vorhanden sind – und der eine oder andere Hinweis ist mit an Sicherheit grenzender Wahrscheinlichkeit für jemanden neu – so können neue Versuche an Kleinigkeiten scheitern und rasch macht sich Frustration breit.

Nach dieser Logik haben wir den ersten Teil des Buches gestaltet. Die Grundlagen sollen eine gemeinsame Basis schaffen und Einsteigern Konzepte vermitteln, auf denen alles Weitere aufbaut. Auf diese folgen einfache Anwendungen, in welchen die Umsetzung der theoretischen Konzepte an einfachen praktischen Beispielen demonstriert wird.

Den Einstieg bilden also Mikrocontroller-Grundlegenden (Kapitel 1), gefolgt von Allgemeinem zur Programmierung und Implementierung (Kapitel 2), von Bitoperationen bis zu einfachen Codegerüsten, die den Brückenschlag zwischen den theoretischen Grundlagen und der realen Umsetzung bilden sollen. Letzteres geht auf Erste Schritte (Kapitel 2.5) mit einem Mikrocontroller ein, den Allgemeinen Programmaufbau (Kapitel 2.6) sowie detailliert auf die allgemeine Implementierung der einzelnen Peripherieeinheiten und Grundbausteine (Kapitel 2.7).

Schließlich kommen wir zu den eigentlichen »Rezepten« (Kapitel 3 bis 12), anhand derer wir unsere Mikrocontroller-»Süppchen« nach Lust und Laune kochen können. Hier finden sich Beispiele zum Schalten von LEDs und anderen Lasten, zur Messung verschiedener Größen (Strom, Spannung, Kapazität, Temperatur, Frequenz, ...), zum Erzeugen von Signalen oder zur Kommunikation über diverse Schnittstellen – um einige zu nennen.

Wir haben versucht, eventuell auftretende Unklarheiten an Ort und Stelle etwa durch angeführte Beispiele im Text zu beseitigen. Für den Fall, dass trotzdem welche auftreten, bildet ein Anhang mit verschiedenen Hinweisen und Tabellen den Abschluss (Kapitel 13).

Die Autoren möchten sich bei all jenen bedanken, die bei der Entstehung dieses Buches mitgewirkt und es dadurch erst ermöglicht haben.

Abschließend bleibt uns nur noch, dem Leser viel Freude und Erfolg auf dem spannenden Gebiet der Mikrocontrollerprogrammierung zu wünschen, und wir hoffen, mit diesem Buch dazu beizutragen.

Sicherheitshinweis:

Unfälle mit Strom können schmerzhaft oder sogar tödlich sein, daher ist besondere Vorsicht geboten. Bestehende Normen und Sicherheitsrichtlinien zum Umgang mit dem elektrischen Strom sind unbedingt zu konsultieren und zu beachten, folgende Hinweise gelten nur als Richtlinie.

Niedrige Spannungen unter 25 V Wechselspannung beziehungsweise 60 V Gleichspannung gelten als ungefährlich. Unter außerordentlichen Bedingungen kann aber auch eine geringe Wechselspannung unter Anderem den Herzrhythmus stören. Vor allem Mischspannungen (Gleichstrom mit Wechselstromanteil) sind gefährlich.

Zudem gelten viele in der Elektronik eingesetzte Chemikalien als gesundheitsschädigend, insbesondere Blei und Kadmium in Lötzinn. Daher sind diesbezüglich ebenfalls Vorsichtsmaßnahmen zu treffen.

Atmel®, Atmel logo and combinations thereof, AVR®, PicoPower® and others are registered trademarks or trademarks of Atmel Corporation or its subsidiaries.

Einführung

Mikrocontroller können als kleine Computer verstanden werden, die im Gegensatz zu ihren großen Verwandten gezielt für spezielle, mehr oder weniger komplexe Aufgaben eingesetzt werden. Sie bilden den Kern von vielen Eingebetteten Systemen (Embedded Systems), welche für die Funktion der meisten modernen elektronischen und mechatronischen Systeme verantwortlich sind, die inzwischen so selbstverständlich zum alltäglichen Leben gehören.

Die möglichen Einsatzszenarien sind so vielseitig, dass es womöglich einfacher wäre, jene modernen technischen Geräte herauszupicken, in denen ausnahmsweise kein Mikrocontroller steckt.¹ Von MP3-Playern und Handys über Haushaltsgeräte und Kraftfahrzeugkomponenten bis hin zu Kraftwerken und Industrie-Großanlagen – Mikrocontroller übernehmen eine kaum überschaubare Vielzahl unterschiedlichster Aufgaben. Allein in einem modernen Personenkraftwagen können über 100 Mikrocontroller verbaut sein.

Ein Mikrocontroller ist insofern mit einem Personal Computer vergleichbar, als er aus ähnlichen Komponenten aufgebaut ist: Ein Prozessor bildet sein Herzstück, es gibt einen Arbeits- und einen dauerhaften Programmspeicher sowie Zusatzperipherie wie beispielsweise Ein- und Ausgabeeinheiten. Man spricht allerdings erst von einem Mikrocontroller, wenn all diese Bausteine auf einem einzelnen Chip integriert sind.² Im Laufe des folgenden Abschnitts Grundlegende Konzepte wird genauer auf die Bestandteile und Charakteristiken eingegangen, die für das Verständnis der Funktionsweise, der Möglichkeiten und Grenzen eines Mikrocontrollers essenziell sind.

Zur Erläuterung wurden AVR®-Mikrocontroller von Atmel® gewählt, da sie weit verbreitet und leicht erhältlich sind. Auch ist der Umgang mit ihnen einfach zu erlernen, da sie einen eleganten und vergleichsweise einfachen Aufbau haben. Die Codebeispiele wurden in der Programmiersprache C geschrieben, um dem Industriestandard gerecht zu werden. Die Grundlagen und Beispiele gelten aber auch für Mikrocontroller anderer Hersteller beziehungsweise sind, mit geringen Abweichungen, auf jene übertragbar. Gerade dieses erste Kapitel ist so ausgelegt, dass es den Leser befähigen soll, sich rasch auch in »fremde« Mikrocontroller einzuarbeiten sowie deren Besonderheiten zu erkennen.

Falls der Leser bereits einen Blick in einschlägige Internetforen geworfen hat, werden ihm womöglich die beinahe religiös anmutenden Diskussionen rund um die Frage auffallen: »Welche Mikrocontroller sind die besten?« Generell kann man diesen Punkt – wie bei den meisten ähnlich lautenden Fragen – nur beantworten mit: »Es kommt darauf an«.

Mikrocontroller werden je nach Anwendung bezüglich Architektur, Speicher und Zusatzfunktionen sowie Kosten, Leistungsverbrauch und Verfügbarkeit ausgewählt (nach Abschluss des Grundlagenkapitels wird das verständlicher). Üblicherweise hat jeder große Hersteller eine Vielzahl vergleichbarer Lösungen parat, wodurch es letztendlich nicht selten auf persönliche Präferenzen hinausläuft, ob man nun einen Mikrocontroller von Atmel®, Freescale™, Microchip, NXP, Renesas, Texas Instruments oder einem anderen »Global Player« wählt.

Dieses Buch setzt Basiskenntnisse in der Programmiersprache C voraus. Zum Erlernen sei auf entsprechende Fachbücher und Online-Tutorials verwiesen. Die Grundlagen werden jedoch auch in einem eigenen Abschnitt kurz wiederholt und um mikrocontrollerspezifische Details erweitert.

Hinweis:

Wir haben viele generell für Mikrocontrolleranwendungen wichtige Maßnahmen an der Stelle beschrieben, an der sie das erste Mal auftauchen beziehungsweise von elementarer Bedeutung sind. Das bedeutet nicht, dass sie nicht auch für andere Anwendungen zu beachten sind – wir benutzen daher viele Querverweise und haben uns bemüht, ein möglichst umfangreiches Stichwortverzeichnis zu pflegen, damit jeder Hinweis und jede Erklärung auffindbar sind.

____________________

¹ Neben Mikrocontrollern gibt es beispielsweise noch ASICs, FPGAs und DSPs, welche eine vergleichbare beziehungsweise spezialisiertere Rolle übernehmen können und je nach Anwendung vorzuziehen sind.

² Hier gibt es auch Ausnahmen, etwa ältere oder besonders leistungsstarke Mikrocontroller, bei welchen der Speicher auch extern angeschlossen werden kann. Die genannte Definition ist auch nur eine der möglichen.

Inhaltsverzeichnis

1Mikrocontroller-Grundlagen

1.1Was ist ein Mikrocontroller?

1.2Grundlegende Konzepte

1.2.1Die Prozessorarchitektur

1.2.2Gehäuse (Package)

1.2.3Datenblätter, Manuals und Errata

1.2.4Versorgungsspannung und Signalpegel

1.2.5Speicher

1.2.6Takt und Taktgenerierung

1.2.7Interrupts

1.2.8Timer (Zähler)

1.2.9Register

2Programmierung und Implementierung

2.1Allgemeines zur Programmierung

2.1.1Eigenheiten der Mikrocontrollerprogrammierung

2.1.2Schlüsselwörter

2.1.3Portierbarkeit von Code

2.1.4Codeoptimierung

2.1.5Compilereinstellungen

2.2Programmierung des Mikrocontrollers

2.2.1Programmierumgebung

2.2.2Programmieradapter

2.2.3ISP

2.2.4Fuses

2.2.5Bootloader

2.3Debugging

2.3.1Printf-Debugging

2.3.2Software-Emulator

2.3.3JTAG und DebugWIRE

2.3.4Hardware-Debugging

2.4Bitoperationen

2.4.1Bitoperatoren

2.4.2Bits setzen, löschen und toggeln

2.4.3Bits prüFen

2.5Erste Schritte – ein einführendes Programm

2.5.1Schaltungsaufbau

2.5.2Programmcode

2.5.3Programmierung des Controllers

2.6Allgemeiner Programmaufbau

2.6.1Außerhalb der Hauptroutine

2.6.2Hauptroutine

2.7Grundbausteine – Funktionsweise und Implementierung

2.7.1Interrupts

2.7.2Timer

2.7.3Delay

2.7.4IO-Pins (GPIOs)

2.7.5AD-Wandler

2.7.6DA-Wandler

2.7.7Komparator

2.7.8PWM

2.7.9UART/USART

2.7.10SPI / Microwire

2.7.11I² C / TWI / 2-Wire

2.7.12CAN

2.7.13USB

2.7.14Zustandsautomat (State Machine)

2.7.15Watchdog

2.7.16Brownout-Detektor

2.7.17Low Power und Schlafzustände

2.7.18General Purpose I/O Register und Fehlerbehandlung

3Digitale Ein- und Ausgänge

3.1Pegelwandler

3.2Pinerweiterung mit I/O-Bausteinen

3.2.1SPI-Schieberegister: die 74xx595-Familie

3.3Schalten großer Lasten

3.3.1Schalten mit MOSFETs

3.3.2Schalten mit Bipolartransistoren

3.3.3Ausgangstreiber

3.3.4Relais

3.3.5Wechselspannungen schalten

3.4Schutzschaltungen

4Spannungsmessung

4.1Anpassung des Eingangsspannungsbereichs

4.2AD-Wandlungsergebnis berechnen

4.3Referenzspannung

4.3.1Interne Referenzspannungsquelle

4.3.2Externe Referenzspannungsquelle

4.4Interner AD-Wandler

4.4.1Konfiguration

4.5Externer AD-Wandler

4.5.1ADC Mit I²C-Schnittstelle

4.5.2ADC Mit SPI-Schnittstelle

4.5.3Parallel angeschlossene ADCs

4.6Verifizieren der Messung

4.6.1Referenz- und Versorgungsspannung

4.6.2Das Histogramm

4.6.3Für Fortgeschrittene: Zufall und Korrelation

4.7Messen von Wechselspannungen

4.7.1Parameter einer Wechselspannung

4.7.2Effektivwertmessung (RMS)

4.7.3Spitzenwertmessung

5Spannungen Ausgeben

5.1Interner DA-Wandler

5.2Externer DA-Wandler

5.3Analogspannung Mit PWM Generieren

5.3.1Analogspannung Mit Fast-PWM

5.3.2Für Fortgeschrittene: Filterauslegung

5.4Software-PWM

5.4.1Software-PWM mit Compare Match

5.4.2Software-PWM mit Timer Overflow

6Widerstandsmessung

6.1Spannungsteiler

6.2Messung mit Konstantstrom

6.3Ratiometrische Messung

7Strommessung

7.1Messung mit Shuntwiderstand

7.1.1Current Shunt Monitor

7.2Transimpedanzverstärker

7.3Hallsensor

7.4Stromwandler

7.5Strommessung mit Einem Kondensator

8Zeit- und Frequenzmessung

8.1Periodendauermessung

8.1.1Beispiel Messung der Periodendauer mit Timer und analogem Komparator

8.2Zählen der Nulldurchgänge

9Kapazitäts- und Induktivitätsmessung

9.1Ladekurve

9.2Schwingkreis

9.3RC-Oszillator

10Temperaturmessung

10.1Widerstandstemperatursensoren

10.1.1Ptxxx (Pt100, Pt1000, ...)

10.1.2KTY-Serie

10.1.3PTC

10.1.4NTC

10.2Halbleitertemperatursensoren

10.2.1AVR®-interner Temperatursensor

10.2.2Externe Temperatursensoren mit Spannungs-/Stromausgang

10.3Thermoelement

10.4Digitale Temperatursensoren

10.4.1Beispiel LM75-kompatibler I²C-Temperatursensor

11Kommunikation mit Menschen

11.1Eigenes »Printf()«

11.2LEDs und 7-Segment-Anzeigen

11.2.1LEDs

11.2.27-Segment-Anzeige

11.2.3RGB-LED mit PWM

11.3Taster und Keypads

11.3.1Matrixtastatur

12Daten Speichern

12.1Internes EEPROM

12.2Interner Flash-Speicher

12.2.1Lookup-Tabelle Im Flash

12.3Externe Speicher

12.3.1SPI-Flash

13Anhang

13.1Elektrotechnische Grundgleichungen

13.1.1Das Ohm’sche Gesetz

13.1.2Serien- und Parallelschaltung R, C, L

13.1.3Spannungsteiler

13.1.4Grenz- und Resonanzfrequenz

13.1.5Bandbreite eines Rechtecksignals

13.2Darstellung von Bauteilwerten

13.3E-Reihe

13.4Temperaturbereiche

13.5LED-Vorwiderstand

13.5.1Berechnung

13.6Dezibel (dB)

13.6.1Signal-Rausch-Verhältnis SNR

13.7Kalibrierung

13.7.1Kalibrieren, Justieren und Eichen

13.7.2Grundprinzip der Kalibrierung

13.7.3Ein-Punkt-Kalibrierung

13.7.4Zwei-Punkt-Kalibrierung

13.8Linearisierung

13.8.1Vorgehensweise

13.9Lookup-Tabellen

13.10Steckbrett, Loch- und Streifenrasterplatinen

13.11Dualsystem

13.12Zweierkomplement

Stichwortverzeichnis

1Mikrocontroller-Grundlagen

1.1Was ist ein Mikrocontroller?

Man spricht von einem Mikrocontroller (μC, MicroController Unit MCU), wenn außer dem Mikroprozessor selbst noch Peripherieeinheiten in einen Chip integriert sind. Dieses erste Kapitel dient dem genaueren Verständnis der grundlegenden Funktionen, Möglichkeiten und Grenzen eines Mikrocontrollers. An dieser Stelle wird vieles noch bewusst vereinfacht dargestellt, auf das in späteren Kapiteln noch genauer eingegangen werden soll.

Das Herzstück einer jeden MCU ist der beinhaltete Prozessor oder Kern (Core), also die für die Ausführung der Programme zuständige Recheneinheit. Je nach Anzahl der auf einmal verarbeitbaren Bits spricht man von 4-, 8-, 16- oder 32-Bit-Mikrocontrollern. Ein Bit (Binary Digit) ist die kleinste Informationseinheit in digitalen Systemen, mit der ein Prozessor auf unterster Ebene rechnet. Es kann entweder den Wert null oder eins haben³. Jeder Befehl eines Programms, jede Form von gespeicherten Daten – also alles, was eine digitale Recheneinheit verarbeiten soll – wird letztendlich in mehr oder weniger komplexe Bitmuster aus Einsen und Nullen umgewandelt, die der Prozessor dann der Reihe nach bewältigen kann.

Zum Betrieb benötigt ein Prozessor außerdem einen Takt, also ein Signal bestehend aus periodischen Taktimpulsen (abwechselnd 1 und 0) in einer gewissen Geschwindigkeit. Der Takt kann entweder intern generiert oder extern zugeführt werden. Angegeben wird er in Hertz (1 Hz = 1/s), also in Taktimpulsen pro Sekunde.

Da wir aber nur selten mit so niedrigen Frequenzen zu tun haben, findet man eher Angaben in kHz (Kilo-Hertz, also 1.000 Hertz) oder MHz (Mega-Hertz, also 1.000.000 Hertz). Signalen im GHz-Bereich (Giga-Hertz, 1.000.000.000 Hertz) wiederum begegnet man nur in Ausnahmefällen.

Hinweis:

Im Zusammenhang mit Datenübertragung werden Taktfrequenzen eher in Baud (1 Bd = 1/s) angegeben. Ein Baud entspricht also einem Hertz und wird auch gleichermaßen skaliert (1 kBd = 1.000 Bd etc.).

Bei der Angabe von Übertragungsgeschwindigkeiten kann man auch von einer Baudrate anstatt einer Taktrate sprechen.

Mehr Hertz bedeuten also mehr Taktimpulse pro Sekunde und daher einen schnelleren Takt und eine größere Ausführungsgeschwindigkeit, also mehr Rechenoperationen pro Sekunde.

Die zuvor in Verbindung mit dem Prozessor erwähnte Bit-Zahl sagt nun aus, wieviele Bits ein Prozessor mit einem Taktschritt verarbeiten kann. Arbeitet beispielsweise ein 8-Bit-Mikrocontroller mit 20 MHz (Mega-Hertz), so kann er 20 Millionen Mal pro Sekunde jeweils 8 Bits verarbeiten.⁴ Der AVR® ist ein Vertreter der Gattung der 8-Bit-Prozessoren.

Prozessoren, die mehr Bits gleichzeitig verarbeiten können (etwa 32 statt 8), sind also leistungsfähiger. Die Ausführungsgeschwindigkeit des Programms steigt außerdem mit dem Takt, mit dem der Prozessor betrieben wird. Ein 32-Bit-Prozessor ist aber bei gleichem Takt nicht automatisch viermal so schnell wie ein 8-Bit-Prozessor, da viele Faktoren eine Rolle spielen.

Bei der Angabe von Geschwindigkeiten und Stromverbrauch gilt bei vielen Mikrocontrollern die alte Steigerungsregel: Notlüge, Lüge, Benchmark. Nicht dass wir den Herstellern unterstellen würden, gefälschte Werte zu veröffentlichen, es wird aber so stark geschönt und für das eigene Produkt vorteilhaft gemessen, dass ein konkreter Vergleich zwischen den unterschiedlichen Architekturen und Herstellern nur sehr schwer möglich ist.

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!