Microcontroller in C programmieren

Ähnliche Dokumente
Analog-Digital Umwandlung

Analog-Digital-Converter

1 Die CD-ROM zum Buch Inhalt der CD-ROM GPL (General Public License) Systemvoraussetzungen Updates und Support 13

FRANZIS PC & ELEKTRONIK

Tag 3 Timer, ADC und PWM

5.6 PWM (Pulse Width Modulation) 23

Beispiel. Echo-Anwendung. Beispiel Echo Anforderungen. Benutzer stellt Konfiguration der seriellen Schnittstelle am PC ein (z.b. über Hyperterminal)

Serielle Schnittstelle

V cc. 1 k. 7 mal 150 Ohm

Vorbereitung. Teil D Analog-Digital-Wandler 1

AVR UART. ELV Modul: ch=&marke=

D.1 Vorbereitung. Teil D Analog-Digital-Wandler 1

Ansteuerung eines LCD-Screens

Temperaturmodul. Software. Bedeutung der Leuchtdioden. Kanal-LEDs. System-LEDs. Start nach Reset

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

C++ mit dem Arduino (Uno und Mega2560)

ATmega8. Projekte mit AVR-Mikrocontroller. Ein Digitalvoltmeter Seite 1 von 6. Ein Datenlogger

Mikrocontrollerplatine vorbereiten

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil 8: gavrasmw und weitere Beispiele

WS 2018/19 Viel Erfolg!!

Serielle Schnittstelle, erstes Testprogramm (a)

Aufgabe A5: Anleitung. Einführung in die Programmierung des Sensor-/ Aktorknotens

ATXMega32a4-Controllerboard

Radar Evaluation Board - REB165 Installation / Getting Started

C.1 Serielle Schnittstelle, erstes Testprogramm (a)

ATmega169 Chip: Pin-Layout

Radar Evaluation Board - REB165 Installation / Getting Started

Inhaltsverzeichnis. CD-ROM zum Buch Inhalt der CD-ROM GPL (General Public License) Systemvoraussetzung 13

Temperaturmessung mit dem ATmega8

LED Skalenbeleuchtung mit einem Arduino

Autonome Mobile Systeme. Dr. Stefan Enderle

U5-2 Register beim AVR-µC

Chip veraltet, für neue Anwendungen nicht empfehlenswert!

Mini- Mikroprozessor-Experimentier-System. Version 1.0b vom :21. mit einem 8051-Mikrocontroller

Jan Monsch. Donnerstag, 2. Mai 13

C++ mit dem Arduino (Uno und Mega2560)

Nibobee on lines. Stiegler Philipp

Selbstbau-USB-Programmiergerät für AVR

Bootloader FastBoot von Peter Dannegger

Die Technik hinter IoT: Arduino, Raspberry Pi & Co.

Kurzanleitung LTT 186 bzw. LTT182 Stand-Alone-Betrieb. 1. Anschluss des LTT Rekorders an den Computer

analoge Ein- und Ausgänge

Beschaltung eines Mikrocontrollers. Jordi Blanch Sierra Steuerungsgruppe

Studiengang Maschinenbau, Schwerpunkt Mechatronik (früher: Automatisierungstechnik) Seite 1 von 8

AVR-Mikrocontroller in BASCOM programmieren

Serie 8: Microcontroller 17./

Nachtaktiver Blinker. Ralf Pongratz. 11. November 2012

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

Kurzanleitung: 1. Anschüsse. MWCLightRGB by VoBo & HaDi-RC HW-Version 1.80 SW-Version >1.28

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

SIOSLAB. Technische Daten:

ATXMega128/192/256a3- Controllerboard

Zeitrelais PL0045 mit optionaler PC-Anbindung

Arduino Kurs Bits und Bytes. Stephan Laage-Witt FES Lörrach

Mikrocontroller. Vortrag von Louis Liedtke. 8. Dezember Fakultät Elektrotechnik und Informatik. Bild 1: Atmel ATmega8

Praktikum DST (MRT Teil) 2. Termin

Inhaltsverzeichnis VII

ATXMega256a3-Controllerboard und 3,2" Touch-LCD-Farbdisplay mit High-Level-Grafikcontroller

Mikrocontrollertechnik. F5 Erstes Programm. AVR Studio 4

Johannes Kelper Universität Linz. Institut für Elektrische Messtechnik. Dokumentation. ATmeag8-USB Modul. Bernd R. Arminger ATmega8-USB Modul 1

UART-Kommunikation mit dem Atmel AVR

Die serielle Schnittstelle mit den Atmega32: USART

Anleitung A5. Einführung in die Programmierung des Sensor-/ Aktorknotens BTnode

Zur Simulation eines technischen Prozesses wird der ATmega8 folgendermaßen beschaltet.

Lotto. eine Projektarbeit in DVT. von Sven Schwab

Serielle Kommunikation - Kodierung

AVR-Programmier-Testboard V1.2.1

Arduino Digispark. Ausgabe Copyright by Joy-IT 1

WS 2017/18 Viel Erfolg!!

Universal Synchronous and Asynchronous Serial Receiver and Transmitter. Serielle Schnittstellen

Arbeitsblätter - ADC-Grundlagen -

+5V R13 2,46V IC3. Analog 2. I 2 C Bus und analoge Eingabe = Teil 2 Software (in) = by AS. playground.boxtec.ch/doku.

WS 2016/17 Viel Erfolg!!

Entfernungsmesser. für den Raspberry Pi. Tim Riddermann / Nils Wortmann

Die UART-Schnittstelle

Programmieren des ESP8266 mit OLED

Kurzanleitung: 1. Anschüsse. MWCLightRGB by VoBo & HaDi-RC

emc2-2 expandable modular configurable controller, 2.generation

Mikroprozessortechnik Grundlagen 1

Mikrocontroller vs. Mikroprozessor 1/3

- Der heisse Draht - Physical Computing. Workshop Oktober 2015 Olav Schettler

Klausur PHMJ02 SS2012. Mikrocontroller und Robotik. Mittwoch GUTEN ERFOLG!!!

Dieses Tutorial ist für absolute Einsteiger gedacht und zeigt die Installation der notwendigen Software und aller Einstellungen von Anfang an.

Arduino Kurs Timer und Interrupts. Stephan Laage-Witt FES Lörrach

A Channel-Charge-Integrator

Einführung Microcontroller

Einführung in die Welt der Microcontroller

Praktikum Analog- und Digitaltechnik. Versuch D3 Bluetooth-steuerung mit Arduino

Parallel-IO. Ports am ATmega128

Arduino und Amateurfunk (1)

SOLBoot: Firmware-Updateprogramm für SOLPLUS 25-55

Vorwort Lichteffekte mit Arduino_NEU.indd :00:47

C2000 Piccolo. LaunchPad Entwicklungskit. C2000 Piccolo. Schnellstart mit dem Texas Instruments. LaunchPad Entwicklungskit.

Microcontroller Selbststudium Semesterwoche 9

Der Magnetfeldsensor HMC5883L

Making the Internet of Things

4 Formelsammlung C/C++

Transkript:

65068-7 Handbuch 10.12.12 16:59 Seite 1 Das Franzis Lernpaket Das Franzis Lernpaket Microcontroller in C programmieren Experimentieren und anwenden Das Lernpaket eröffnet Ihnen Schritt für Schritt die Grundlagen der Mikrocontroller-Technik, des ATMEL-AVR-ATmega88-Controllers und seiner Programmierung. Für den Aufbau der Versuche erhalten Sie genaue Anweisungen, Zeichnungen, Datenblätter und Fotos. Zu jedem Versuch gibt es außerdem einen Programmcode auf CD, den Sie selbst auf der mitgelieferten Hardware testen und nachvollziehen können. Danach sind Sie in der Lage, eigene Programme in C zu schreiben sei es für die heimische Hausautomatisierung oder für den beruflichen Einsatz sowie einfache Hardwareschaltungen zu realisieren und diese Controller selbstständig zu programmieren. Metronom Thermoschalter Fahrradrücklicht-Flasher Thermometer LM335 Licht ein/aus bei Tastendruck Thermograph mit StampPlot Code-Schloss ATmega88-Speicheroszilloskop State machine (Automat) Kondensatormessgerät Alarmanlage mit Bewegungsmelder Steuern mit dem PC Uhr mit Weckfunktion Digitalvoltmeter mit Average-Digitalfilter Flackerlicht virtuelle Kerze Blinker mit einstellbarer Intervallzeit Entscheidungshilfe (Kopf oder Zahl) Diodentester Die Bauteile im Überblick Temperatursensor Ein leicht verständliches Handbuch Das beiliegende Handbuch führt Sie Schritt für Schritt ohne theoretischen Ballast direkt von den technischen Grundlagen zum fertigen Projekt. Der Spaß liegt im Machen und im Erleben! Jedes Experiment wird leicht verständlich und detailliert erklärt. Dazu gehören auch der eigenständige Aufbau einer Mikrocontroller-Schaltung und die Anbindung von Hardware an den Controller sowie die Programmierung mittels eines externen Programmiergeräts für eigene Anwendungen. Projekte, die wirklich funktionieren Dieses Lernpaket zeichnet sich durch hohe Qualität und Praxistauglichkeit aus. Die Experimente wurden tausendfach durchgespielt. Sie können also sicher sein, dass auch bei Ihnen zu Hause alles klappt. Hand drauf: Dieses Franzis Lernpaket hält, was es verspricht. Platine Piezo Draht Transistor Diode Widerstände LEDs Lichtsensor Das Experimentierboard, das mit einem ATmega88, einem FTDI FT232RL und diverser Peripherie ausgestattet ist, können Sie später auch in Ihrer eigenen Applikation verbauen. ISBN 978-3-645-65068-7 Microcontroller in C programmieren Die ATMEL-AVR-Mikrocontroller-Familie erfreut sich seit Jahren größter Beliebtheit nicht nur bei Entwicklungsprofis, sondern zunehmend auch bei Hobbyprogrammierern. Dieses Lernpaket macht Sie auf einfache und praktische Weise damit vertraut: Sie entdecken die spannende Welt der ATmega-Programmierung und setzen auf dieser Basis zahlreiche verblüffende Projekte um. Microcontroller in C programmieren Diese Projekte führen Sie durch:

Inhaltsverzeichnis 1 CD-ROM zum Lernpaket... 9 1.1 GPL (General Public License)... 9 1.2 Systemvoraussetzung... 9 1.3 Updates und Support... 10 2 Das Lernpaket... 11 2.1 Sicherheitshinweise... 11 2.2 Teileliste... 11 2.3 Das ATmega88-Mikrocontrollerboard... 12 3 Bauteile des Lernpakets... 15 3.1 Widerstände... 15 3.2 LDRs... 18 3.3 Kondensatoren... 18 3.4 Dioden... 19 3.5 Leuchtdioden... 20 3.6 Transistoren... 21 3.7 Piezo-Schallwandler (Buzzer)... 23 3.8 Schaltdraht... 23 4 Inbetriebnahme... 25 4.1 Installation der Treiber... 25 4.2 MProg für FT232RL... 26 4.3 Atmel Studio installieren... 30 4.4 Das Programmier-Tool... 36 4.5 Programmier-Tool in das Atmel Studio einbetten... 38 4.6 Terminal-Programm Hterm... 39 4.7 Funktionstest... 40 5 Mikrocontroller-Grundlagen und Anwendung... 43 5.1 Aufbau und Funktionsweise... 43 5.2 CPU... 44 5.3 Arbeits- und Programmspeicher... 44 5.4 Peripherie... 45 5

6 Übersicht über die Atmel-8-Bit-Mikrocontroller... 47 6.1 AT90Sxxx... 47 6.2 ATTiny... 47 6.3 ATmega... 47 6.4 XMEGA... 48 7 ATmega88 Grundbeschaltung für den Betrieb... 49 7.1 Speicher... 49 7.2 Die interessantesten Pins des ATmega88 auf einen Blick... 50 7.3 I/O-Ports... 52 7.4 ADC... 53 7.5 PWM... 53 7.6 UART... 53 7.7 IRQ... 53 7.8 Stromversorgung des Controllers... 54 7.9 Reset-Beschaltung... 55 7.10 Oszillator... 56 7.11 ISP-Anschluss zur Programmierung... 57 7.12 Ein günstiges Atmel-AVR-Programmiergerät... 58 7.13 Alternative Bootloader... 58 8 Grundlagen der Programmierung... 59 8.1 Bits und Bytes... 60 8.2 Grundsätzlicher Aufbau eines Programms... 60 8.3 Sequenzieller Programmablauf... 61 8.4 Interrupt-gesteuerter Programmablauf... 61 8.5 Der grobe Aufbau eines C-Programms... 62 9 Experimentieren und lernen... 63 9.1 Es blinkt optisches Metronom... 63 9.2 Bit-Manipulation... 76 9.3 Fahrradrücklicht»Flasher«... 78 9.4 Leistungs-»Flasher«... 82 9.5 Licht ein/aus bei Tastendruck... 84 9.6 Makros... 89 9.7 Code-Schloss... 91 9.8 State machine (Automat)... 96 9.9 Kondensatormessgerät... 103 9.10 Formatierungsfunktionen in der Praxis... 114 9.11 Steuern mit dem PC... 120 9.12 Digitalvoltmeter mit Average Digitalfilter... 127 9.13 Blinker mit einstellbarer Intervallzeit... 138 9.14 Diodentester... 139 6

9.15 Thermoschalter... 144 9.16 Thermometer LM335... 149 9.17 Thermograph mit StampPlot... 154 9.18 Das ATmega88-Speicheroszilloskop... 160 9.19 Alarmanlage... 165 9.20 Quarzuhr mit Weckfunktion... 169 9.21 PWM (Pulse Width Modulation)... 180 9.22 DAC mit PWM-Ports... 190 9.23 Flackerlicht virtuelle Kerze... 195 9.24 Entscheidungshilfe (Kopf oder Zahl)... 197 9.25 Externe Interrupts... 199 9.26 EEPROM schreiben/lesen... 204 9.27 Eigene Header-Datei und Funktionsbibliotheken erstellen... 207 9.28 LCD... 212 9.29 Polarisation von Displays... 213 9.30 Statische Ansteuerung, Multiplexbetrieb... 213 9.31 Blickwinkel 6 Uhr/12 Uhr... 213 9.32 Reflektiv, transflektiv, transmissiv... 213 9.33 Ansteuerung des Displays vom Displaycontroller aus... 215 9.34 Die Kontrasteinstellung des Displays... 216 9.35 Befehlssatz der HD44780/KS0066-Controller... 217 9.36 Zeichensatz... 218 9.37 Pin-Belegung gängiger LCDs... 219 9.38 So wird das Display vom Mikrocontroller angesteuert... 221 9.39 Initialisierung der Displays... 221 9.40 Anschluss des Displays am Mikrocontrollerboard... 223 10 FAQ... 231 11 Anhang... 233 11.1 Elektrische Einheiten... 233 11.2 Datentypen... 233 11.3 Operatoren... 234 11.4 ASCII-Tabelle... 235 12 Bezugsquellen... 240 7

1 CD-ROM zum Lernpaket Diesem Lernpaket liegt eine CD-ROM bei, die verschiedene Programme, Tools, Datenblätter und Beispiele enthält. Sie wird Ihnen das Arbeiten mit diesem Lehrgang erleichtern. Alle hier abgedruckten Beispiele sind auf der CD-ROM enthalten. 1.1 GPL (General Public License) Sie können Ihre eigenen Programme selbstverständlich mit anderen Anwendern über das Internet austauschen. Die Beispielprogramme stehen unter der Open-Source-Lizenz GPL (General Public License). Daher sind Sie berechtigt, die Programme unter den Bedingungen der GPL zu modifizieren, zu veröffentlichen und anderen Anwendern zur Verfügung zu stellen, sofern Sie Ihre Programme dann ebenfalls unter die GPL-Lizenz stellen. 1.2 Systemvoraussetzung Betriebssystem: Windows XP (x86) Service Pack 3 Windows Vista (x86) Service Pack 1, Service Pack 2 Windows XP (x64) Service Pack 2 Windows Vista (x64) Service Pack 1, Service Pack 2 Windows 7 (x86 und x64) Windows Server 2003 R2 (x86 und x64) Hardware: Computer mit mindestens 1,6 GHz oder schneller 1 GB RAM für x86 CPU 2 GB RAM für x64 CPU Mindestens 512 MB RAM 3 GB freier Festplattenspeicher 5.400-RPM-Festplatte DirectX-9-kompatible Grafikkarte und 1.024 x 768 oder höhere Bildschirmauflösung Internetanschluss 9

1.3 Updates und Support Das Atmel Atmel Studio (derzeit Version 6) wird ständig weiterentwickelt. Updates können Sie kostenlos von der Website des Herstellers laden (www.atmel.com es fallen nur Ihre üblichen Online-Kosten an). Das ist besonders bequem mit der in das Atmel Studio integrierten Autoupdate-Funktion möglich. 10

9.12 Digitalvoltmeter mit Average Digitalfilter Da wir jetzt in der Lage sind, Daten an den PC zu senden und zu empfangen, verwenden wir unser Mikrocontrollerboard gleich als Messgerät für elektrische Spannungen. Unser Controller enthält dazu einen Analog-digital-Wandler (Analog Digital Converter, ADC) mit einer Auflösung von 10 Bit. D. h., die Spannung wird 2 ^ 10 digitalisiert, was 1.024 Stufen (Steps) entspricht. Ohne Spannungsteiler an einem ADC- Eingang kann man Spannungen von 0 5 V bzw. 0 bis V CC direkt messen. Das entspricht einem digitalen Messwert von 0 1023 und einer Auflösung von 5 V / 1.023 = 0,00488 V oder 4,88 mv. Unser Controller besitzt acht analoge Eingänge (ADC0 ADC7), um elektrische Spannungen zu messen. Im Controller selbst ist nur ein Analog-digital-Wandler verbaut, der mit einem Multiplexer (umschaltbarer Verteiler) verbunden ist. Dazu müssen wir den Multiplexer in der Software immer erst auf den gewünschten Pin (ADC- Eingang) am Controller umschalten, bevor wir eine Messung durchführen können. Die Auflösung kann man mit dieser einfachen Formel leicht selbst ausrechnen: U step = U ref / Auflösung U step = 5 V / 1.023 U step = 0,00488V Den digitalen Wert kann man folgendermaßen berechnen: Anzeigewert (Raw) = 1.023 x anliegende Spannung (ADC) / U ref Die Genauigkeit schwankt zwischen +/-2 Messschritten (Steps). Bei 5 V Referenzspannung liegt die Genauigkeit also bei +/-0,0097 V. Man kann somit sagen, dass der ADC bei 5 V Referenzspannung eine angelegte Spannung auf zwei Kommastellen genau misst. Voraussetzung ist natürlich eine stabile Referenzspannung. Als Referenzspannung kann man jede Spannung zischen 2 V und 5 V am AVCC-Eingang verwenden. Bei unserem Experimentier-Board verwenden wir durch die bereits auf dem Board vorhandene Schaltung die Betriebsspannung des USB-Anschlusses, die für experimentelle Zwecke ausreichend genau ist. Technische Daten des ATmega88 ADC: 10 Bit Auflösung 0,5 LSB Linearitätsfehler ± 2 LSB Genauigkeit 13 µs bis 260 µs Wandlungszeit 0 V V CC ADC-Eingangsspannung Auswählbare 1,1 V ADC interne Spannungsreferenz Referenzspannung mindestens: 2 V Eingangswiderstand des Referenzspannungs-Pins (AREF): 32 kω Eingangswiderstand am zu messenden Pin (ADC): min. 55 MΩ, typisch 100 MΩ 127

Abb. 9.43: Auszug aus dem Datenblatt zu den Electrical characteristics des ADC. Deutlich sind die Fehler und die Genauigkeit des ADC zu sehen. Man muss aber immer im Hinterkopf behalten, dass der Hersteller diese Angaben gern etwas beschönigt und die realen Daten geringfügig schlechter ausfallen können. 128

Abb. 9.44: Verwendet man nicht V CC (Versorgungsspannung des μc), steht eine interne Referenzdiode zur Verfügung. Man sieht deutlich das Verhalten der Referenzspannung im Zusammenhang von V CC und Umgebungstemperatur. Die Referenzdiode ist hier nicht unbedingt eine Präzisionsdiode, aber für die meisten Anwendungen völlig ausreichend. Da es sich um eine 1,1-V-Referenz handelt, können am ADC ohne zusätzliche Beschaltung auch nur maximal 1,1 V gemessen werden. Spannungen zwischen 0 V und 1,1 V werden mit 0 1023 dargestellt. Abb. 9.45: Hier sehen wir den internen Aufbau des ADC. Oben links befindet sich der Multiplexer, rechts daneben das Control- und Statusregister zur Konfiguration des ADC. Oben rechts ist das Datenregister. In ihm wird der Messwert abgelegt. Links in der Mitte ist die auswählbare Spannungsreferenz zu sehen. Man kann zwischen AVCC, interner Referenz mit 1,1 V und externer Referenz auswählen. Unten links sehen wir die physikalischen Eingänge des ADC, die direkt auf den Multiplexer gehen. 129

Hinweis Im Atmel-Datenblatt zum Controller finden Sie noch mehr Informationen zum ADC. Ein Blick lohnt sich immer. Das folgende Beispiel misst den Analogwert am Analogeingang 7 (ADC7) und gibt am Terminal den digitalen Wert (RAW-Wert 0 1023) und die Spannung aus. Die Spannung wird berechnet und mit den bereits bekannten Formatierungsfunktionen am Terminal ausgegeben. Das Terminal müssen Sie wie folgt einstellen, um eine übersichtliche Ausgabe zu erhalten: Abb. 9.46: ASCII / Newline at CR-LF / Häkchen von Show newline charakter entfernen; diese Einstellung empfiehlt sich auch für die anderen Beispiele, da so die Ausgabe deutlich übersichtlicher ist. Beispiel: Digitalvoltmeter #define F_CPU 8000000 // Baudrate #define BAUD 19200UL // Baudratenberechnung #define UBRR_VAL ((F_CPU+BAUD*8) / (BAUD*16)-1) #include <avr/io.h> #include <avr/delay.h> // UART-Init ATmega88 void uart_init(void) // Baudrate einstellen UBRR0H = (unsigned char)(ubrr_val>>8); UBRR0L = (unsigned char)ubrr_val; // Receiver und Transmitter einschalten UCSR0B = (1<<RXEN0) (1<<TXEN0); // Frame Format: Asynchron 8N1 UCSR0C = (1<<UCSZ01) (1<<UCSZ00); // Charakter schreiben void uart_putchar(unsigned char c) // Warten, bis Sendepuffer leer ist while (!(UCSR0A & (1<<UDRE0))); 130

// Daten in den Puffer schreiben und senden UDR0 = c; // String senden void uart_putstr(char *s) while (*s) // solange *s!= '\0' also ungleich dem "String-Endezeichen(Terminator)" uart_putchar(*s); s++; // ADC initialisieren void ADC_Init(void) unsigned int result; //ADMUX = (0<<REFS1) (0<<REFS0); ADMUX = (0<<REFS1) (1<<REFS0); //ADMUX = (1<<REFS1) (1<<REFS0); // AREF, internal Vref off // AVCC als Referenz benutzen // interne Referenzspannung nutzen // Bit ADFR ("free running") in ADCSRA steht beim Einschalten // schon auf 0, also single conversion //ADCSRA = (0<<ADPS2) (0<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 2 //ADCSRA = (0<<ADPS2) (1<<ADPS1) (0<<ADPS0); // Frequenzvorteiler 4 ADCSRA = (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 8 //ADCSRA = (1<<ADPS2) (0<<ADPS1) (0<<ADPS0); // Frequenzvorteiler 16 //ADCSRA = (1<<ADPS2) (0<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 32 //ADCSRA = (1<<ADPS2) (1<<ADPS1) (0<<ADPS0); // Frequenzvorteiler 64 //ADCSRA = (1<<ADPS2) (1<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 128 ADCSRA = (1<<ADEN); // ADC aktivieren // nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest // also einen Wert und verwirft diesen, um den ADC "warmlaufen" zu lassen ADCSRA = (1<<ADSC); while (ADCSRA & (1<<ADSC)); // Single ADC-Wandlung Start // auf Abschluss der Konvertierung warten // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung nicht übernommen. result = ADCW; // ADC-Einzelmessung unsigned int ADC_Read(unsigned char channel ) // Kanal wählen, ohne andere Bits zu beeinflussen 131

ADMUX = (ADMUX & ~(0x1F)) (channel & 0x1F); ADCSRA = (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC)) // auf Abschluss der Konvertierung warten return ADCW; // ADC auslesen und zurückgeben // ADC-Mehrfachmessung mit Mittelwertbbildung unsigned int ADC_Read_Avg(unsigned char channel, unsigned char average) unsigned long result = 0; for (unsigned char i = 0; i < average; ++i) result += ADC_Read(channel); _delay_us(250); return (unsigned int)(result / average); void Wait(unsigned int dly_ms) while(dly_ms) dly_ms--; _delay_ms(1); // Hauptprogramm int main(void) unsigned char str[10]; unsigned int raw; float volt; const float volt_convert = 5.0/1023.0; // ADC initialisieren ADC_Init(); // Endlosschleife while(1) // Mittelwertmessung raw = ADC_Read_Avg(7,64); // Spannungsumrechnung volt = raw * volt_convert; // ADC-Wert ausgeben uart_putstr("adc7 RAW: "); 132

utoa(raw,str,10); uart_putstr(str); uart_putstr("\r\n"); // Spannungswert ausgeben uart_putstr(dtostrf(volt, 1, 3, str)); uart_putstr(" V"); uart_putstr("\r\n"); Wait(1000); // Sekunde warten Abb. 9.47: So sollte die Ausgabe des Beispiels bei Ihnen aussehen. Zuerst wird der RAW-Wert angezeigt, danach folgt die Spannungsausgabe. In der Initialisierungsfunktion wählen wir zuerst die Referenzspannung aus, die wir verwenden möchten, in unserem Beispiel AVCC, also die Versorgungsspannung (5 V). Dazu setzen wir im ADMUX-Register die beiden Bits REFS1 und REFS0 auf 1. Beim Einschalten des Controllers steht im Register ADCSRA (ADC- Statusregister) das ADFR(Free Running Mode = Messung erfolgt dauerhaft)-bit bereits auf 0. Wir müssen es nicht extra auf Null setzen, wenn wir eine Einzelmessung (single conversion) machen möchten. Dabei wird immer eine Messung gestartet, wenn wir das möchten. ADMUX = (0<<REFS1) (1<<REFS0); // AVCC als Referenz benutzen Abb. 9.48: Das ADMUX-Register es ist für die Auswahl des Kanals und der Referenzspannung zuständig und dafür, ob das Ergebnis rechts- oder linksbündig dargestellt werden soll. 133

Bit 7:6 REFS1:0: Reference selection bits Bit 5 ADLAR: ADC left adjust result Bits 3:0 MUX3:0: Analog channel selection bits Abb. 9.49: Tabelle zur Auswahl der Referenzspannung Nun müssen wir den Vorteiler konfigurieren. Er gibt an, wie schnell der Multiplexer umgeschaltet wird. Hier gilt: je langsamer, desto genauer die Messung. Wir verwenden Prescaler 8, also schon recht flott. Sie können gern mit den restlich aufgezeigten Möglichkeiten experimentieren und beobachten, wie sich der Messwert verhält. ADCSRA = (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 8 Abb. 9.50: Tabelle für den Vorteiler (Prescaler) 134

Abb. 9.51: Multiplexer-Tabelle zur Auswahl des Messkanals und der internen Referenz Nun müssen wir den ADC noch einschalten. Das geschieht im ADC-Statusregister mit dem Bit ADEN (Analog Enalbe). ADCSRA = (1<<ADEN); // ADC aktivieren Abb. 9.52: ADC Control und Status-Register ADCSRA; hier müssen wir das ADEN-Bit auf 1 setzen. Bit 7 ADEN: ADC enable Bit 6 ADSC: ADC start conversion Bit 5 ADATE: ADC auto trigger enable Bit 4 ADIF: ADC interrupt flag Bit 3 ADIE: ADC interrupt enable Bits 2:0 ADPS2:0: ADC prescaler select bits Nun starten wir die erste Messung, indem wir im Register ADCSRA das Bit ADCSC (ADC Single Conversion) auf 1 setzen. Danach warten wir, bis die Messung abgeschlossen ist und das richtige Ergebnis 135

abgeholt werden kann. Dazu kontrollieren wir im ADC-Statusregister ADCSRA das Bit ADCSC. Es ist so lange 1, bis die Messung beendet ist. ADCSRA = (1<<ADSC); while (ADCSRA & (1<<ADSC)); // Single ADC-Wandlung Start // auf Abschluss der Konvertierung warten Der Messwert ADCW muss einmal gelesen werden, sonst wird das Ergebnis der nächsten Wandlung nicht übernommen. Dazu holen wir das Ergebnis einmal ab, denn wir können es mit ADCW komplett lesen. Das Ergebnis steht eigentlich in zwei getrennten Registern mit den Namen ADCH und ADCL. Sie können versuchsweise auch die Daten getrennt abholen und zusammensetzen. Dazu müssen Sie beachten, dass zuerst das ADCL-Register und dann erst das ADCH-Register gelesen wird. Das Ergebnis besteht als Highund Low-Byte. Das High-Byte multiplizieren wir mit 256 (ADCH << 8 ist eine Multiplikation mit 256) und addieren das Low-Byte hinzu. // Auf einmal abholen return ADCW; // Einzeln abholen und zusammensetzen return ADCL + (ADCH<<8); Abb. 9.53: Die beiden Register, die den Messwert enthalten Hinweis Nach der Aktivierung des ADC wird ein Dummy-Readout empfohlen. Man liest also einen Wert und verwirft ihn, um den ADC»warmlaufen«zu lassen. Die erste Messung des ADC ist in der Regel nicht zu gebrauchen und sollte nicht ins Messergebnis mit einfließen. In der Praxis haben sich als Sicherheit drei Messungen zum Verwerfen bewährt, bevor die eigentliche Messung beginnt. 136

Wir haben zum komfortablen Lesen des Werts im Beispiel zwei Funktionen: ADC_Read und ADC_Read_ Avg. Die erste Funktion liest den eigentlichen Wert aus dem Register. Dabei setzt sie zuerst den Multiplexer mit ADMUX = (ADMUX & ~(0x1F)) (channel & 0x1F), ohne dabei die anderen Bits im Register zu beeinflussen, und startet danach die Messung. Er wartet dann, wie bereits bekannt, auf die abgeschlossene Messung, liest den Wert aus und gibt ihn mit return zurück. unsigned int ADC_Read(unsigned char channel ) // Kanal wählen, ohne andere Bits zu beeinflussen ADMUX = (ADMUX & ~(0x1F)) (channel & 0x1F); ADCSRA = (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC)) // auf Abschluss der Konvertierung warten return ADCW; // ADC auslesen und zurückgeben Die Funktion ADC_Read_Avg ist ein digitaler Filter zur Mittelwertberechnung. Da der ADC nicht sonderlich hochwertig und genau ist, kann man mittels Mehrfachmessung (arithmetischer Mittelwert) die Genauigkeit steigern. Wir müssen den gewünschten Pin (Channel) angeben und festlegen, wie oft die Messung stattfinden soll. Je mehr Messungen wir machen, desto stabiler wird unser Messwert. Jedoch benötigt dies auch wesentlich mehr Zeit und Speicher (RAM). Hier ist also je nach Aufgabe abzuwägen, was wichtiger ist. Eine weitere Neuerung in diesem Beispiel ist, dass wir in der For-Schleife die Zählervariable deklarieren. for (unsigned char i = 0; i < average; ++i) ist eine gebräuchliche Kurzschreibweise und macht den Programm-Code übersichtlicher. Die Messungen werden zunächst mit result += ADC_Read (channel) zusammengezählt (gleichzustellen mit result = result + ADC_Read(channel)). Auch hier kann man sich mit dieser Schreibweise Zeit und Tipparbeit sparen. Die Pause nach jeder Messung kann auch entfernt werden, da wir ohnehin warten, bis eine Messung beendet wurde. Sie hat nur bei sehr verrauschten Signalen einen Vorteil, weil so in größeren Intervallen der Mittelwert gebildet wird. Hier können Sie also noch experimentieren. Zuletzt wird das Ergebnis von result durch die Anzahl der Messungen dividiert und mit unsigned int»gecastet«, da wir der Funktion ein unsigned int zurückgeben müssen. unsigned int ADC_Read_Avg(unsigned char channel, unsigned char average) unsigned long result = 0; for (unsigned char i = 0; i < average; ++i) result += ADC_Read(channel); _delay_us(250); return (unsigned int)(result / average); Der Aufruf dieser Funktion wäre für 64 Messungen an Kanal 7 raw = ADC_Read_Avg(7,64);. 137

Tipp Weitere allgemeine Informationen über Analog-digital-Konverter und Spannungsteiler zur Messwerterweiterung finden Sie unter http://de.wikipedia.org/wiki/analog-digital-umsetzer und http://de. wikipedia.org/wiki/spannungsteiler 9.13 Blinker mit einstellbarer Intervallzeit Da wir nun in der Lage sind, analoge Werte einzulesen, können wir einen Blinker mit variabler Intervallzeit programmieren. Das kleine Programm liest den Wert von ADC7 aus. Ihn verwenden wir als Pausezeit zwischen den Zustandswechseln der LED (ein/aus). Beispiel: Intervallblinker #define F_CPU 8000000 #include <avr/io.h> #include <avr/delay.h> // ADC initialisieren void ADC_Init(void) unsigned int result; ADMUX = (0<<REFS1) (1<<REFS0); // AVCC als Referenz benutzen ADCSRA = (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // Frequenzvorteiler 8 ADCSRA = (1<<ADEN); // ADC aktivieren ADCSRA = (1<<ADSC); while (ADCSRA & (1<<ADSC)); // Single ADC-Wandlung start // auf Abschluss der Konvertierung warten // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung nicht übernommen. result = ADCW; // ADC-Einzelmessung unsigned int ADC_Read(unsigned char channel ) // Kanal wählen, ohne andere Bits zu beeinflussen ADMUX = (ADMUX & ~(0x1F)) (channel & 0x1F); ADCSRA = (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC)) // auf Abschluss der Konvertierung warten //return ADCW; // ADC auslesen und zurückgeben return ADCL + (ADCH<<8); void Wait(unsigned int dly_ms) 138

Weitere Informationen zur Sprache C finden Sie im Internet unter folgenden Links: http://www.galileocomputing.de/openbook/c_von_a_bis_z/ http://de.wikibooks.org/wiki/c-programmierung http://suparum.rz.uni-mannheim.de/manuals/c/cde.htm http://www.roboternetz.de/wissen/index.php/c-tutorial http://www.its.strath.ac.uk/courses/c/ 12 Bezugsquellen Conrad Electronic SE Klaus-Conrad-Straße 1 92240 Hirschau www.conrad.de Electronic Assembly GmbH Zeppelinstraße 19 82205 Gilching bei München http://www.lcd-module.de Sommer-Robotics Ulli Sommer Bahnhofstraße 8 92726 Waidhaus www.sommer-robotics.de 240

65068-7 Handbuch 10.12.12 16:59 Seite 1 Das Franzis Lernpaket Das Franzis Lernpaket Microcontroller in C programmieren Experimentieren und anwenden Das Lernpaket eröffnet Ihnen Schritt für Schritt die Grundlagen der Mikrocontroller-Technik, des ATMEL-AVR-ATmega88-Controllers und seiner Programmierung. Für den Aufbau der Versuche erhalten Sie genaue Anweisungen, Zeichnungen, Datenblätter und Fotos. Zu jedem Versuch gibt es außerdem einen Programmcode auf CD, den Sie selbst auf der mitgelieferten Hardware testen und nachvollziehen können. Danach sind Sie in der Lage, eigene Programme in C zu schreiben sei es für die heimische Hausautomatisierung oder für den beruflichen Einsatz sowie einfache Hardwareschaltungen zu realisieren und diese Controller selbstständig zu programmieren. Metronom Thermoschalter Fahrradrücklicht-Flasher Thermometer LM335 Licht ein/aus bei Tastendruck Thermograph mit StampPlot Code-Schloss ATmega88-Speicheroszilloskop State machine (Automat) Kondensatormessgerät Alarmanlage mit Bewegungsmelder Steuern mit dem PC Uhr mit Weckfunktion Digitalvoltmeter mit Average-Digitalfilter Flackerlicht virtuelle Kerze Blinker mit einstellbarer Intervallzeit Entscheidungshilfe (Kopf oder Zahl) Diodentester Die Bauteile im Überblick Temperatursensor Ein leicht verständliches Handbuch Das beiliegende Handbuch führt Sie Schritt für Schritt ohne theoretischen Ballast direkt von den technischen Grundlagen zum fertigen Projekt. Der Spaß liegt im Machen und im Erleben! Jedes Experiment wird leicht verständlich und detailliert erklärt. Dazu gehören auch der eigenständige Aufbau einer Mikrocontroller-Schaltung und die Anbindung von Hardware an den Controller sowie die Programmierung mittels eines externen Programmiergeräts für eigene Anwendungen. Projekte, die wirklich funktionieren Dieses Lernpaket zeichnet sich durch hohe Qualität und Praxistauglichkeit aus. Die Experimente wurden tausendfach durchgespielt. Sie können also sicher sein, dass auch bei Ihnen zu Hause alles klappt. Hand drauf: Dieses Franzis Lernpaket hält, was es verspricht. Platine Piezo Draht Transistor Diode Widerstände LEDs Lichtsensor Das Experimentierboard, das mit einem ATmega88, einem FTDI FT232RL und diverser Peripherie ausgestattet ist, können Sie später auch in Ihrer eigenen Applikation verbauen. ISBN 978-3-645-65068-7 Microcontroller in C programmieren Die ATMEL-AVR-Mikrocontroller-Familie erfreut sich seit Jahren größter Beliebtheit nicht nur bei Entwicklungsprofis, sondern zunehmend auch bei Hobbyprogrammierern. Dieses Lernpaket macht Sie auf einfache und praktische Weise damit vertraut: Sie entdecken die spannende Welt der ATmega-Programmierung und setzen auf dieser Basis zahlreiche verblüffende Projekte um. Microcontroller in C programmieren Diese Projekte führen Sie durch: