ISBN 978-3-89576-335-9
Elektor-Verlag GmbH 52072 Aachen www.elektor.de
Durch die Lektüre des Buches erhalten Sie ein fundiertes Wissen über die genannten 8-Bit-Mikrocontroller, über ihre Architektur, ihre Pin-Belegungen und über ihre Programmierung.
8-Bit-Mikrocontroller PIC und AVR verstehen
●
Miroslav Cina ist in der ehemaligen Tschechoslowakei geboren und hat seinen Hochschulabschluss an der Technischen Universität in Bratislava gemacht. Er lebt in der Pfalz und arbeitet seit 15 Jahren als Softwarearchitekt. Seit Ewigkeiten entwirft er verschiedenste (meistens) digitale Schaltungen. Viele davon sind inzwischen in Zeitschriften veröffentlicht worden.
In diesem Buch werden wir uns ausschließlich mit 8-BitMikrocontrollern beschäftigen, und zwar mit Mikrocontrollern der 8-Bit-PIC- und der 8-Bit-AVR-Mikrocontroller-Linien. Bei der PIC-Familie handelt es sich dabei um PIC10, PIC12, PIC16 und PIC18; bei der AVR-Familie um ATtiny, ATmega und ATxmega. Die vorgestellten 8-Bit-Chips sind für sehr viele Anwendungen vollkommen ausreichend und preislich auch attraktiv.
8-Bit-Mikrocontroller
Miroslav Cina
PIC und AVR verstehen
Miroslav Cina
8-Bit-Mikrocontroller
Weil wir uns in diesem Buch mit den Grundlagen der Architektur der PICs und AVRs vertraut machen möchten, werden wir auch für alle PIC– und AVR-Anwendungen Assembler einsetzen, denn die Assembler-Sprache erlaubt es, die Technik im Detail kennenzulernen. Wenn man wirklich wissen möchte, was sich im Mikrocontroller abspielt, greift man zu Assembler. Damit hat man die beste Gelegenheit, sehr nah an den Kern zu kommen. Und wenn man schon einen Mikrocontroller-Typ kennengelernt und verstanden hat, ist es bei dem nächsten deutlich einfacher, auch wenn er von einem anderen Hersteller kommt. Bei anderen Programmiersprachen bleibt die Technik immer ziemlich tief versteckt. Die Assembler-Beispiele sind so einfach gestaltet, dass sie jeder mit den im Buch aufgezeigten Programmiertechniken erstellen kann. Weil es sich um einfache Beispiele handelt, werden wir sie alle auf einer universellen Lochrasterplatine realisieren. Manche sind auch auf einem Experimentier-Breadboard umsetzbar.
LEARN DESIGN SHARE
Miroslav Cina 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 ● ● 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 ● SHAR GN ● 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 ● 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 ● SHAR
8-Bit-Mikrocontroller PIC und AVR verstehen
â—? Miroslav Cina
LEARN DESIGN SHARE
8-bit Microcontroller DE 180912.indd 3
02-11-18 11:17
●
© 2018: Elektor Verlag GmbH, Aachen.
●
Alle Rechte vorbehalten.
1. Auflage 2018
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. Die in diesem Buch erwähnten Soft- und Hardwarebezeichnungen können auch dann eingetragene Warenzeichen sein, wenn darauf nicht besonders hingewiesen wird. Sie gehören dem jeweiligen Warenzeicheninhaber und unterliegen gesetzlichen Bestimmungen. 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. Umschlaggestaltung: Elektor, Aachen Satz und Aufmachung: D-Vision, Julian van den Berg | Oss (NL) Druck: WILCO, Amersfoort, Niederlande Printed in the Netherlands
●
ISBN 978-3-89576-335-9
Elektor-Verlag GmbH, Aachen www.elektor.de
Elektor ist Teil der Unternehmensgruppe Elektor International Media (EIM), der weltweit wichtigsten Quelle für technische Informationen und Elektronik-Produkte für Ingenieure und Elektronik-Entwickler und für Firmen, die diese Fachleute beschäftigen. Das internationale Team von Elektor entwickelt Tag für Tag hochwertige Inhalte für Entwickler und DIY-Elektroniker, die über verschiedene Medien (Magazine, Videos, digitale Medien sowie Social Media) in zahlreichen Sprachen verbreitet werden. www.elektor.de
LEARN DESIGN SHARE
8-bit Microcontroller DE 180912.indd 4
02-11-18 11:17
Inhalt Kapitel 1 • Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1 Die ewigen Rivalen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.1 Microchip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.1.2 Atmel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2 Die Fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3 Familienklans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.3.1 PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.3.2 AVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4 Assembler und das Jahr 2018 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Kapitel 2 • PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1 Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.1 Familiensicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.2 Architektursicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2 HEF & EERAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.2.1 HEF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.2.2 EERAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.3 PIC – die Linien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3.1 Baseline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.3.1.1 PIC10F200 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.1.2 PIC16F570 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.1.3 Ach, die Seiten und Banken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3.1.4 Hallo Welt 1 und 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.3.2 Mid-Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.3.2.1 Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.3.2.2 PIC12F675 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.3.3. Enhanced Mid-Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.3.3.1 MSSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.3.3.2 PIC16F1829 & die Familie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 2.3.4 PIC18F-Linie – PIC18F14K50 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.4 PICs programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 2.4.1 PICKit2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
●5
8-bit Microcontroller DE 180912.indd 5
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen 2.4.2 PICKit3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 2.4.3 PICKit4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 2.4.4 Die notwendigen Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.4.4.1 Das Original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.4.4.2 Einfache 8-Pin-Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.4.4.3 Universelle Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Kapitel 3 • PIC – Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.1. Ausgewählte Assembler-Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.1.1. Assembler-Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.1.2 Direktiven, Kommentare und Konstanten-Definition . . . . . . . . . . . . . . . . . . . . 82 3.2 IDE vs. Notepad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.3 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 3.3.1 Projekt 1: „Hallo Welt“-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.3.1.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.3.1.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 3.3.2 Projekt 2: PIC als 555-Ersatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 3.3.2.1 Projekt 2-1: Minimal-Oszillator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.3.2.2 Projekt 2-2: Oszillator mit einstellbarer Frequenz . . . . . . . . . . . . . . . . . . . . . 95 3.3.2.3 Projekt 2-3: Interrupts und TIMER0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 3.3.2.4 Projekt 2-4: PIC ohne Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 3.3.2.5 Kommentar 2-5: NE555 mit PIC16F1829 . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.3.3 Projekt 3: 7-Segment-LED-Anzeigesteuerung mit Interrupts . . . . . . . . . . . . . . 105 3.3.3.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 3.3.3.2 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.3.3.3 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.3.3.4 Beispiel 1: Zähler 0000 -> 9999 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 3.3.4 Projekt 4: Flash-Speicher Auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.3.4.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.4 Beispiele für Fortgeschrittene – I2C und SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 3.4.1 Die Theorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 3.4.2 Anpassung von Projekt 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 3.4.3 PIC16F1829 als I2C-Master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
●6
8-bit Microcontroller DE 180912.indd 6
02-11-18 11:17
3.4.4 Projekt 5: Port-Erweiterung mit PCF8574N . . . . . . . . . . . . . . . . . . . . . . . . . . 133 3.4.5 PIC16F1829 als SPI-Master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 3.4.6 Projekt 6: Echtzeituhr mit DS1306 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Kapitel 4 • AVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.1 Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.2 Parallele EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.3 Tinys und Megas (und XMegas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 4.3.1 ATtinys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 4.3.1.1 ATtiny13A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 4.3.1.2 ATtiny25/45/85 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 4.3.1.3 Hallo Welt 1 und 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 4.3.1.4 ATtiny104 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.3.1.5 ATtiny88 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 4.3.2 ATmegas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 4.3.2.1 ATmega324PA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 4.3.2.2 ATmega328 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 4.4 AVRs Programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 4.4.1 Programspeicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.4.2 EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.4.3 Lock Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.4.4 Fuses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 4.4.5 Programmierungsprotokolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 4.4.5.1 TPI-Tiny Programming Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 4.4.5.2 Serielle Programmierung (SPI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 4.4.6 Programmierer AT ATMEL-ICE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Kapitel 5 • AVR-Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 5.1 Ausgewählte Assembler-Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 5.1.1 Bit-orientierte Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 5.1.2 Byte-orientierte Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 5.1.3 Arithmetische und logische Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 5.1.4 Sprungbefehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
●7
8-bit Microcontroller DE 180912.indd 7
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen 5.1.4.1 Bedingungslose Sprungbefehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 5.1.4.2 Bedingte Sprungbefehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 5.2 IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 5.3 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.3.1 Projekt 1: „Hallo Welt 3“-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.3.1.1 Die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 5.3.1.2 Die Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 5.3.2 Projekt 2: Zahnputz-Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 5.3.3 Projekt 3: Elektronischer Würfel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 5.3.3.1 Die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 5.3.3.2. Die Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 5.4 Beispiele für Fortgeschrittene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 5.4.1 Die Theorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 5.4.2 TWI-Modul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 5.4.3 Projekt 4: Thermometer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 5.4.3.1 Der Temperatursensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 5.4.3.2 Die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 5.4.3.3 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 5.4.3.4 Eine Notiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 5.4.4 Projekt 5: LCD-Ansteuerung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 5.4.4.1 LCD-Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 5.4.4.2 I2C-EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 5.4.4.3 Die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 5.4.4.4 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Kapitel 6 • Die letzte Schlacht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 6.1 PIC2AVR Prog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 6.1.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 6.1.1.1 Die Einspeisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 6.1.1.2 Das Herz der Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 6.1.1.3 EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 6.1.1.4 Test-LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
●8
8-bit Microcontroller DE 180912.indd 8
02-11-18 11:17
6.1.1.5 Erweiterung für ATmega328P & Co. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 6.1.1.6 Erweiterung für ATmega324PA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 6.1.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 6.1.2.1 AVR-Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 6.1.3 Die Bedienung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 6.1.3.1 Chip löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 6.1.3.2 Chip programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 6.1.3.3 Demo-Software hochladen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
●9
8-bit Microcontroller DE 180912.indd 9
02-11-18 11:17
Kapitel 1 • Einleitung
Kapitel 1 • Einleitung Guten Tag oder vielleicht guten Abend. Es könnte auch Morgen sein, aber zum Frühstück liest man eher eine Zeitung als Assembler-Befehle eines Mikrocontrollers (es gibt ja auch kaum täglich Neuigkeiten in diesem Bereich, die man morgens erfahren müsste). Aber egal – ob morgens oder nachts, es freut mich, Sie hier zu treffen. Es ist nicht zu übersehen, dass es die Firma Atmel nicht mehr gibt – besser gesagt, dass sie von Microchip übernommen wurde. Damit ist ein Konzern mit sehr großem und solidem Portfolio nicht von MCUs entstanden. Trotzdem gibt es immer noch ein paar Konkurrenten, hier seien nur Texas Instruments oder NXP erwähnt. Selbstverständlich auch STM oder auch Zilog, das unter anderem auch die fast schon historische Z80 herstellt. Falsch wäre es sicherlich auch, Infineon oder Analog Devices nicht zu erwähnen – mein Ziel ist aber nicht, alle z. Z. aktiven Mikrocontroller oder Mikroprozessoren-Chip-Hersteller zu erwähnen, sondern anzudeuten, dass es außer Microchip/Atmel noch ein paar andere zur Auswahl – auch für Hobbybastler – gibt. Für mich war es bei der Mikrocontroller-Auswahl immer wichtig, dass man das Programm einfach in den Ziel-Chip bekommen kann und auch nicht unbedingt viel Geld für ein Programmiergerät ausgeben muss... Dies war bei Microchip und Atmel immer der Fall. Und aus diesem Grund werde ich später gern auch ein paar Programmierungsmöglichkeiten für PICs und AVRs kurz darstellen. Bei Microchip und Atmel gab und gibt es außerdem bis jetzt für die Hobbybastler noch was Wichtiges: Sehr viele produzierte Chips sind auch in “bastlerfreundlichen” Gehäusen DIP verfügbar. In diesem Buch werden wir uns ausschließlich mit 8-Bit-Mikrocontrollern beschäftigen, auch wenn sich im Microchip-Portfolio außerdem noch 16- und 32-Bit -Mikrocontroller befinden. Die 8-Bit-Chips sind aber für sehr viele “Bastel-Anwendungen” vollkommen ausreichend und preislich auch sehr volksfreundlich... 1.1 Die ewigen Rivalen Es gab immer einen Krieg zwischen Microchip und Atmel. Das konnte man sehr schön bei den Bastlern sehen. Es gab ein Lager der AVR-Fans und ein anderes der PIC-Fans. Diese zwei Lager waren typischerweise verfeindet. Nur sehr selten kam es vor, dass sich jemand mit beiden Technologien beschäftigt hat. Die Zeiten ändern sich aber langsam. In den letzten Jahren konnten wir mehrere große Fusionen beobachten. 2015 ist Freescale von NXP geschluckt worden; inzwischen gibt es eigentlich auch NXP nicht mehr – weil die Gesellschaft von Qualcomm gekauft worden ist (2017). Linear Technology ist seit 2016 ein Teil von Analog Devices. Intersil gehört auch seit 2016 zu Renesas und Fairdchildsemi ist von ON Semi übernommen worden (auch 2016). 2017 hat die Gesellschaft MaxLinear der Hersteller Exar übernommen.
● 11
8-bit Microcontroller DE 180912.indd 11
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
In dieser Lage ist es eigentlich kein Wunder, dass Microchip und Atmel auch zusammengefunden haben. Ich würde sagen, viele Leute haben eher erwartet, dass es eher umgekehrt ausgehen würde, wenn es irgendwann zur Fusion zwischen Microchip und Atmel kommen sollte – sprich, dass Atmel der Microchip schluckt – die Realität ist aber anders. Mit der Atmel-Übernahme durch Microchip (2016) haben sich die Zeiten ein bisschen geändert. Es handelt sich zumindest um eine Firma, also kann man nicht mehr sagen: “Die anderen sind die Bösen.” Trotzdem hält Microchip die 2 Linien relativ streng voneinander getrennt. Für die PIC-Mikrocontroller gibt es die Microchips IDE MPLAB-X und für AVRs dann wieder Atmel Studio von Atmel. Die Programmiergeräte sind genauso “spezialisiert”. Laut Microchip ändert sich in absehbarer Zukunft an dieser Strategie erst einmal gar nichts. Eigentlich möchte ich nicht wirklich viel über die Firmenhistorie von Microchip und Atmel schreiben – die Fakten findet man sehr einfach überall – aber ein paar kurze Grundinformationen schaden wahrscheinlich nicht. 1.1.1 Microchip Microchip ist gar nicht so alt wie man denken könnte – oder wie ich gedacht habe. Die Gesellschaft Microchip Technology Inc. wurde im Jahre 1989 in den USA gegründet; eigentlich aus dem Konzern General Instruments ausgegründet.
Abbildung 1-01: Microchip Logo Für Amateurbastler ist die Firma vor allem durch der groß Auswahl an verschiedenen PIC-Mikrocontrollern bekannt. Außerdem stellt Microchip “schon immer” relativ günstige Programmiergeräte (eins der bekanntesten ist sicherlich PICKit2) und auch kostenlose IDE (Integrated Development Environment/Integrierte Entwicklungsumgebung) zur Verfügung. Für die Verbreitung von Microchip-Produkten spielt es sicherlich eine sehr wichtige Rolle. Zusätzlich dazu sind auch unzählige günstige 3rd-Anbieter-Programmiergeräte und auch Nachbauten von Microchip-Programmierern verfügbar. Eigentlich wäre es falsch, nicht zu erwähnen, dass Microchip nicht nur einer der berühmtesten Hersteller des MCUs ist, sondern auch viele andere Arten von Chips herstellt. Eine große Kategorie sind z. B. verschiedene Speicherbausteine (EEPROM, RAM, SRAM, ...), aber auch Chips wie TC7126 und ähnliche (die bekannten ADCs für Ein-Chip V/A Messgeräte) – und viele andere.
● 12
8-bit Microcontroller DE 180912.indd 12
02-11-18 11:17
Kapitel 1 • Einleitung
Abbildung 1-02: Microchip 3 ½ Stellen A/D Chips Das Portfolio der Firma Microchip hat sich selbstverständlich mit jeder Akquisition (wie z. B. die Übernahme des Herstellers Micrel 2016) immer und immer erweitert. 1.1.2 Atmel Atmel ist im Jahre 1984 gegründet worden. Genau wie bei Microchip handelt sich um einen US-amerikanischen Hersteller.
Abbildung 1-03: Atmel Logo Atmel ist vor allem durch seine AVR-Mikrocontroller bekannt geworden. Prinzipiell hat Atmel 3 Hauptlinien von Mikrocontrollern produziert: ATtiny (als Baseline), ATmega und die ATxmega (als High-End). Selbstverständlich hat Atmel auch Programmierungs-Tools und Entwicklungsumgebungen zur Verfügung gestellt. Sie werden auch nach der Fusion mit Microchip weiter unterstützt und fortgeführt.
● 13
8-bit Microcontroller DE 180912.indd 13
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
Abbildung 1-04: AVR-Mikrokontrollers Atmel war immer für seine Xpress Evaluation Boards für verschiedene MCUs bekannt. Es gab immer reichlich Boards zur Auswahl von kleinen ATtinys bis zu ARM-MCU-Demoplatinen – in einem sehr “angenehmen” Preisbereich. Ähnlich wie Microchip war auch Atmel ein Hersteller mit einem breiten Portfolio. An dieser Stelle möchte ich nicht nur die Atmel-Speicherbausteine sondern auch z. B. Temperatursensoren (wie z. B. AT30TSE754) oder die FPGA/CPLD-Chips erwähnen. Jedoch war das Portfolio nie so breit wie bei Microchip. 1.2 Die Fusion Und jetzt – nach 2016 – ist alles wieder anders. Ab sofort gilt: Ob PIC10F200 oder ATtiny104, “PIC-so-und-so” oder “ATmega-etwas” – alles bekommt man bei Microchip, inzwischen bei microchipDIRECT. Seit 31.12.2017 gibt es auch die www.atmel.com-Seite nicht mehr, wobei schon ein paar Monate vorher fast alle Links auf www.microchip.com umgeleitet worden sind. So ist das Leben. Was aber vielleicht interessanter wäre, ist der Vergleich bei der Entwicklung von AVRs und PICs. Heutzutage kann man schon die Geschichte der Entwicklung von PIC und AVRs schön gemeinsam darstellen:
● 14
8-bit Microcontroller DE 180912.indd 14
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
Kapitel 2 • PIC Ich glaube, wir können gleich mit den PICs loslegen. Hmmm – PIC: Was ist das eigentlich? Falls man ein bisschen im Internet sucht, findet man schon ein paar Erläuterungen, was die drei Buchstaben bedeuten sollten. Aber – laut Microchip – ist „PIC“ keine Abkürzung. Es bedeutet also weder „Peripheral Interface Controller“ noch „Partner In Crime“... – es ist lediglich die Bezeichnung der Mikrocontroller-Familie von Microchip. Wenn man in die Mikrocontroller-Welt einsteigen möchte, muss man „zwei Seiten der Welt“ kennenlernen: die Hardware und die Software. Das Interessante (man kann fast „das Schöne“ sagen) bei PIC-Mikrocontrollern (aber auch AVR) ist, dass man sich mit der Hardware selber nicht wirklich tief beschäftigen muss. Deswegen werde ich die HW-Kapitel des Buches auch eher schlank halten. 2.1 Überblick In diesem Buch werden wir uns ausschließlich mit 8-Bit-Mikrocontrollern beschäftigen. Hinsichtlich der PIC-Mikrocontroller bedeutet das, dass wir uns nicht mit PIC24 oder dsPIC32 (und ähnlichen PICs) beschäftigen werden. Es gibt eigentlich zwei Sichtweisen auf die PIC-Mikrocontroller oder besser gesagt: auf die Aufteilung des PIC-Mikrocontrollers: die Aufteilung nach Familiensicht oder nach Architektursicht. 2.1.1 Familiensicht Microchip stellt ein paar 8-Bi- Mikrocontroller-Familien seit einigen Jahren her. Stand heute (2017) gibt es folgende 8-Bit-PIC-Mikrocontroller-Familien: PIC10, PIC12, PIC16 und PIC18. Die steigenden Nummern bedeuten steigende Möglichkeiten und steigender Preis. Bei den einzelnen Familien handelt sich es immer um Mikrocontroller mit Flash-Programmspeicher, deswegen kann man sie eigentlich immer PIC10F, PIC12F, PIC16F und PIC18F nennen. Jede Familie enthält aber auch Mitglieder, die für niedrigere Spannung als «üblich» gebaut sind – der Name dieser Mikrocontroller enthält zusätzlich den Buchstaben „L“: PIC10LF, PIC12LF, PIC16LF und PIC18LF. Die Betriebsspannung von PIC-Mikrocontrollern beträgt normalerweise zwischen 2,3V und 5,5V. Bei den „L-Versionen“ ist die Spannung niedriger – normalerweise zwischen 1,8V und 3,6V. Eigentlich jeder PIC-Mikrocontroller enthält außer Flash-Speicher (in erste Linie für die Firmware) auch noch SRAM-Speicher und zusätzlich dazu EEPROM. In der letzten Zeit ist Microchip mit eine Veränderung bzgl. EEPROM gekommen: Manche der neuen Mikrocontroller enthalten statt EEPROM einen sogenannten HEF-Speicher. HEF ist die Abkürzung für High Endurance Flash Es handelt sich dabei um einen Bereich des Flash-Speichers, der deutlich häufiger beschrieben werden kann als der „normale“ Flash. Wie man heute weiß, kann man einen Flash-Speicher des Mikrocontrollers ungefähr 10.000-mal überschreiben – und danach kann Schluss sein. Die Speicher tut es nicht mehr und den Chip kann man entsorgen. Die EEPROM dagegen hält deutlich mehr aus. Die EEPROM kann man bis zu
● 22
8-bit Microcontroller DE 180912.indd 22
02-11-18 11:17
Kapitel 2 • PIC
100.000-mal (manche EEPROMs sogar 1.000.000-mal) überschreiben. Irgendwie macht es auch Sinn, Flash als Firmware-Speicher zu benutzen und EEPROM als Anwendungsspeicher, weil das Programm nicht so häufig geändert wird wie die Anwendungsdaten. Bei der HEF versucht man, sich die EEPROM-Technologie innerhalb des Chips zu sparen, stattdessen aber einen Teil des Flashs langlebiger zu machen. Es wird also am Ende des adressierbaren Bereichs des Flash-Speichers ein Bereich ergänzt, der statt 10.000 doch 100.000-mal überschrieben werden kann. Dies kann man dann entweder als Firmware-Speicher oder auch als Ersatz für EEPROM-Speicher nutzen. Jetzt zurück zu den „Familien“: Ein Schnellvergleich der Familien mit Fokus auf ihre Hauptmerkmale könnte so aussehen: Vergleich der PIC-Familien Familie
Anzahl
Programmspeichergröße
RAM
EEPROM/
Preis
der PINs
[kB]
[B]
HEF
[Einheit]
[B] PIC10
6
<1
16 – 64
0
0,4
PIC12
8
0,75 – 7
25 -256
0 – 256
1
PIC16
8 – 64
0,75 – 56
25 – 4.096
0 – 256
4
PIC18
18 – 100
4 – 128
256 – 8.192
0 – 1.024
8
Es wäre falsch, an dieser Stelle die „XLP-Technologie“ von Microchip nicht zu erwähnen. XLP ist aus dem englischen „eXtreme Low Power“ entstanden und kennzeichnet PIC-Mikrocontroller, die extrem wenig Strom verbrauchen. Sie sind selbstverständlich für das moderne Internet-der-Dinge-Anwendungen (IoT = Internet of Things) sehr gut einsetzbar. Die XLP-Mikrocontroller unterstützen den niedrigsten Batterieverbrauch auf verschiedenen Ebenen. Erstens kann der Verbrauch im Schlafmodus bis auf 9nA sinken. Wenn die in mehreren PICs integrierte Uhrfunktionalität (RTC – sprich Real Time Clock) benutzt wird, ist der Verbrauch bei laufender Uhr ~ 300nA. Außerdem ermöglichen die XLPs, eine Backup-Batterie einzusetzen, die bei Ausfall und Ausschaltung der Hauptbatterie automatisch „einspringt“. So werden z. B. die Zeitinformationen erhalten und die Uhr „tickt weiter“. Eine – man kann sagen Neuheit – ist die Funktionalität, die auf English Core Independent Peripherals heißt. Es handelt sich dabei um Peripherien, die ohne CPU selber auskommen. Das könnte z. B. der schon erwähnte RTC sein oder Komparatoren, LCD-Treiber, CLC (Configurable Logic Cell, die Interaktion zwischen anderen CIP erlaubt, ohne die CPU wecken zu müssen) usw. Diese Peripherien können selbständig die vordefinierten Aufgaben erledigen und bei Bedarf den „Meister“ (CPU) wecken, um zu machen, was notwendig ist (z. B. eine Nachricht abschicken). Ein Beispiel für XLP-MCU könnte die PIC16F191xx-Familie sein (z. B. der PIC16F19176, der auch in einem PDIP-40 Gehäuse verfügbar ist). Dieser Chip enthält 28kB Flash-Speicher und dazu 256 Bytes EEPROM, 2 kB RAM auch 4 x CLC, 2 x 10 Bit PWM, einen Zero-Cross-
● 23
8-bit Microcontroller DE 180912.indd 23
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
Detect-Baustein, der die Einsteuerung von Triacs vereinfacht, ein RTC-Modul (Real Time Clock) und sogar ein LCD-Controller (mit Bias-Generator), mit dem man bis zu 248 Segmente einsteuern kann. Bei all diesen Möglichkeiten ist der Preis von ungefähr 2,50 € sehr kundenfreundlich. Ich glaube, es ist Zeit für ein sehr einfaches Beispiel. Der Klassiker der PIC10-Familie ist der PIC10F200-Mikrocontroller. Dieser Chip gehört zu einer Familie mit 4 Mitgliedern: PIC10F200, PIC10F202, PIC10F204 und PIC10F206. Es handelt sich dabei um die 6-Pin-Chips – das Kleinste, das man auf dem „PIC-Markt“ finden kann. Der Mikrocontroller bietet außer 256 Words Flash-Speicher für Firmware noch 16 Bytes SRAM-Speicher – und das war's. Keine EEPROM. Dazu kommen noch 3 I/O-Pins, ein Input-Pin, und der Chip arbeitet mit einem internen Oszillator, der auf 4 MHz tickt. Es gibt noch einen Zähler und einen Komparator. Die Programmspeicher ist 12 Bit breit (deswegen 256 Words und nicht 256 Bytes – 1 Word hat die Breite von 12 Bits) und es gibt 33 Assembler-Befehle. Der Preis liegt in Deutschland bei ~ 50 Cent. Für einfache Anwendungen – wie z. B. einen Verzögerungsschalter – vollkommen ausreichend. 2.1.2 Architektursicht Eine andere Einstufung des PIC-Mikrocontrollers wird aus Architektursicht oft vorgenommen. Für 8-Bit-Mikrocontroller gibt's dann folgende Kategorien: • Baseline • Midrange • Enhanced Midrange • High-End (PIC18F) Die Hauptunterschiede zwischen den Kategorien liegen im Befehlssatz (Anzahl der Befehle und „Breite“ der einzelnen Befehle), Speichergröße und die auf dem Chip vorhandenen Peripherien. Wenn z. B. ein Mikrocontroller aus der Baseline-Reihe nur sehr rudimentäre Peripheriemöglichkeiten anbietet (wie z. B. ein einfacher ADC und ein Komparator – das war's aber auch schon) und 33 Befehle bearbeiten kann, bietet ein Chip aus der PIC18-Reihe 83 Befehle und HW-unterstützte Peripherien wie I2C, SPI und sogar USB oder EthernetKommunikation an. Folgende Grafik stellt grob die Hauptmerkmale der einzelnen Reihen hinsichtlich Speicher, Anzahl des Pins und Breite der Befehle dar:
● 24
8-bit Microcontroller DE 180912.indd 24
02-11-18 11:17
Kapitel 2 • PIC
Abbildung 2-01: PIC-Reihen – die Hauptmerkmale Es handelt sich hier um eine einfache Darstellung, damit man deutlich sehen kann, dass die PIC10F die wenigsten Beinchen und geringste Speichergröße haben und dass die Anzahl des Pins und Speicher mit steigender Nummer im Namen ebenfalls steigt. Genauso können wir sehen, dass die einzelnen Linien nicht disjunkt sind, sondern überlappend. Es heißt also, dass zum Beispiel die „schwächste“ der PIC18F-Linien kleinere Speicher haben könnte als der wenig „stärkere“ aus der Enhanced-Mid-Range-Linie. Die Breite des Instruktionswortes kann der Grafik auch entnommen werden. Am einfachsten ist es, die Merkmale in einer Tabelle darzustellen: Vergleich der 8-Bit-PIC-Mikrocontroller aus Architektursicht Baseline
Mid-Range
Enhanced Mid-Range
PIC18
Anzahl der Pins
6–40
8–64
8–64
18–100
Interrupts
keine
Performance [MIPS]
5
5
8
bis zu 16
Befehle
33/12-Bit
35/14-Bit
49/14-Bit
83/16-Bit
Flash-Speicher
bis zu 3 kB
bis zu 14 kB
bis zu 28 kB
bis zu 128 kB
Datenspeicher (RAM)
bis zu 138 Byte
bis zu 368 Byte
bis zu 1,5 kB
bis zu 4 kB
Hardware-Stack
2 Ebenen
8 Ebenen
16 Ebenen
32 Ebenen
Hauptmerkmale
Komparator 8 Bit ADC
zusätzlich zur Baseline: SPI / I2C UART PWM LCD 10 Bit ADC Op Amp
zusätzlich zur Mid-Range:
zusätzlich zur Enhanced Mid-Range: 8x8 HW-Multiplier CAN CTMU USB Ethernet 12 Bit ADC
aa
Highlights Anzahl des Mikrocontroller-Typs
16
58
29
193
Zugehörige Familien
PIC10, PIC12, PIC16
PIC12, PIC16
PIC12FXXX, PIC16F1XX
PIC18
● 25
8-bit Microcontroller DE 180912.indd 25
02-11-18 11:17
Kapitel 3 • PIC – Assembler
Kapitel 3 • PIC – Assembler In diesem Kapitell werden wir uns mit dem Grundlagen des PIC-Assemblers beschäftigen und dabei ein paar (ich hoffe) interessante Beispiele basteln. Weil es sich um sehr einfache Beispiele handelt, werden wir sie alle auf einer universellen Lochrasterplatine realisieren. Manche sind auch auf einem Experimentier-Steckboard umsetzbar. 3.1. Ausgewählte Assembler-Befehle Jetzt ist es Zeit, ein paar Assembler-Befehle („Grundbefehle“ sozusagen) kennenzulernen. Um das schnell und einfach zu schaffen, werden wir uns mit einem der einfachsten PIC-Mikrocontroller beschäftigen – mit dem PIC12F675. Die Hardware-Seite des Mikrocontrollers haben wir bereits (in Kapitel 2) kurz kennengelernt. Als Einleitung möchte ich nur erwähnen, dass sich die Mikroprozessoren in Abhängigkeit von der Anzahl der verfügbaren Befehle in 2 Gruppen aufteilen lassen. Wie wir schon wissen (sehr vereinfacht und nicht ganz richtig ausgedrückt), gehört er – je nachdem, wie viele Befehle der Mikroprozessor unterstützt – entweder zur CISC-Gruppe oder zur RISC-Gruppe. Der Unterschied lässt sich aus der Abkürzung der Gruppe ableiten: CISC steht für „Complex Instruction Set Computer“ und RISC für „Reduced Instruction Set Computer“. Wir wissen auch schon, dass der PIC12F675 in die RISC-Gruppe gehört – und es gibt insgesamt nur 35 Befehle zu lernen. 3.1.1. Assembler-Befehle MOVLW und MOVWF Der Befehl MOVLW lädt einen 8-Bit-Wert in die W-Register. Den Wert selber kann man entweder binär, hexadezimal oder dezimal eingeben. Die Syntax des Befehls sieht so aus: movlw k
wobei „k“ ein Wert aus dem Intervall 00h bis FFh ist. In den folgenden Beispielen sehen wir, wie man den Wert in einer binären (Präfix B), hexadezimalen (H) und dezimalen (D) Form schreibt: movlw B’10011110’ movlw H’9E’ movlw D’158’
Alle drei Beispiele sind identisch und werden den Wert 9Eh ins W-Register laden. Der Befehl MOVWF kopiert den Inhalt des W-Registers in einen Speicherplatz: movwf f
● 77
8-bit Microcontroller DE 180912.indd 77
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
wobei „f“ einen Wert von 00h bis 7Fh ist und für die Zieladresse steht. Also. wenn wir z. B auf die Adresse 20h den Wert 9Eh schreiben möchten, kann die Befehl-Sequenz so aussehen: movlw H’9E’ movwf H’20’
Der erste Befehl lädt den Wert 9Eh ins W-Register und der zweite Befehl schreibt dann den Inhalt des W-Registers auf die Speicherposition 20h. CLRF Der Befehl setzt den Inhalt eines Speicherplatzes auf 00h (CLRF = Clear f). Die Syntax des Befehls ist: clrf f
wobei „f“ einen Wert von 00h bis 7Fh ist und für die Zieladresse steht. Also z. B. clrf H’20’
wird auf den Speicherplatz 20h den Wert 00h schreiben. Um die Befehle MOVLW, MOVWF und CLRF noch mal zusammenzufassen, machen wir noch ein kleines Beispiel. Wir haben folgende Programmstrecke: movlw H’9E’ movwf H’20’ clrf H’20’
Die betroffenen Register (sprich W-Register und der Speicherplatz 20h) werden folgende Werte besitzen (am Anfang wissen wir nicht, welcher Wert im W-Register und am Speicherplatz 20h war). Rot dargestellt sind die Werte, die durch die einzelnen Befehle beeinflusst werden:
● 78
8-bit Microcontroller DE 180912.indd 78
02-11-18 11:17
Kapitel 3 • PIC – Assembler
Abbildung 3-01: Beispiel von Befehlen MOVLW, MOVWF und CLRF BSF und BCF Im Gegensatz zu den vorher erwähnten Befehlen, die immer mit Bytes operieren, arbeiten die Befehle BSF und BCF mit Bits. „BSF“ ist eigentlich eine Abkürzung von „Bit Set f“ und BCF wieder analog dazu eine Abkürzung von „Bit Clear f“, wobei „f“ für die Adresse eines Speicherplatzes steht. Die Syntaxbeschreibung lautet: bsf f, d bcf f, d
wobei „f“ einen Wert von 00h bis 7Fh ist und „d“ ist eine Zahl von 0 bis 7. Es handelt sich um Befehle, die mit einzelnen Bits von einem Speicherplatz arbeiten. Wir nehmen gleich ein Beispiel: bsf H’03’, H’05’
Dieser Befehl setzt die Bit Nummer 5 (d = 05h) von Speicherplatz 03h (f = 03h) auf 1 (es ist ein BSF Befehl). GOTO Der Befehl GOTO sorgt für die Störung des Programablaufs … Genauso wie in anderen Programmiersprachen kann man mit GOTO den Programmablauf unterbrechen, um an einer anderen – in GOTO spezifizierten – Stelle weiterzumachen. Die Syntax des Befehls ist: goto k
wobei „k“ eine Adresse des Programmspeichers ist und im Bereich von 000h bis 3FFh liegen
● 79
8-bit Microcontroller DE 180912.indd 79
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
kann. Eigentlich kann „k“ einen Wert von 000h bis 7FFh haben, weil aber unser Mikrocontroller nur 1024 Words Programmspeicher besitzt, machen die Werte, die über 400h liegen, nicht wirklich Sinn. DECFSZ Dieser Befehl ist eigentlich eine Abkürzung von „DECrement F and Skip if Zero“ und wir können ihn auch „Schleife-Befehl“ oder „Loop-Befehl“ nennen. Er ermöglicht die konditionelle Ausführung des nächsten Befehls. Wie? Erst einmal wird der Wert eines Registers „F“ dekrementiert und danach wird entweder der nächste (wenn der Ergebnis abweichend von Null ist) oder übernächste (wenn das Ergebnis gleich Null ist) Befehl ausgeführt. Die Syntax lautet: decfsz f,d
wobei „f“ die Adresse eines Speicherplatzes ist und „d“ definiert, wohin das Ergebnis der Operation (Dekrement) gespeichert werden soll. Falls „d = 0“ wird das Ergebnis ins W-Register gespeichert und der Speicherplatz selber bleibt unverändert; falls „d = 1“ ist, wird das Ergebnis zurück in den Speicherplatz geschrieben (und das W-Register bleibt unverändert). Und warum soll es ein „Loop-Befehl“ sein? Das sehen wir im folgenden Beispiel:
Abbildung 3-02: Beispiel für ein LOOP Befehl Hier sehen wir, dass wir in der ersten Zeile den Inhalt des Speicherplatzes 20h auf 00h setzen. Gleich danach wird der Befehl DECFSZ ausgeführt, mit dem Zusatz „1“ – also das Ergebnis wird zurück in den Speicher geschrieben. Was in diesem Fall passiert: Wir subtrahieren von Null eine 1, mit 8-Bits bekommen wir also der Wert FFh. Danach wird entschieden, ob FFh gleich 00h ist – ist es nicht, also wird der nächste Befehl ausgeführt. Eigentlich muss ich sagen, es wird nichts mehr wirklich verglichen. Bei der Operation („-1“) wird der
● 80
8-bit Microcontroller DE 180912.indd 80
02-11-18 11:17
Kapitel 4 • AVR
Kapitel 4 • AVR Nun kommt selbstverständlich die Frage: Was ist eigentlich AVR? Na ja, genau wie bei PIC hat die Abkürzung offiziell keine Bedeutung. Es ist einfach nur eine Bezeichnung für Chips. So ganz stimmt es bei AVRs auch nicht, da die Mikrocontroller als ATtiny oder ATmega gekennzeichnet sind. AVR ist dann die übergeordnete Familie. 4.1 Überblick Ähnlich wie bei den PICs werden wir auch bei AVRs mit 8-Bit-Architektur beschäftigen. Die Aufteilung des AVRs ist dabei einfacher als bei den PICs. Wir haben nur 4 Familien des Mikrocontrollers: ATtiny, ATmega, ATxmega und die AT89 Familie. Unser Fokus liegt auf den ATtiny- und ATmega-Familien. ATtiny ist sozusagen die „Einstiegsfamilie“. Diese Mikrocontroller sind für eher einfache Anwendungen mit optimiertem Energieverbrauch und einfacher Entwicklung optimiert. Jedoch bieten diese Mikrocontroller auch eine ganze Reihe integrierter Peripherien, wie ADC, DAC, Komparatoren, dazu auch EEPROM-Speicher und seit der Atmel-Übernahme von Microchip auch die CIP (Core Independent Peripherals = kernunabhängige Peripherien. Somit sind diese Mikrocontroller auch für den Einsatz in IoT-Bereich sehr gut geeignet. Die Mikrocontroller der ATmega-Familie stellen die nächste „Evolutionsstufe“ der Entwicklung dar. Diese Mikrocontroller bieten in der Regel mehr Speicherplatz und umfangreichere Peripherien an. Außerdem ist auch die Performance gegenüber ATtinys besser. Manche sind Pin2Pin-kompatibel mit vergleichbaren ATtiny-Mikrocontrollern; dazu kommen wir später beim Beispiel von ATtiny88 und ATmega88. Die AVR ATxmega sind die High-End-Mikrocontroller der Entwicklungsreihe ATtiny->ATmega->ATxmega. Prinzipiell bieten diese Mikrocontroller noch mehr Power, mehr Pins, mehr Peripherien und Speicher. Es ist aber zu erwähnen, dass es keine scharfe Grenze bzgl. einzelner Merkmale zwischen den Familien gibt. Die AT89-Familie ist eine ganze andere Art. Das Hauptmerkmal der Familie ist die Intel 8051-Kompatabilität. Die Mikrocontroller verschiedener Hersteller mit „8051-Kern“ sind dank der weit verbreiteten Wissensbasis und der vielen verfügbaren Legacy-Codes, die man einfach in eigene Anwendungen anbinden kann, noch immer sehr beliebt.
● 143
8-bit Microcontroller DE 180912.indd 143
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
Ein Vergleich der Familien hinsichtlich Speicher und Preis: Vergleich der PIC-Familien Familie
Anzahl
Programmspeicher-
der PINs
größe [kB]
RAM [B]
EEPROM [B]
Preis
ATtiny
6–28
0,5–32
32–512
0–256
0,8
ATmega
28–44
4–256
512–8.192
512–4.096
3
ATxmega
44–100
16–384
2.048–32.768
1-024–4.096
6
AT89
8–40
2–8
128–512
128–512
2
[Einheit]
In der Tabelle ist die Anzahl der Pins auf DIP-Gehäuse bezogen. Bei ATmega gibt es aber Mikrocontroller, die in DIP nicht mehr verfügbar sind, sondern nur in den „Vielbeinchen-Gehäusen“ (deswegen steht in der Tabelle „40+“), und die ATxmega werden nur in „Vielbeinchen-Gehäusen“ (wie z. B. TQFP) produziert. 4.2 Parallele EEPROM Im Portfolio von Atmel gab's so etwas wie EERAM nicht, andererseits hat Microchip von Atmel die Produktion von parallelen EEPROMs übernommen. Sie werden seit Ewigkeiten produziert. Die vielleicht bekannteste Verwendungen war immer das BIOS in PCs. Früher sind für BIOS EPROM verwendet worden („die Chips mit einem Fenster“); inzwischen werden EPROMs kaum mehr produziert (wenn überhaupt) und die EEPROMs dienen als 1:1-Ersatz für die EPROMs. Übrigens ist EPROM eine engl. Abkürzung für „Erasable Programmable Read-Only Memory“ und EEPROM von „Electrically Erasable Programmable Read-Only Memory“. Es handelt sich also um nicht-flüchtige Speicher, die man elektronisch programmieren, später löschen und ggf. neu programmieren kann. Der Unterschied zwischen EPROM und EEPROM ist die Art und Weise, wie der Löschvorgang durchzuführen ist. Bei EPROM kann man die Speicher mit UV-Licht löschen – deswegen auch das „Fensterchen“. Damit der Speicher im Laufe der Zeit nicht zufällig gelöscht wird, wird das Fensterchen nach der Programmierung immer zugeklebt. Bei EEPROMs wird der Löschvorgang elektronisch durchgeführt.
Abbildung 4-01: Verschiedene EPROMs und EEPROMs
● 144
8-bit Microcontroller DE 180912.indd 144
02-11-18 11:17
Kapitel 4 • AVR
Mit der Übernahme von Atmel hat Microchip zum größten Hersteller der parallelen EEPROMs weltweit gemacht. Im Portfolio gibt es viele verschiedene EEPROMs mit Speichergrößen von 64 kbit bis zu 1 Mbit. Außerdem gibt es „Low-Voltage“-Chips (2,7V), aber auch die Klassiker, die mit 5V arbeiten. Die Bezeichnungen sind relativ überschaubar: Es gibt immer ein Präfix – AT28 –, danach kommen ein oder mehrere Buchstaben, die Zusatzmerkmale definieren, und dann noch eine Zahl, die sagt, wie groß der Speicher ist. AT28HC256 ist z. B. ein „High-Speed“-EEPROM-Speicher mit einer Speichergröße von 256 kbit. 4.3 Tinys und Megas (und XMegas) In diesem Kapitel werden wir mit den AVR-Mikrocontrollern ATtiny und ATmega beschäftigen. Wir werden keine ATxmega und auch keine 8051-kompatiblen AT89-Prozessoren behandeln. Wir werden uns ein bisschen detaillierter mit ATtiny13A, ATtiny25 & Co., ATtiny104, ATtiny88, ATmega324 und ATmega328 & Co. beschäftigen. Der ATtiny104 ist der neueste von unseren vieren. Er kam im Jahr 2016 als einer von letzten unter dem Namen Atmel auf den Markt. Die restlichen drei sind deutlich ältere Semester. ATtiny104 ist der Mikrocontroller für IoT-Anwendungen, also Anwendungen für das Internet der Dinge. Der ATtiny88 ist relativ unbekannt, trotzdem ein wichtiges und starkes Mitglied der ATtiny-Familie. ATmega88 (ein Mitglied der Familie, zu der auch der ATmega328 gehört) ist für uns der Übergang zum «Arduino-AVR», der stärkste AVR, mit dem wir beschäftigen werden. Wir werden erst die Hardware des AVR-Mikrocontrollers kennenlernen. Danach können wir auf ein paar Beispiel-Schaltungen zeigen, dass man den AVR-Assembler relativ schnell lernen kann. Beim AVRs ist wichtig, dass eine Instruktion innerhalb von einem Oszillatortakt durchgeführt wird. D. h., wenn der Mikrocontroller mit einer Frequenz von 1MHz arbeitet, kann er 1 Million Befehle pro Sekunde bearbeiten. Die Rechenleistung ist damit 1MIPS (MIPS – aus dem Engl. million instruction per second). Normalerweise ist das bei den PIC-Mikrocontroller nicht der Fall, da wird die Oszillatorfrequenz durch 4 geteilt; man braucht 4 Takte, um einen Befehl zu bearbeiten. Die verschiedenen ATtiny- und ATmega-Mikrocontroller sind (im Gegensatz zum PIC) mit verschiedenen Programmierprotokollen zu bedienen. Prinzipiell werden mehrere serielle Protokolle und die Parallel-Programmierung unterstützt. Wir werden uns kurz mit folgenden Protokollen (in Kapitel 4.4 AVRs Programmieren) beschäftigen: • T PI (Abkürzung für Tiny Programming Interface) ist für die „Kleinsten“ gedacht
● 145
8-bit Microcontroller DE 180912.indd 145
02-11-18 11:17
8-Bit-Mikrocontroller PIC und AVR verstehen
• S PI (Abkürzung für Serial Programming Interface) wird von den meisten ATtinys und ATmegas unterstützt • parallele HV-Programmierung wird nur von „großen“ AVRs unterstützt, da dabei viele Beinchen notwendig sind Beim AVRs sind prinzipiell immer folgende Speicherbereiche programmierbar: • Flash-Speicher • EEPROM-Speicher • Fuse Bits • Lock Bits Mehr dazu erfahren wir später in diesem Kapitel. Die Fuses werden manchmal als „Sicherungen“ übersetzt, sehr oft bleibt man aber beim englischen Begriff „Fuse“, auch ich werde das tun. In den Namen von Mikrocontrollern kommt relativ oft ein Buchstabe am Ende vor. Ich möchte jetzt nur die zwei am häufigsten verwendeten erwähnen: P = picoPower A = verbesserte Version Es gibt z. B. ATtiny13 und ATtiny13A. D. h., der ATtiny13A ist eigentlich mit dem ATtiny13 identisch, aber ein technologisch verbesserter (und normalerweise auch neuerer) Typ. Genauso gibt es z. B. ATmega328 und ATmega328P, wobei der „P“-Typ im Verbrauch optimiert ist. Bei der Beschreibung später in diesem Kapitel werde ich die „Lock-Bits“ immer weglassen, sie dienen ja schließlich dazu, um Zugriffe auf die verschiedenen Bereiche des Flash-/EEPROM-Speichers zu vermeiden. Funktionell haben die Lock-Bits keine Bedeutung. 4.3.1 ATtinys Der Einstieg in die ATtiny-Familie stellen die Mikrocontroller ATtiny4, 5, 9 und 10 dar. Es handelt sich dabei um 6-Pin-Mikrocontroller, die leider – im Gegensatz zum PIC – nur in kleinen SOT-23- und UDFN-Gehäusen verfügbar sind (also keine DIP). Diese Mikrocontroller verfügen über 4 GPIOs und ein paar Peripherien, wie Analog-Komparator, 16-Bit-Timer/ Zähler usw. Es stehen 54 Befehle zur Verfügung und die Mikrocontroller sind in der Lage, mit einer Frequenz von bis zu 12 MHz zu arbeiten. Fürs Programm gibt es 512/1.024 Bytes Flash und für Programmvariablen dann noch weitere 32 Bytes SRAM. Die nächste Stufe des ATtiny ist dann der ATtiny13 gefolgt von ATtiny25 & Co. Der ATtiny13 beherrscht schon 120 Instruktionen und verfügt über 6 GPIOs und damit 8 Beinchen. Gegenüber ATtiny4 & Co. kommt auch die EEPROM dazu.
● 146
8-bit Microcontroller DE 180912.indd 146
02-11-18 11:17
Kapitel 5 • AVR-Assembler
Kapitel 5 • AVR-Assembler Das Ziel dieses Kapitels ist, sich mit den Grundlagen des AVR-Assemblers vertraut zu machen. Wir fangen mit ein paar Assembler-Befehlen an, als Theorie sozusagen. Anschließend werden wir uns anhand von Beispielen immer weiter in die Welt des AVR-Assemblers “hineingraben”. Viel Spaß dabei. 5.1 Ausgewählte Assembler-Befehle Gleich am Anfang muss ich sagen, dass der AVR-Assembler im Vergleich zum PIC-Assembler deutlich mehr Befehle beinhaltet. Ob das ein Vor- oder Nachteil ist, darüber kann man sich streiten – es ist einfach so. Der einfachste ATtiny13 beherrscht stolze 120 Befehle – im Gegensatz zum PIC10F200 mit 33 Befehlen ist es wirklich ziemlich viel. Wenn man nur die Anzahl der Befehle bei den AVRs (RISC-Mikrocontroller – RISC = Reduced Instruction Set Computer, d. h. Rechner mit reduziertem Befehlssatz) mit dem CISC-Z80-Prozessor (CISC = Complex Instruction Set Computers, also Rechner mit komplexem Befehlssatz) vergleicht, sind es wirklich sehr viele, denn der Z80 kennt 158 Befehle. Auch wenn man nur ein einfaches Assembler-Programm schreiben möchte, braucht es ein paar Grundinformationen über Assembler-Befehle und zudem über den Mikrocontroller selber. Das Folgende ist aber kein umfassender Assembler-Kurs, sondern es werden lediglich die erforderlichen Befehle abgehandelt, die wir für unsere Beispiele brauchen. Fangen wir gleich an. Die einzelnen Befehle kann man in ein paar Kategorien aufteilen: • arithmetische und logische Befehle • Sprungbefehle • Datenübertragungsbefehle • Bit- und Bit-Test-Befehle • Mikroprozessor-Steuerbefehle Für unsere Zwecke jedoch werden wir folgende Kategorisierung einführen: • Bit-orientierte Befehle • Byte-orientierte Befehle • a rithmetische und logische Befehle • Sprungbefehle 5.1.1 Bit-orientierte Befehle Für die ersten Experimente werden wir aus den Bit-orientierten Befehlen am meisten Gebrauch machen, auch wenn wir nur zwei davon verwenden werden, und zwar: CBI und SBI. CBI und SBI Diese beiden Befehle ermöglichen es, einen Bit auf Eins (SBI) oder auf Null (CBI) in einem der 32 Input/Output-Register zu setzen. Die Syntax des Befehls ist:
● 195
8-bit Microcontroller DE 180912.indd 195
02-11-18 11:18
8-Bit-Mikrocontroller PIC und AVR verstehen
cbi A, b sbi A, b
dabei steht A für eines der 32 I/O-Register, weshalb A einen Wert von 0...31 haben darf. Das zu setzende oder zu löschende Bit wird durch den zweiten Parameter b spezifiziert. Da es sich um 8-Bit-Register handelt, kann b den Wert 0...7 annehmen. Diese Befehle kann man nicht für die Änderung des Bits in Arbeitsregistern verwenden. Dafür gibt’s andere Befehle (cbr/sbr), die wir später beschreiben. SWAP Dieser Befehl wechselt die Nibbel eines Registers, d. h., die oberen 4 Bits werden untere sein und umgekehrt. Die Syntax des Befehls ist: swap Rd
wobei “d” die ID des Registers ist. Es kann eins von 32 allgemeinen Arbeitsregister sein. Wenn z. B. im Register R20 ein Wert 1011 0010b ist (binär dargestellt) und wir den Befehl swap R20
ausführen, ist das Ergebnis im neuen Inhalt des R20-Registers 0010 1011b.
5 .1 .2 Byte-orientierte Befehle LDI Der Befehl ermöglicht es, eine Konstante in eins der oberen 16 aus den 32 allgemeinen Arbeitsregistern zu laden. Die Syntax sieht so aus: ldi Rd, k
wobei “d” hier wieder das Register darstellt. Wichtig: Bei diesem Befehl kann “d” nur Werte von 16 bis 31 haben und “k” ist eine 8-Bit-Konstante, sprich von 0 bis 255.
● 196
8-bit Microcontroller DE 180912.indd 196
02-11-18 11:18
Kapitel 5 • AVR-Assembler
OUT Dieser Befehl kopiert den Inhalt vom allgemeinen Arbeitsregister in den I/O-Bereich. out A, Rd
Der Register-Parameter A kann Werte von 0...63 haben (es können Ports, Zähler, Konfigurationsregister etc. angesprochen werden). Der Parameter d indiziert das Ausgaberegister und kann Werte von 0...31 aufweisen. STS / LDS Beide Befehle ermöglichen es, mit SRAM zu arbeiten oder besser gesagt, die Daten zwischen allgemeinen Arbeitsregistern und SRAM hin und her zu schieben. STS ist eine Abkürzung für “Store Direct to Data Space”, also Speichern direkt in den SRAM-Bereich, und LDS ist eine Abkürzung für “Load Direct from Data Space”, also Hochladen vom SRAM. Die Syntax des STS-Befehls ist: sts k, Rd
wobei “d” für Register-ID steht und einen Wert zwischen 0 und 31 haben kann, “k” ist die Adresse des Speicherplatzes. Bei diesem Befehl ist “k” 16-Bit lang (2 Bytes) – man kann also 64kB Speicher adressieren und “k” kann einen Wert von 0 bis 65.535 haben (0000h – FFFFh). Der Befehl kopiert den Inhalt des Rd-Registers auf den mit “k” adressierten Speicherplatz. Die Syntax des LDS-Befehls ist: lds Rd, k
und das ist “das Gegenstück” zum STS-Befehl. Der Befehl kopiert den Inhalt des mit “k” adressierten Speicherplatzes ins Register Rd. “d” kann selbstverständlich auch hier von 0 bis 31 sein und “k” von 0 bis 65.535. 5.1.3 Arithmetische und logische Befehle ADD Der Befehl ADD addiert die Inhalte von zwei Registern zusammen. Die Syntax ist: add Rd, Rr
wobei “d” und “r” Register-IDs sind; beide können einen beliebigem Wert von 0 bis 31 haben.
● 197
8-bit Microcontroller DE 180912.indd 197
02-11-18 11:18
8-Bit-Mikrocontroller PIC und AVR verstehen
Der Befehl wird den Inhalt des Rr-Registers zum Inhalt des Rd-Registers addieren und das Ergebnis zurück ins Rd-Register speichern. INC Inkrementiert (vergrößert) den Inhalt eines Registers um Eins. Die Syntax des Befehls sieht so aus: inc Rd
wobei “d” wieder einen Wert von 0 bis 31 haben kann. DEC Dekrementiert (vermindert) den Inhalt eines Registers um Eins. Die Syntax des Befehls sieht so aus: dec Rd
wobei “d” wieder einen Wert von 0 bis 31 haben kann. ANDI Hier handelt sich es um eine logische Operation. Konkret wird ein logisches AND zwischen einzelnen Bits des Registers und einzelnen Bits eine Konstante durchgeführt. Die Syntax ist: andi Rd,k
Der Befehl ist nur für die “oberen 16” verfügbar, d. h., “d” kann einen Wert von 16 bis 31 haben und die Konstante “k” einen beliebigen Wert zwischen 0 und 255. Wenn wir z. B. im Register R20 die 4 MSBs nicht brauchen und sie “annullieren” möchten, könnte man es mit Hilfe dieses Befehls machen: andi
R20,0b00001111
Wenn also z. B. im Register R20 ein Wert 0b1011 0010 war, wird er nach diesem Befehl so aussehen: 0b0000 0010.
● 198
8-bit Microcontroller DE 180912.indd 198
02-11-18 11:18
8-Bit-Mikrocontroller PIC und AVR verstehen
Kapitel 6 • Die letzte Schlacht Jetzt bin ich nur noch die letzte versprochene PIC-Schaltung schuldig (hoffe ich jedenfalls …). Ich möchte gern – in aller Kürze – AVR-SPI-Programmiertool beschreiben, das aus einem I2C-EEPROM das AVR-Programm unter Verwendung des SPI-Protokolls in einen AVR-Controller schreiben kann. In dieser Übung werden wir sehen, wie einfach es ist, einen AVR-Controller zu programmieren. PIC-Nutzer, die erste Erfahrungen mit AVR sammeln möchten, könnten damit ein bisschen Geld für ein „echtes“ AVR-Programmiergerät sparen. Es ist nämlich möglich, mit dem PICKit2 (oder PICKit3) das AVR-Programm hochzuladen (ins Programmiergerät) und dann mit dem Gerät selber weiter ins AVR zu flashen. Mit dem PIC-AVR-Programmierer ist es eigentlich möglich, alle AVRs zu programmieren, die das SPI-Protokoll unterstützen. Wir haben inzwischen ein paar AVRs schon kurz kennengelernt. Jetzt bauen wir ein schickes Programmiergerät (nennen wir es PIC2AVR Prog) und erfahren, wie einfach es ist (und zwar nur mit Grundkenntnissen) auf andere AVRs umzusteigen. Deswegen wird unser Demo-Programmiergerät verschiedene AVRs programmieren können, die Auflistung folgt etwas später. Der PIC2AVR Prog basiert auf dem PIC16F1829-Mikrocontroller und verwendet außerdem einen I2C-Speicher, die mindestens 8kByte Speicherplatz bieten sollte, d. h., 24LC64 oder größer. Ein größerer Speicher ist dann sinnvoll, wenn man die hier beschriebene Firmware-Ergänzung vornehmen und einen ATmega328 programmieren möchte. Für den ATmega328 sollte man dann mindestens zum Baustein 24LC256 (mit 32kB) greifen.
Abbildung 6-01: PIC2AVR Programmiergerät
● 270
8-bit Microcontroller DE 180912.indd 270
02-11-18 11:18
Kapitel 6 • Die letzte Schlacht
Mit der Grundausstattung des PIC2AVR Prog ist es nicht möglich, die Fuses und Lock Bits zu programmieren. Das ist normalerweise bei den ersten Versuchen mit AVRs auch nicht dringend erforderlich. Kurz zusammengefasst kann man die Eigenschaften des PIC2AVR Prog so darstellen: Verwendeter Mikrocontroller: PIC16F1829 Verwendeter Speicher: 24LC256 (um alle aufgelisteten AVRs programmieren zu können) Es können Mikrocontroller programmiert werden, die das SPI-Protokoll unterstützen. Unterstützte AVRs (Firmware-Version 1.33 von 31.12.2017) mit Grunddaten: Programmierbare AVRs Nr.
01
ID
01
AVR Type
ATtiny13, ATtiny13V,
Flash-Größe
Anzahl
Seiten-
Anzahl
größe
der
der
(Page Size)
Seiten
Pins
1E-90-07
16 Words
32
512 Words
8
Signatur
ATtiny13A 02
02
ATtiny24, ATtiny24A
1E-91-0B
16 Words
64
1.024 Words
14
03
03
ATtiny44, ATtiny44A
1E-92-07
32 Words
64
2.048 Words
14
04
04
ATtiny84, ATtiny84A
1E-93-0C
32 Words
128
4.096 Words
14
05
05
ATtiny48
1E-92-09
32 Words
64
2.048 Words
28
06
06
ATtiny88
1E-93-11
32 Words
128
4.096 Words
28
07
07
ATmega48, ATmega48V,
1E-92-05
32 Words
64
2.048 Words
28
ATmega48A 08
08
ATmega48PA
1E-92-0A
32 Words
64
2.048 Words
28
09
09
ATmega88, ATmega88V,
1E-93-0A
32 Words
128
4.096 Words
28
ATmega88A 10
0A
ATmega88PA
1E-93-0F
32 Words
128
4.096 Words
28
11
0B
ATmega168, ATme-
1E-94-06
64 Words
128
8.192 Words
28
ga168V, ATmega168A 12
0C
ATmega168PA
1E-94-0B
64 Words
128
8.192 Words
28
13
0D
ATmega328
1E-95-14
64 Words
256
16.384 Words
28
14
0E
ATmega328P
1E-95-0F
64 Words
256
16.384 Words
28
15
0F
ATmega324PA
1E-95-11
64 Words
256
16.384 Words
40
16
10
ATtiny45
1E-92-06
32 Words
64
2.048 Words
8
17
11
ATtiny25
1E-91-08
16 Words
64
1.024 Words
8
18
12
ATtiny85
1E-93-0B
32 Words
128
4.096 Words
8
● 271
8-bit Microcontroller DE 180912.indd 271
02-11-18 11:18
8-Bit-Mikrocontroller PIC und AVR verstehen
Einschränkungen: In der Basisversion kann man nur den AVR-Flash-Speicher (den Programmspeicher) programmieren. Der PIC2AVR Prog führt nach der Programmierung keine Verifizierung des Flash-Speichers mit der Quelle durch. Wie verwendet man den PIC2AVR-Programmierer? Eigentlich ganz einfach. Die Vorgehensweise kann man auf einem Bild darstellen:
Abbildung 6-02: Vorgehensweise bei der Programmierung mit PIC2AVR Die Programmierung erfolgt in 2 Schritten: 1. Das HEX-File wird erst über den PICKit2 in den EEPROM-Speicher des PIC2AVR-Gerätes gespeichert. 2. Von PIC2AVR wird die HEX-Datei vom EEPROM des Geräts in den AVR-Mikrocontroller übertragen. ATtiny24/44/84 Mit dem Programmiergerät können auch einige Mikrocontroller, die wir nicht vorgestellt haben, programmiert werden, ganz konkret die ATtiny24/44/84. Diese drei AVRs sind eigentlich identisch, sie unterscheiden sich lediglich in der Speichergröße. Deswegen nur ganz kurz (vollständigkeitshalber): Diese Mikrocontroller kennen 120 Befehle, beinhalten 2k/4k/8kB Flash-Speicher und zusätzlich 128/256/516B SRAM sowie 128/256/516B EEPROM. Bei der Einspeisung von 2,7V bis 5,5V können die ATtiny24/44/84 mit einer Frequenz von bis zu 20MHz arbeiten.
● 272
8-bit Microcontroller DE 180912.indd 272
02-11-18 11:18
Kapitel 6 • Die letzte Schlacht
Die Pin-Belegung der DIP-Gehäuse sieht so aus:
Abbildung 6-03: Pin-Belegung des ATtiny24/44/84 – DIP Gehäuse 6.1 PIC2AVR Prog Und jetzt es kann losgehen: Wir bauen ein einfaches AVR-Programmiergerät zusammen. 6.1.1 Hardware Die Schaltung ist relativ einfach und ermöglicht den Anschluss an PICKit2/3 (um den vorhandenen EEPROM zu programmieren) und den Anschluss von AVR-Mikrocontrollern, die eine SPI-Programmierung unterstützen. Ich habe direkt auf der Platine zwei DIL-´Fassungen platziert: 8 Pin („AVR2“) und 14 Pin („AVR1“), um die kleinen AVRs direkt einstecken zu können. Weiterhin einen SPI-Konnektor („SPI-Header“), mit dem man z. B. eine DIL-28Fassung anschließen kann, um etwa den ATtiny88 programmieren zu können.
Abbildung 6-04: PIC2AVR Schaltplan
● 273
8-bit Microcontroller DE 180912.indd 273
02-11-18 11:18
ISBN 978-3-89576-335-9
Elektor-Verlag GmbH 52072 Aachen www.elektor.de
Durch die Lektüre des Buches erhalten Sie ein fundiertes Wissen über die genannten 8-Bit-Mikrocontroller, über ihre Architektur, ihre Pinbelegungen und über ihre Programmierung.
8-Bit-Mikrocontroller PIC und AVR verstehen
●
Miroslav Cina ist in der ehemaligen Tschechoslowakei geboren und hat seinen Hochschulabschluss an der Technischen Universität in Bratislava gemacht. Er lebt in der Pfalz und arbeitet seit 15 Jahren als Softwarearchitekt. Seit Ewigkeiten entwirft er verschiedenste (meistens) digitale Schaltungen. Viele davon sind inzwischen in Zeitschriften veröffentlicht worden.
In diesem Buch werden wir uns ausschließlich mit 8-BitMikrocontrollern beschäftigen, und zwar mit Mikrocontrollern der 8-Bit-PIC- und der 8-Bit-AVR-Mikrocontroller-Linien. Bei der PIC-Familie handelt es sich dabei um PIC10, PIC12, PIC16 und PIC18; bei der AVR-Familie um ATtiny, ATmega und ATxmega. Die vorgestellten 8-Bit-Chips sind für sehr viele Anwendungen vollkommen ausreichend und preislich auch attraktiv.
8-Bit-Mikrocontroller
Miroslav Cina
PIC und AVR verstehen
Miroslav Cina
8-Bit-Mikrocontroller
Weil wir uns in diesem Buch mit den Grundlagen der Architektur der PICs und AVRs vertraut machen möchten, werden wir auch für alle PIC- und AVR-Anwendungen Assembler einsetzen, denn die Assembler-Sprache erlaubt es, die Technik im Detail kennenzulernen. Wenn man wirklich wissen möchte, was sich im Mikrocontroller abspielt, greift man zu Assembler. Damit hat man die beste Gelegenheit, sehr nah an den Kern zu kommen. Und wenn man schon einen Mikrocontroller-Typ kennengelernt und verstanden hat, ist es bei dem nächsten deutlich einfacher, auch wenn er von einem anderen Hersteller kommt. Bei anderen Programmiersprachen bleibt die Technik immer ziemlich tief versteckt. Die Assembler-Beispiele sind so einfach gestaltet, dass sie jeder mit den im Buch aufgezeigten Programmiertechniken erstellen kann. Weil es sich um einfache Beispiele handelt, werden wir sie alle auf einer universellen Lochrasterplatine realisieren. Manche sind auch auf einem Experimentier-Breadboard umsetzbar.
LEARN DESIGN SHARE
Miroslav Cina 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 ● ● 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 ● SHAR GN ● 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 ● 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 ● SHAR