Inhalt Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Die Pins alphabetisch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Kapitel 1 • Programmierung des ATmega8 und des ATmega328 . . . . . . . . . . . . . . 15 1.1 Was Sie auf den nächsten Seiten erwartet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.2 Was ist eine Micro Controller Unit (MCU)? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.3 Woraus besteht eine einfache CPU? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.3.1 Das Status-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.4 Was braucht man um die CPU (nicht MCU) herum? . . . . . . . . . . . . . . . . . . . . . . . 26 1.4.1 Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 1.4.2 Wie sieht die CPU den Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 1.5 Wie bekommt man ein Programm in die MCU? . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.5.1 Bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.5.2 SPI (Serial Programming Interface) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 1.5.3 Parallele und HV-Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 1.6 Das erste Programm zum Laufen bringen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 1.6.1 Das erste Assembler-Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 1.6.2 Das Gleiche noch einmal in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.6.3 Eine kleine Vereinfachung der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 1.6.4 Arbeiten mit einem Mini-Entwicklungsboard . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Kapitel 2 • Die Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Kapitel 3 • Der Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Kapitel 4 • Programmieren in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.1 Editor, Compiler, Linker, Loader, Debugger und IDE . . . . . . . . . . . . . . . . . . . . . . 53 4.2 Das Semikolon in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3 Die Programmiersprache C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.3.1 Die mitgelieferten Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.3.2 Defines, Makros und Include-Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.3.3 Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.3.4 Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.3.5 Unterprogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.3.6 Arrays, Strings und Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 ●5 AVR Programmierung DE 160929.indd 5 25-10-16 11:45 AVR-Programmierung für Quereinsteiger 4.3.7 Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.3.8 Zusammengesetzte Typen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.3.9 Anweisungen in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.3.10 Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.3.11 Goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.3.12 return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.13 continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.14 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.4 Bit-Manipulationen in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.5 Einführung in die AVR-libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.6 Das 'Betriebssystem' des kleinen Mannes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Kapitel 5 • Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.1 Nebeneffekte und Nested Interrupting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.2 Interrupt-Vektor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 5.3 Interrupts in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.4 Externe Interrupts INT0 und INT1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.4.1 ATmega8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 5.4.2 ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 5.5 PCINT (Pin Change INTerrupt) nur beim ATmega328 . . . . . . . . . . . . . . . . . . . . . 115 5.5.1 Die Register für PCINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Kapitel 6 • Schlafmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.1 Schlafmodi des ATmega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.1.1 Sleep-Mode im ATmega8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 6.1.2 Sleep-Mode im ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Kapitel 7 • Paralleler Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 7.1 ATmega, Register für die Nutzung der Parallelports . . . . . . . . . . . . . . . . . . . . . . 122 7.1.1 Parallelports im ATmega8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 7.1.2 Parallelports im ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Kapitel 8 • Timer und Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 8.1 Waveform-Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 8.1.1 Rechteckgenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 ●6 AVR Programmierung DE 160929.indd 6 25-10-16 11:45 Inhalt 8.1.2 PWM und schneller PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 8.1.3 Phasenkorrekte PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 8.1.4 Input Capture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 8.1.5 Vergleichsregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 8.1.6 Race-Conditions bei Änderung der Werte im Vergleichsregister . . . . . . . . . . . . 131 8.1.7 Forced Output Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8.2 Timer/Counter Interrupts im ATmega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8.2.1 ATmega8, Timer/Counter-Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8.2.2 ATmega328, Timer/Counter-Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8.3 Timer/Counter 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 8.3.1 ATmega8: Timer/Counter 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 8.3.2 ATmega328: Timer/Counter 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 8.4 Timer/Counter 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 8.4.1 ATmega8: Die Register des Timers/Counters 2 . . . . . . . . . . . . . . . . . . . . . . . 137 8.4.2 ATmega328: Die Register des Timers/Counters 2 . . . . . . . . . . . . . . . . . . . . . . 140 8.5 Timer/Counter 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 8.5.1 ATmega: Die Register des Timers/Counters 1 . . . . . . . . . . . . . . . . . . . . . . . . 144 8.5.2 ATmega8: Die Register des Timers/Counters 1 . . . . . . . . . . . . . . . . . . . . . . . 147 8.5.3 ATmega328: Die Register des Timers/Counters 1 . . . . . . . . . . . . . . . . . . . . . . 148 Kapitel 9 • Serielle Datenübertragungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 9.1 SPI (Serial Peripheral Interface) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 9.1.1 ATmega: Die Register für SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 9.2 TWI (Two Wire Interface) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 9.2.1 Takt- und Daten-Leitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 9.2.2 Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 9.2.3 Sleep Mode des TWI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 9.2.4 Allgemeine Erklärung der TWI-Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 9.2.5 TWI-Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 9.2.6 ATmega: Die Register für TWI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 9.2.7 ATmega328: Ein Register mehr für TWI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 9.3 USART Universal Syn- & Asynchronous Receiver Transmitter . . . . . . . . . . . . . . . 166 ●7 AVR Programmierung DE 160929.indd 7 25-10-16 11:45 AVR-Programmierung für Quereinsteiger 9.3.1 USART-Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 9.3.2 MPCM (Multi Processor Communication Modus) . . . . . . . . . . . . . . . . . . . . . . . 171 9.3.3 ATmega8: Die Register des USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 9.3.4 ATmega328: Die Register des USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 9.4 ATmega328: SPI über den USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 9.4.1 Register für SPI über den USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Kapitel 10 • Analog-Digital-Konverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 10.1 Noise Canceller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 10.2 ATmega328: Der Temperatursensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 10.3 ATmega: Die Register des ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 10.4 Atmega328: ADC-Register, die nur der ATmega328 hat . . . . . . . . . . . . . . . . . . 187 Kapitel 11 • Analog Comparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 11.1 ATmega: Die Register für den 'Analog Comparator' . . . . . . . . . . . . . . . . . . . . . 190 11.2 ATmega8: Die Register für den 'Analog Comparator' . . . . . . . . . . . . . . . . . . . . 191 11.3 ATmega328: Die Register für den 'Analog Comparator' . . . . . . . . . . . . . . . . . . 192 Kapitel 12 • Das gibt es nur im ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 12.1 Clock Prescaler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 12.2 General Purpose I/O-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 12.3 PRR (Power Reduction Register) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 12.4 debugWIRE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Kapitel 13 • Lock-Bits und Fuses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 13.1 ATmega: Lock-Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 13.2 Fuses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 13.2.1 ATmega8: Fuses Low Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 13.2.2 ATmega328: Fuses Low Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 13.2.3 ATmega: Fuses High Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 13.2.4 ATmega8: Fuses High Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 13.2.5 ATmega328: Fuses High Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 13.2.6 ATmega328: Extended Fuse Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Kapitel 14 • Programmierung des EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 14.1 ATmega: Die Register, um das EEPROM zu programmieren . . . . . . . . . . . . . . . 202 ●8 AVR Programmierung DE 160929.indd 8 25-10-16 11:45 Inhalt 14.1.1 ATmega8: Das EEPROM Controller Register . . . . . . . . . . . . . . . . . . . . . . . . . 203 14.1.2 ATmega328: Das EEPROM-Controller-Register . . . . . . . . . . . . . . . . . . . . . . . 204 14.2 EEPROM unter C programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Kapitel 15 • Watchdog-Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 15.1 Watchdog Timer im ATmega8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 15.2 Watchdog Timer im ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Kapitel 16 • Taktversorgung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Kapitel 17 • Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Kapitel 18 • Simulatoren und (In Circuit) Debugging . . . . . . . . . . . . . . . . . . . . . . 214 18.1 Ein kleines Hardware-Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 18.2 Hterm.exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 18.3 Der Simulator des Atmel Studios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 18.4 Zusammenfassung: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Kapitel 19 • Hoffentlich hilfreiche Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 Kapitel 20 • Glossar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Kapitel 21 • Register alphabetisch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Kapitel 22 • Alle Register-Bits alphabetisch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Kapitel 23 • Fuses und Lock-Bits alphabetisch . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 ●9 AVR Programmierung DE 160929.indd 9 25-10-16 11:45