8-Bit-Mikrocontroller (Leseprobe)

Page 1

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


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.