Vorwort

Standardisierte Hardware hat dem PC zu seinem Erfolg verholfen. In der Mikrocontrollertechnik ist dem Arduino ein vergleichbarer Erfolg gelungen. Mit aufsteckbarer Hardware, die als Shield bezeichnet wird, stehen Schaltungen wie Motorbrücken oder EKG, Ethernet oder XBEE-Karten und vieles mehr zur Verfügung. Da ist es naheliegend, diese Hardware auch in C zu programmieren. Aus diesem Blickwinkel ist dieses Buch geschrieben. Es wendet sich an Mikroelektroniker, die bereits »Hello world« hinter sich haben und auch mit einem Steckbrett umgehen können. Es wird gezeigt, dass nicht nur der Arduino infrage kommt, sondern auch mit älteren Prozessoren wie dem ATmega8 und mit verschiedensten Programmiergeräten gearbeitet werden kann. Geordnet nach Preisklassen, wird die Hardware vorgestellt.

Wer Mikrocontroller in C programmieren will, findet in diesem Buch einen entsprechenden Kurs, bei dem zumindest einfache C-Kenntnisse vorausgesetzt werden. Inhalt ist die Grundlage für die Programmierung von Mikroprozessoren.

Auch die serielle Schnittstelle wird besprochen. Die Programme sind so geschrieben, dass sie für den ATmega8 und ATmega328P verwendet werden können. In Kapitel 6.3 wird die Standardein- und -ausgabe, wie scanf und printf, festgelegt. Die Methoden, um die serielle Schnittstelle mit dem Atmel Studio anzusprechen, werden in den Projekten angewandt.

Programmentwicklung mit Zustandsdiagrammen und Automatentabellen wird ebenfalls behandelt. Die damit gelösten Probleme sind vollständig in C-Programme umgesetzt. Lesern, die Zustandsdiagramme noch nicht in der Praxis eingesetzt haben, sei dieser Abschnitt besonders ans Herz gelegt.

Zur Behandlung abgeschlossener und vollständig gelöster Probleme werden Physik, Elektronik, Regelungstechnik und Programmierung besprochen. Die Projektbeschreibungen beschränken sich nicht auf eine Anleitung, um die Projekte nachbauen zu können, sondern behandeln auch die wesentlichen theoretischen Grundlagen zur Problemlösung. Nach der Lektüre dieses Buchs wird der Leser dank der diskutierten Grundlagen neue Probleme lösen können.

Weitere Informationen zu diesem Buch finden Sie im Internet unter www.avr-ploetzeneder.com.

Inhaltsverzeichnis

1Zahlendarstellung

1.1Zehner- oder Dezimalsystem

1.2Binärsystem

1.2.1Positive Binärzahlen

1.2.2Positive und negative Zahlen im Binärsystem

1.2.3Rechnen im Binärsystem

1.3Oktalsystem

1.4Hexadezimalsystem

2Hardware

2.1Richtlinien zur Auswahl der Hardware

2.2Hardware-Auswahl bei einer Investition von 100 Euro

2.2.1STK500

2.2.2Dragon mit Arduino

2.3Hardware-Auswahl bei einer Investition von 50 Euro

2.3.1STK500-kompatibler Programmieradapter mit Arduino

2.4Hardware-Auswahl bei einer Investition von deutlich unter 50 Euro

2.4.1Arduino mit Bootloader

2.5Alternative Entwicklungs-Boards

2.6Alternative Programmiergeräte

2.7Empfehlung

3Softwaretools zur Programmierung

3.1Entwicklungsumgebung

3.2Blinklicht mit dem Atmel Studio 6

3.3Blinklicht mit CodeVisionAVR

4Perfektionskurs in C

4.1Variablen und Konstanten

4.1.1Character

4.1.2Integer

4.1.3Long

4.1.4Float und Double

4.2Entscheidungsstrukturen

4.2.1If

4.2.2If-else

4.2.3If-else-Kette

4.2.4Kurzform für die Kontrollstruktur mit ternärem Operator

4.2.5Switch

4.3Modulooperator

4.3.1Zerlegen einer Zahl in Einer- und Zehnerstelle

4.3.2Umwandlung einer dreistelligen Zahl in einen String

4.3.3Modulo in einer Schleife mit dem Schleifenindex

4.4Bitweiser Zugriff auf ein Byte

4.4.1Setzen von Bits mit dem Oder-Operator

4.4.2Löschen von Bits mit dem Und-Operator

4.4.3Toggeln von Bits mit dem Exklusiv-Oder-Operator

4.5Unterprogramme

4.5.1Definition, Deklaration und externe Vereinbarung

4.6Zeiger

4.6.1Zeiger auf Integer

4.7Schleifen

4.7.1For-Schleife

4.7.2While-Schleife

4.7.3Do-while-Schleife

4.7.4Schleifen aussetzen

4.8String

4.8.1Aufbau von Strings

4.8.2String-Funktionen mit Format-String

4.9Ausgabe mit Formatangabe

4.10Eingabe mit Formatangabe

4.11Arrays und Zeiger

4.11.1Zeiger und Adressen

4.11.2Funktion String-Länge mit Zeiger

4.11.3Funktion strlen() mit Zeigerarithmetik

4.11.4Zeichenketten und Character-Zeiger

4.11.5Array von Zeigern

5Die serielle Schnittstelle

5.1Die serielle Schnittstelle am PC

5.2Elektrisches Signal der seriellen Schnittstelle

5.3Verdrahtung der RS-232-Schnittstelle

5.4Verfügbares Terminal-Programm

5.4.1Hyperterminal

5.4.2HTerm

5.4.3Terminal der Entwicklungsumgebung CodeVisionAVR

5.5Terminal-Programme im Sourcecode

5.5.1Terminal-Programm mit LabVIEW

5.5.2Terminal-Programm mit C#

5.6Terminal-Programm testen

6Programmierung der seriellen Schnittstelle des AVR

6.1Programmierung mit CodeVisionAVR

6.2Programmierung im Atmel Studio

6.3Programmierung der seriellen Schnittstelle mit formatierter Ein- und Ausgabe

6.4Interruptgesteuerte Programmierung mit verfügbarer Bibliothek

7Grundfunktionen der Timer

7.1Timerinterrupt mit CodeVisionAVR

7.2Timerinterrupt mit Atmel Studio

7.3CTC-Modus des Timers ohne Interrupt

7.4CTC-Modus des Timers mit Interrupt

7.5Pulsweitenmodulation (PWM) mit Timer 1

7.5.1Ein PWM-Signal mit Timer 1 erzeugen

7.5.2PWM-Signal erzeugen und Interrupt auflösen

7.5.3Gleichzeitig zwei PWM-Signale mit dem Timer 1 erzeugen

8Digitale Ein- und Ausgabe ohne externe integrierte Schaltkreise (ICs)

8.1Einlesen von digitalen Signalen

8.1.1Direktes Einlesen eines einzelnen digitalen Signals

8.1.2Einlesen eines Tasters

8.1.3Taster einlesen und entprellen mit nachfolgender Auswertung einer Flanke

8.1.4Einlesen einer 4x4-Tastatur

8.1.5Einlesen einer 3x4-Tastatur mit Diodenlogik

8.2Ausgabe digitaler Signale

8.2.1Ansteuerung einer einzelnen Siebensegmentanzeige

8.2.2Ansteuerung von zwei Siebensegmentanzeigen nach dem Multiplexprinzip

8.2.3Ansteuerung eines Siebensegmentdisplays mit 2½ Stellen nach dem Multiplexprinzip

8.2.4Ansteuerung von Leuchtdiode mit möglichst wenigen Leitungen

9Ein- und Ausgabe mit ICs zur Verminderung der Port-Leitungen

9.1Tastatur mit Demultiplexer und Prioritätsencoder

9.2Siebensegmentanzeige mit Schieberegister

10Endlicher Automat

10.1Allgemeine Einführung

10.2Vor-Rück-Zähler mit endlichen Automaten und Zustandsdiagramm

10.3Codeschloss

10.4Entprellen von Kontakten

10.5Auswertung von Schaltflanken

10.6Auswertung eines Inkrementalgebers (Drehgeber)

11Schrittmotor

11.1Allgemeine Informationen

11.2Prinzipielle Arbeitsweise

11.3Aufbau und Ansteuerung von Elektromagneten

11.4Endstufe für bipolare und unipolare Schrittmotoren

11.5Wicklungsarten

11.6Programme zur Ansteuerung

11.6.1Einfaches Programm

11.6.2Schrittmotoransteuerung im Interrupt

11.6.3Schrittmotoransteuerung über die RS-232-Schnittstelle

11.7Mikroschrittansteuerung

12Distanzmessungen mit Ultraschallsensoren

12.1Funktionsweise

12.2Ultraschallsensor SRF02

12.3Ultraschall-Eigenbausensor

13Transistorkennlinie aufnehmen und grafisch darstellen

13.1Arbeitsweise des Kennlinienschreibers

13.2Darstellung der Daten in Excel

13.3Darstellung der Daten mit einem grafischen LCD

14Schwebende Kugel

14.1Prinzip und Versuchsaufbau

14.2Regelungstechnisches Modell

14.3Schaltplan

14.4Programm für die schwebende Kugel

14.5Aufbau und Inbetriebnahme

15EKG

15.1Grundlegendes zum Elektrokardiogramm

15.2Sicherheitshinweis

15.3Einfache EKG-Schaltung

15.4EKG-Shield von Olimex

15.5Darstellung der Daten in Excel

15.6Darstellung der Daten in einem grafischen LC-Display

Anhang

Stichwortverzeichnis

1Zahlendarstellung

1.1Zehner- oder Dezimalsystem

Das Zahlensystem mit der Basis zehn ist uns aus dem Alltag bekannt. Jede Stelle einer Zahl hat eine bestimmte Wertigkeit, so unterscheiden wir die Einer-, Zehner- und Hunderterstelle.

Abb. 1.1: Links Wertigkeit der Stellen, rechts Dezimalzahl 165

Um Verwechslungen auszuschließen, schreiben wir die Zahl mitunter so: 165D.

Zahlensysteme, deren Stellen eine Wertigkeit haben, die um Potenzen ansteigen, bezeichnet man als polyadisch. (Eine Uhrzeit mit Stunden, Minuten und Sekunden ist nicht polyadisch.) In der Computertechnik sind neben dem Dezimalsystem noch zweier-(binär), achter-(oktal) und 16er-Systeme (hexadezimal) verbreitet.

1.2Binärsystem

1.2.1Positive Binärzahlen

Im Binärsystem gibt es nur zwei Ziffern mit den Werten Null und Eins. Diese werden üblicherweise mit »0« und »1« dargestellt. Die Wertigkeit der Stellen ist in Zweierpotenzen ansteigend.

Abb. 1.2: Binärzahl 1011B

Damit wir die Binärzahl 1011 von der Dezimalzahl Eintausendelf unterscheiden können, schreiben wir im Text »1011B«. In einem C-Programm, das von einem Compiler einen Maschinencode erzeugt, schreibt man »0b1011«. (Die im Buch verwendeten C-Compiler können diese Schreibweise verarbeiten, obwohl sie nicht dem ANSI-Standard für C entspricht.)

Bei einem 8-Bit-Mikrocontroller werden nicht einzelne Bits abgespeichert, sondern 8 Bits als kleinste Einheit. Einen Block von 8 Bit bezeichnet man auch als Byte. Ein Byte, das nur positive Zahlen darstellt, hat als größten Wert 1 * 128 + 1 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 255.

1.2.2Positive und negative Zahlen im Binärsystem

Der erste Gedanke, eine negative Zahl darzustellen, ist ein Bit für das Vorzeichen zu reservieren. Diese Methode hat aber zwei Nachteile. Der Wert Null kommt als +0 und -0 vor. Noch schwerwiegender ist, dass die arithmetischen Operationen Fallunterscheidungen benötigen. Werden z. B. eine positive und eine negative Zahl addiert, muss statt der Addition eine Subtraktion ausgeführt werden. Diesen Aufwand will man vermeiden. Gesucht ist ein Zahlensystem, das bei einer Addition, unabhängig davon, ob die Zahlen positiv oder negativ sind, den richtigen Wert ermittelt. Gelöst wird das Problem, indem man die negativen und positiven Zahlen im Zweierkomplement darstellt. Eine 4 Bit lange Zahl kann in der Zweierkomplementdarstellung Werte von -8 bis +7 annehmen.

Tabelle 1.1: 4 Bit Binärzahl im Zweierkomplement

Dezimalzahl | Binärzahl in Zweierkomplementdarstellung
7 | 0111
6 | 0110
5 | 0101
4 | 0100
3 | 0011
2 | 0010
1 | 0001
0 | 0000
-1 | 1111
-2 | 1110
-3 | 1101
-4 | 1100
-5 | 1011
-6 | 1010
-7 | 1001
-8 | 1000

Das Bit-Muster für die positiven Zahlen entspricht unseren Erwartungen. Wie man von einer positiven Zahl zu einer negativen Zahl kommt, ist nicht sofort ersichtlich. Deshalb werden zuerst noch die Rechenregeln und Beispiele für Zahlen im Binärsystem erläutert.

1.2.3Rechnen im Binärsystem

Rechenregel:

0B + 0B = 0B

0B + 1B = 1B

1B + 0B = 1B

1B + 1B = 10B

1B + 1B + 1B = 11B

Beispiel 1

Addition von zwei positiven mehrstelligen Zahlen

3D 0011B

2D 0010B

----------------

5D 0101B

Es erfolgt einmal ein Übertrag.

Beispiel 2

Addition mit negativer Zahl

3D 0011B

-2D 1110B

----------------

1D 0001B

Es werden nur vier Stellen berücksichtigt!

Beispiel 3

Addition von zwei positiven Zahlen

4D 0100B

4D 0100B

----------------

8D 1000B (ist aber laut Tabelle 1.1 der Wert -8)

Die Addition von 4D + 4D überschreitet den Wertebereich einer mit 4 Bit vorzeichenbehafteten Zahl (-8D bis 7D) und führt daher zu einem falschen Ergebnis.

Wie kommt man zu dem Bit-Muster für negative Zahlen? Eine positive Zahl wird in zwei Schritten in eine negative umgewandelt. Zuerst sind die Bits einer positiven Zahl zu invertieren und danach ist zu dieser Zahl 1 dazuzuzählen.

Beispiel 4

Umwandlung von 5D nach -5D

1. Schritt

5D = 0101B

nach Inversion der Bits 1010B

2. Schritt

1010B + 1B = 1011B

Mit der gleichen Methode kann man von einer negativen Zahl den entsprechenden positiven Zahlenwert ermitteln.

Beispiel 5

Umwandlung von -5D nach 5D

1. Schritt

-5D = 1011B nach Inversion der Bits 0100B

2. Schritt

0100B + 1B = 0101B

Beispiel 6

Multiplikation einer Binärzahl mit 2

3D * 2D = 6D

0011B * 0010B = 0110B

Eine Multiplikation mit 2 erfolgt im Binärsystem durch das Verschieben der Bits einer Zahl um eine Stelle nach links.

In der Programmiersprache C kann eine Linksverschiebung um eine Stelle wie folgt geschrieben werden:

i = 3 << 1;

Danach hat i den Wert 6;

1.3Oktalsystem

Das Oktalsystem wird in der Sprache C unterstützt. In diesem Zahlensystem gibt es 8 verschiedene Ziffern (0 bis 7), und die Stellen einer Zahl werden mit Potenzen der Basis 8 bewertet.

Die oktale Zahl 123 hat den Wert 1 * 8² + 2 * 8¹ +3 * 8⁰ = 1 * 64 + 2 * 8 +3 * 1 = 83D.

In der Programmiersprache C werden Zahlen mit führenden Nullen als Oktalzahlen interpretiert.

Beispiel

i = 0123;

ist gleichwertig zu:

i = 83;

1.4Hexadezimalsystem

Das Hexadezimalsystem arbeitet mit der Basis 16. Der Ziffernvorrat sind 0123456789ABCDEF. Dabei hat A den Wert 10D usw.

Tabelle 1.2: Werte von Ziffern im Hexadezimalsystem

Hexadezimale
Ziffer
Wert im 10 er System

0
0

1
1

2
2

3
3

4
4

5
5

6
6

7
7

8
8

9
9

A
10

B
11

C
12

D
13

E
14

F
15

Jede hexadezimale Ziffer hat einen Wert im Bereich von 0D bis 15D. Das entspricht einer Binärzahl mit 4 Bits. Das macht die Umrechnung zwischen Hex- und Binärsystem sehr einfach.

Um eine Hexadezimalzahl von einer Dezimalzahl sicher unterscheiden zu können, schreiben wir z. B. »123H« oder »FFFH« . Bei einer Eingabe im C-Compiler ist 0x vor die Zahl zu schreiben, z. B. »0x1FFF.«

Beispiel 1

Welchen Wert hat 2AH?

2 * 16 + 10 * 1 = 42D

Beispiel 2

Umwandlung von 2AH ins Binärsystem

2H entspricht 0010B

AH entspricht 1010B

Zusammengefügt, ergibt es die Binärzahl von 00101010B.

Beispiel 3

Umwandlung der Binärzahl 11000101B ins Hexadezimalsystem

1. Schritt ist die Einteilung der Binärzahl in Gruppen mit vier Stellen

(1100)(0101)

1100B entspricht CH

0101B entspricht 5H

Zusammengefügt, ergibt das das Ergebnis C5H.

Für den C-Compiler GCC, der im Atmel Studio eingesetzt ist, und CodeVisionAVR bewirkt i = 0b11000101; das Gleiche wie i = 0xC5;.

2Hardware

2.1Richtlinien zur Auswahl der Hardware

Beim Auswählen einer optimalen Hardware sind der finanzielle Rahmen und das Ziel der Anwendung zu berücksichtigen. Nachfolgend wird davon ausgegangen, dass ein Anfänger mit AVRs selbstständig kleine Projekte realisieren will. Die folgenden Vorschläge sind nach dem Investitionsaufwand geordnet. Die Einteilung nach Investitionskosten sollte nicht mit dem Nutzen gleichgesetzt werden.

2.2Hardware-Auswahl bei einer Investition von 100 Euro

2.2.1STK500

Dieses Board ist von Atmel. Auf der PC-Seite gibt es dazu eine gute Software-Unterstützung. Alle Funktionen des STK500 können mit dem Atmel Studio angesprochen werden. Auch in CodeVison werden die Funktionen des STK500 gut unterstützt.

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!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!