Einfuehrung in Mikrocontroller
Transcription
Einfuehrung in Mikrocontroller
Einführung in MCU Viktor Seib Inhaltsverzeichnis 1 Einführung 1.1 Geschichte . . . . . . . . . . . . . 1.2 Mikrocontroller (MC) . . . . . . . 1.3 CISC und RISC . . . . . . . . . . 1.4 Unterschiede zu Mikroprozessoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 5 6 2 Aktuelle Mikrocontroller 8 2.1 Atmel AVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2 Vergleich der MC-Familien von Atmel, Microchip und Freescale 9 2.3 Die 8051-Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4 Vergleich: Motorola MC68HC05B6 und Atmel ATmega16 . . . 11 3 AVR-Studio 14 4 Quellenverzeichnis 18 1 Kapitel 1 Einführung 1.1 Geschichte In den 1960er und 1970er Jahren wurden in der Industrie festverdrahtete Analog- und Logikschaltungen eingesetzt. Eine solche Schaltung war für eine bestimmte Aufgabe konzipiert und konnte nur sie erfüllen. Sollte eine andere Aufgabe erfüllt werden, so wurde dafür entweder eine komplett neue Schaltung aufgebaut, oder aber die bereits vorhandene mühevoll um die neuen Funktionen ergänzt. Die Nachteile solcher Schaltungen liegen auf der Hand: Durch den festen Aufbau sind sie äußerst unflexibel und die Integration neuer Funktionen verursacht hohe Kosten. Daher dürfte es nicht verwundern, dass diese Art von Schaltungen nicht in der Lage war, mit den steigenden Anforderungen, der immer weiter fortschreitenden Automatisierung und den anfallenden komplexen Aufgaben Schritt zu halten Es waren immer öfter Schaltungen gefordert, die schnell und präzise auf Veränderungen in der Betriebsumgebung reagieren konnten, aber auch ein hohes Maß an Flexibilität aufwiesen. Alle diese Anforderungen führten zur Entwicklung programmierbarer Logikkomplexe, den sogenannten Field Programmable Gate Arrays (FPGAs). Sie bestanden im Wesentlichen aus konfigurierbaren Logikblöcken und einem Befehlsspeicher. Der Speicher konnte nun mit den von der Schaltung auszuführenden Aufgaben individuell programmiert werden und stellte die Logikblöcke während der Ausführung seines Programms auf die zu erledigenden Aufgaben ein. Bei dieser neuen Art der elektronischen Schaltung konnte man zwei wesentliche Bestandteile unterscheiden: die Hardware und die Software. Die Hardware ist der feste, unveränderliche Teil der Schaltung. Die Software, 2 also das im Befehlsspeicher enthaltene Programm, hingegen kann den jeweiligen Bedürfnissen des Einsatzgebietes angepasst werden und bietet dadurch eine hohe Flexibilität. Die ständige Weiterentwicklung der Logikblöcke, die fortschreitende Miniaturisierung und die Integration weiterer Funktionen führte zur Entwicklung der Mikrocontroller. 1.2 Mikrocontroller (MC) Die heutigen Mikrocontroller kann man als “Ein-Chip-Computer“ bezeichnen. Mit ihnen lassen sich komplexe Aufgaben lösen, für die sonst ein aufwändiger Schaltungsaufbau notwendig wäre. Die meisten aktuelle Mikrocontroller lassen sich sogar programmieren, wenn sie in einer Schaltung eingebaut sind (ISP - “in system programming“). Standardmäßig sind folgende Bestandteile in Mikrocontrollern integriert: CPU, SRAM und Flash-Speicher für den Programmcode. Weiterhin bieten MCs analoge und digitale Ports, mehrere AD/DA-Wandler, Timer und Schnittstellen zur Kommunikation mit der Außenwelt. Die Bit-Zahl eines MCs bezeichnet die Breite des internen Datenbusses. Typische Werte sind 8-, 16- und 32 Bit. MCs werden in der Regel mit Taktfrequenzen von 1 bis ca. 20 MHz betrieben, teure 32 Bit Modelle sogar mit weit über 100 MHz. 8 Bit MCs sind sehr weit verbreitet und reichen für Hobby- aber auch viele Profianwendungen vollkommen aus. Trotzdem werden sie immer mehr von den 16- und 32 Bittern abgelöst. 3 In der nachstehenden Abbildung ist der allgemeine schematische Aufbau eines Mikrocontrollers ist in folgender Abbildung dargestellt. Abbildung 1.1: Mikrocontroller, schematischer Aufbau http://www.erkenntnishorizont.de/robotik/uc/ucuebersicht.c.php Quelle: Mikrocontroller werden meist in der Harvard-Architektur realisiert. Dabei sind der Daten- und Programmspeicher physisch von einander getrennt. Der Vorteil gegenüber der von Neumann Architektur, bei der Daten und Code im selben Speicherbereich liegen, ist die Möglichkeit mit einem einzigen Taktzyklus einen Befehl und die dazugehörigen Daten zur CPU zu bringen. Daher wird diese Architektur bevorzugt bei RISC-Kernen verwendet 4 Die Einsatzgebiete der Mikrocontroller sind sehr vielfältig und so kann man sie in nahezu allen Bereichen des (elektronischen) Lebens finden. Beispielhaft seien an dieser Stelle aufgeführt: • Computertechnik: Drucker, Festplattencontroller, Monitore • Unterhaltungselektronik: Fernseher, Camcorder, Digitalkameras, CDSpieler • Verkehrstechnik: ABS, Motormanagment, Sicherheitselektronik, Klimaanlagen • Kommunikation: Handy, Telefon, Fax, Funkgeräte • Industrie: Prozessautomatisierung, Messwerterfassung, Steuerung und Regelung • Haushalt: Waschmaschine, Kühlschrank, Heizung • Waffensysteme: Bomben, Raketen Wegen dieser weiten Verbreitung übersteigt die Anzahl der weltweit jährlich abgesetzten MCs die Anzahl der abgesetzten Mikroprozessoren um ein Vielfaches. 1.3 CISC und RISC Moderne CPUs können auf zwei verschiedene Weisen aufgebaut werden: entweder als RISC- oder als CISC-Prozessor. CISC steht für “Complex Instruction Set Computer“ und bezeichnet einen Prozessor mit einem sehr umfangreichen Befehlssatz (oft mit vielen hundert Befehlen) und vielen Adressierungsarten. In CISC-Prozessoren sind alle Befehle mikroprogrammiert, d.h. sie sind in einer Art “Datenbank“ (Steuerwerk) auf dem Chip gespeichert. Das führt aber dazu, dass das Steuerwerk sehr komplex wird und viel Chipfläche verbraucht. Durch ihre Komplexität sind die einzelnen CISC-Befehle sehr mächtig, müssen aber aufwendig dekodiert werden und brauchen deutlich länger zur Ausführung, als RISC-Befehle (in der Regel 4 bis 10 Takte gegenüber 1 bis 2 Takten bei RISC). Die CISCArchitektur wurde in einer Zeit entwickelt, als Hauptspeicher noch klein, langsam und sehr teuer war. Die Entwickler hatten dabei vor allem ein Ziel vor Augen: den “Prozessor mit einem Befehl lange [zu] ’beschäftigen’“ [1]. Sobald sich allmählich Hochsprachen durchsetzten, wurden Untersuchungen durchgeführt, in welchem Ausmaß die Assemblerbefehle der Prozessoren 5 von den Compilern genutzt werden. Das Ergebnis: Über 80typischen Anwendung werden mit immer den selben, wenigen, Befehlen umgesetzt. Aus dieser Erkenntnis entstand die Idee der RISC-Prozessoren (“Reduced Instruction Set Computer“). Im Gegensatz zur CISC-, kommt die RISC-Architektur mit wenigen, vergleichsweise simplen Befehlen aus, was den Aufbau des Steuerwerkes erheblich vereinfacht und dadurch einen geringen Fertigungspreis ermöglicht. Auch die Adressierungsarten wurden im Vergleich zu CISC deutlich reduziert. So ist der Zugriff auf den Speicher nur durch Load- und StoreBefehle möglich. Sonst sind die Operanden für die Befehle ausschließlich Register, weswegen RISC-Prozessoren in der Regel 32 bis 64 davon besitzen. Neben der Einfachheit der Befehle, hat die hohe Anzahl der Register einen weiteren Vorteil: Da die Zwischenergebnisse in diesen zwischengespeichert werden, kann der Zugriff auf sie erheblich schneller erfolgen, als das zum Beispiel beim Laden aus dem Hauptspeicher möglich wäre. Die RISC-Befehle werden außerdem nicht - wie bei CISC - mikroprogrammiert, sondern fest verdrahtet, also durch Leiterbahnen auf dem Prozessor realisiert. Bei RISC wird durchschnittlich ein Befehl pro Takt verarbeitet. Möglich wird das zum einem durch die Einfachheit der Befehle, die nicht mehr umständlich decodiert werden müssen und zum anderen durch die parallele Verarbeitung (“Pipelining“). Dabei wird die Abarbeitung eines Befehls in mehrere Phasen zerlegt, die hintereinander an verschiedenen Stellen im Prozessor ausgeführt werden. Jede Phase braucht dabei nur einen Takt. Das bedeutet, dass sobald ein Befehl die erste Phase hinter sich gelassen hat, diese Phase mit der Abarbeitung des nächsten Befehls anfangen kann, ohne dass die vollständige Abarbeitung des ersten Befehls abwarten zu müssen. So ist bei n Phasen der erste Befehl zwar erst nach n Takten vollständig abgearbeitet, der zweite jedoch schon beim n+1 Takt, der dritte beim n+2 Takt usw. Das bringt aber auch Probleme mit sich, denn oft sind nachfolgende Befehle auf die Ergebnisse der vorhergehenden angewiesen. Um nicht n Takte auf das Ergebnis warten zu müssen, werden optimierende Compiler eingesetzt, die den Code umsortieren und die Lücken in der Pipeline durch unabhängige Befehle füllen. 1.4 Unterschiede zu Mikroprozessoren Der wichtigste Unterschied dürfte wohl sein, dass es sich bei Mikroprozessoren (MPs) lediglich um eine CPU handelt. Mikrocontroller dagegen sind ganze Mini-Computer auf einem Chip. Mit anderen Worten: eine CPU ist nur ein Teil eines MCs. 6 Bei den MPs stand lange Zeit eine hohe Taktfrequenz im Vordergrund. Die Devise war: Je höher die MHz-Zahl, desto stärker das Kaufargument. Bei MCs sah das vorrangige Ziel ganz anders aus. Hier wurde versucht immer mehr periphere Funktionen auf kleinstem Raum unterzubringen. Die Taktfrequenz war hier weniger wichtig und blieb somit weit hinter der der MPs zurück. Durch die Integration vieler Komponenten, können die MCs auf eine andere Weise punkten: Während ein Mikroprozessor zahlreiche Geräte (z.B. RAM, Mainboard) um sich herum braucht, um in Betrieb genommen zu werden, sind mit Mikrocontrollern sehr einfache Schaltungen möglich, da die meisten benötigten Teile wie das RAM, oder der Flash-Speicher, bereits integriert sind. Da die Mikroprozessoren mit viel höheren Takten betrieben werden und die Anzahl der in ihnen verbauten Transistoren wesentlich höher als die der Mikrocontroller ist, schlägt sich das auch im Stromverbrauch nieder. Während MCs sich mit wenigen Miliampere begnügen (Beispiel: der ATmega8 verbraucht bei 16 MHz und 5 Volt 20mA, was einer Leistung von 0,1 Watt entspricht), “verbrauchen“ einige moderne Mikroprozessoren weit über 100 Watt. Die meiste Energie wird jedoch in Wärme umgesetzt (Verlustleistung) und so müssen die heutigen Mikroprozessoren zum Teil sehr aufwändig gekühlt werden. Bei Mikrocontrollern entfällt dieser Punkt. 7 Kapitel 2 Aktuelle Mikrocontroller Es dürfte nicht verwundern, dass die Mikrocontroller bei ihrer weiten Verbreitung im heutigen Leben viele verschiedene Hersteller gefunden haben. Im Folgenden seien einige Hersteller mit ihren MC-Familien beispielhaft aufgeführt: • Intel (8051-Serie) • Renesas (H8) • Zilog (Z8) • Microchip (Pic) • Freescale (früher Motorola) (68HC08 bzw. 68HCS08) • Atmel (AVR, 8051-Serie) Ich werde mich auf die drei letztgenannten konzentrieren, wobei ich den AVR-Kern von Atmel gesondert vorstelle. 2.1 Atmel AVR Bei AVR handelt es sich um einen RISC-Kern, der an der Universität von Trondheim in Norwegen entwickelt und von Atmel aufgekauft wurde. Die CPU besitzt 32 allgemeine 8-Bit Register (general purpose registers) und ist in der Lage in einem einzigen Taktzyklus Daten aus zwei beliebigen Registern in die ALU zu laden, diese zu verarbeiten und das Ergebnis in einem beliebigen Register zu speichern. Dadurch ist der AVR-Kern in der Lage nahezu 1 Million Anweisungen pro MHz zu verarbeiten (“nahezu“, weil Sprungbefehle 2 Takte benötigen). 8 Laut Atmel hat das Akronym “AVR“ keine Bedeutung. Die Entwickler des AVR-Kerns Alf Egil Bogen und Vegard Wollan sprechen in einer Arbeit von “Advanced Virtual RISC“ in Zusammenhang mit dem Kern. Das soll aber nicht die Bedeutung des Akronyms sein, ebenso wenig wie “Alf (Egil Bogen)’s and Vegard (Wollan)’s RISC processor“. Der AVR-Kern wurde für die Programmierung in C optimiert. Die Entwicklung des zugehörigen C-Compilers am Atmel Development Center in Trondheim begann noch vor Fertigstellung des Kerns. Dadurch waren Optimierungen am Compiler aber auch am Kerndesign möglich. Für die Programmierung der AVR-Controller gibt es eine kostenlose Entwicklungsumgebung (AVR-Studio, siehe unten), die das Einbinden des CCompilers problemlos erlaubt. Atmel bietet zur Zeit zwei MC-Familien mit dem AVR-Kern an: die ATtiny- und die ATmega-Serie. Die ältere AT90-Serie wird dagegen nicht mehr produziert. Die Unterschiede zwischen den beiden Serien bestehen vor allem in der Größe des internen Flash- und Arbeitsspeichers, der Anzahl der I/O-Ports, der Timer und der AD/DA-Wandler. Weiterhin wurde bei den Controllern der Tiny-Serie auf die integrierte Echtzeituhr (RTC), die UART-Schnittstelle sowie auf die in Hardware realisierte Multiplikation verzichtet. Dagegen sind Funktionen wie das Two-Wire-Interface, ISP, der Watchdog und der Brown Out Detector in beiden MC-Serien vorhanden. Der Befehlssatz ist auch nahezu identisch, dieser weicht nur im Rahmen zusätzlich integrierter Funktionen in der ATmega-Serie gegenüber der ATtiny-Serie ab. 2.2 Vergleich der MC-Familien von Atmel, Microchip und Freescale Eine Übersicht über die aktuellen 8-Bit Mikrocontroller dieser Hersteller findet sich unter folgenden Links: Microchip: http://www.microchip.com/ParamChartSearch/chart.aspx? branchID=1031&mid=10&lang=en&pageId=74 Freescale: http://www.freescale.com/files/microcontrollers/doc/ fact_sheet/8BITCIPRODMPFS.pdf 9 Atmel (AVR): http://www.atmel.com/dyn/products/param_table.asp? family_id=607&OrderBy=part_no&Direction=ASC Atmel (8051-Serie): http://www.atmel.com/dyn/products/param_table.asp? family_id=604&OrderBy=part_no&Direction=ASC Im Grunde sind sich die Mikrocontrollerfamilien dieser drei Hersteller von den gebotenen Funktionen her sehr ähnlich. Der markanteste Unterschied besteht im CPU-Kern: Während Atmel und Microchip auf die RISC- und die Harvard-Architektur setzen, kommen im M68HC08-Kern (bzw. dem etwas neueren M68HCS08-Kern) von Freescale die CISC- und von-NeumannArchitekturen zum Einsatz. In einem anderen Aspekt hebt sich die PICFamilie von den anderen beiden ab: Sie ist im Gegensatz zu den Controllern von Atmel und Freescale eher schlecht für die Programmierung in Hochsprachen geeignet. Die Möglichkeit, die Controller direkt im Zielsystem zu Programmieren (ISP - In-System Programming) wird dagegen von allen drei MC-Familien unterstützt. Die Unterschiede zwischen den low- und high-end MCs dieser Hersteller liegen vor allem in der Größe des Flash- und Arbeitsspeichers und in der Anzahl der analogen- und digitalen Ports. Nachfolgend stelle ich die 8-Bit low-end und high-end Modelle von Atmel, Microchip und Freescale tabellarisch gegenüber: Low-end-Vergleich Flash (KByte) EEPROM (KByte) SRAM (KByte) I/O Pins digitale I/O-Ports analoge I/O-Ports interner Takt (MHz) Timer Preis (ca.) Atmel ATtiny25 2 0,128 0,128 6 1 (6 Bit) 4 (je 10 Bit) 20 2 (je 8 Bit) 2 Euro Microchip Freescale PIC12F635 MC908QT2A 1,75 1,5 0,128 0,064 0,128 6 6 1 (6 Bit) 1 (6 Bit) 1 (6 Bit) 6 (je 10 Bit) 8 (extern: max. 20) 8 2 (1x 8 Bit, 1x 16 Bit) 2 (je 16 Bit) 2 Euro 1 Euro 10 High-end-Vergleich Flash (KByte) EEPROM (KByte) SRAM (KByte) I/O Pins digitale I/O-Ports (Bit) analoge I/O-Ports (Bit) interner Takt (MHz) Timer (Bit) Preis (ca.) 2.3 Atmel Microchip ATMega2560 PIC18F8722 256 128 4 1 8 3,8 86 70 10x 8, 1x 6 8x 8, 1x 6 16x 10 16x 10 16 8 (ext.max. 40) 4x 16, 2x 8 3x 16, 2x 8 12 Euro 9 Euro Freescale MC68HC908GR60A 60 2 53 5x 8, 1x 7, 1x 6 24x 10 8 8x 16 7 Euro Die 8051-Serie Die 8051 Mikrocontroller Familie wurde am Anfang der 1980er Jahre von Intel entwickelt und an viele Hersteller lizenziert, darunter auch Atmel. Das Original ist heute selbstverständlich veraltet, aber es gibt auch aktuelle Entwicklungen, die dem heutigen Stand der Technik entsprechen. Atmel bietet neben maskenprogrammierten ROM-Typen mit bis zu 64 KByte Speicher (für den Einsatz in frei programmierbaren Logikschaltkreisen - den so genannten FPGAs), auch 8051-Typen mit Flash Speicher an (AT89-Familie). Diese werden in der RISC-Architektur entwickelt und haben ebenfalls eine Speicherkapazität von bis zu 64 KByte. Anders als der AVRist der 8051-Kern aber weit von 1 Million Anweisungen pro MHz entfernt. Die Befehle werden hier in 1 bis 4 Takte abgearbeitet. Die Flash-Typen bieten außerdem Funktionen wie A/D- Wandler, 16 Bit Timer und UART. Die maximale Taktfrequenz beträgt bei den meisten ROM-Typen 60 MHz, bei den Flash-Speicher-Typen immerhin 20 bis 60 MHz. 2.4 Vergleich: Motorola MC68HC05B6 und Atmel ATmega16 In diesem Semester (SS 2006) wird das Hardware Praktikum (HWP) an unserer Universität zum letzten Mal mit dem Mikrocontroller von Motorolla 11 durchgeführt. Ab dem nächsten Wintersemester wird dieser durch den ATmega16 ersetzt werden. Ich nehme diesen Technologiewechsel zum Anlass, um den alten HWP - MC mit dem neuen zu vergleichen und außerdem einen Atmel Controller aus dem “Mittelfeld“ (also zwischen low- und high-end) vorzustellen. Der MC68HC05B6 gehört zu der 68HC05-Familie (deren Nachfolger, die 68HC08 MC-Familie von Freescale, weiter oben bereits vorgestellt wurde) und wird heute nicht mehr hergestellt. Der ATmega16 arbeitet dagegen mit dem aktuellen AVR-Kern, findet eine weite Verbreitung und kostet unter 5 Euro. Beide MCs sind für Hochsprachen geeignet, aber nur Atmel bietet für seine Mikrocontroller eine komfortable und zudem auch noch kostenlose Entwicklungsumgebung an. In der folgenden Tabelle sind die wichtigsten Unterschiede und Eigenschaften dieser beiden Mikrocontroller zusammengefasst: ATmega16 MC68HC05B6 Architektur Harvard von Neumann Instruction Set RISC CISC Befehle (lt. Datenblatt) 131 62 Flash (KByte) 16 ROM 5936 Byte EEPROM (KByte) 0,5 0,25 SRAM 1024 Byte 176 Byte I/O Pins 32 24 digitale I/O-Ports 4 (je 8 Bit) 3 (je 8 Bit) analoge I/O-Ports 8 (je 10 Bit) 8 / 2 (je 8 Bit) interner Takt (MHz) 16 2,1 Timer 3 (1x 16 Bit, 2x 8 Bit) 2 sonstige Funktionen 4 PWM Kanäle 2 PWM Kanäle Real-Time-Clock (RTC) SPI UART SCI Two-Wire-Interface (TWI) ISP ISP Watchdog Watchdog Brown Out Detector 20 Interrupts + 3 externe 4 Interrupts + 1 extern 12 Ein scheinbarer Widerspruch scheint sich hier aufzutun, wenn man die Anzahl der Befehle der beiden MCs miteinander vergleicht: CISC mit ca. 60 und RISC mit mehr als doppelt so vielen Befehlen. Dabei steht RISC doch für “Reduced Instruction Set Computer“, wie kommt also dieser scheinbare Widerspruch zu Stande? Die Antwort ist ganz einfach: Der ATmega16 ist ein aktueller Mikrocontroller, der viel komplexer aufgebaut ist, als der veraltete 68HC05. Durch zusätzlich integrierte Peripherie bietet er dem Benutzer auch viel mehr Möglichkeiten, die natürlich alle irgendwie angesprochen werden müssen und daher auch eigene Befehle verlangen. Was aber auch noch zu der hohen Zahl der Befehle beiträgt, ist die Tatsache, dass Atmel einige Befehle mehrfach aufzählt, wie in [2] beispielhaft dargestellt ist. In [3] wird von ca. 60 Befehlen gesprochen, während Wikipedia von ca. 70 Befehlen spricht [4]. 13 Kapitel 3 AVR-Studio Für seine AVR-Mikrocontrollerfamilien bietet Atmel die kostenlose Entwicklungsumgebung “AVR-Studio“ an. Diese kann samt aktuellem Service Pack unter [5] heruntergeladen werden. Das AVR-Studio erlaubt die Entwicklung von Programmen in C und Assembler unter Windows, bringt aber keinen C-Compiler mit. Daher sollte zusätzlich “WinAVR“ von [6] heruntergeladen und installiert werden. WinAVR bringt einen C-Compiler (avr-gcc) mit, dieser wird nach der Installation automatisch vom AVR-Studio erkannt. Für die AVR-Entwicklung unter Linux gibt es folgende Alternativen: avrgcc (Compiler), avr-gdb (Debug), AVRdude (Programmiersoftware). Alle diese Programme sind für Windows in dem Packet “WinAVR“ enthalten. Für Linux müssen sie einzeln zusammengestellt werden. Beim Starten des AVR-Studios erscheint ein Fenster, das dem Benutzer die Möglichkeit bietet, entweder ein neues Projekt anzulegen oder ein bereits bestehendes zu öffnen. Entscheidet man sich für ein neues Projekt, so muss man zusätzlich festlegen, ob man in Assembler oder in C entwickeln möchte und anschließend dem Projekt einen Pfad und Dateinamen zuweisen. Im nächsten Schritt gilt es eine Debug-Plattform und den Mikrocontroller auf dem das Programm später laufen soll, auszuwählen. Der AVR-Simulator ist eine kostenlose und im AVR-Studio bereits integrierte Debug-Plattform. Sofern man keine der sonstigen aufgeführten Plattformen erworben hat, sollte man sich für den AVR-Simulator entscheiden (so wie ich das auch im weiter unten aufgeführten Beispiel getan habe). Als MC wählte ich den ATmega16. Die Debug-Plattform, aber auch der ausgewählt Mikrocontroller sind nicht an das angelegte Projekt gebunden und können bei jedem Neustart des Programms geändert werden. 14 Sobald alle Einstellungen vorgenommen wurden, erscheint folgendes Fenster, welches in drei Bereiche unterteilt ist: Abbildung 3.1: AVR-Studio Das Fenster auf der linken Seite bietet unter dem Reiter “AVR GCC“ (beim Programmieren in C) oder dem Reiter “Projekt“ (bei AssemblerEntwicklung) eine Übersicht über das aktuelle Projekt. Unter dem Reiter “I/O View“ kann der aktuelle Zustand des simulierten Mikrocontrollers eingesehen werden. Hier werden zum Beispiel alle Registerinhalte und die Zustände der Ein- und Ausgabeports angezeigt. Der Reiter “Info“ bietet allgemeine Informationen über den für das Projekt ausgewählten Mikrocontroller (in meinem Beispiel: ATmega16). Das große Fenster auf der rechten Seite ist der Editor. Hier kann der Quellcode geschrieben und im Debug-Modus auf Fehler überprüft werden. Der untere Bereich zeigt Compiler-Meldungen an. 15 Im Folgenden werde ich einige Funktionen des AVR-Studios an einem kleinen Beispielprogramm demonstrieren. Das Programm gibt in einer Endlosschleife die Zahlen von 255 bis 0 an Port A aus. Der Quelltext lautet wie folgt: /* Einbinden von header Dateien mit standardisierten Integer Datentypen und mnemonischen IO-Portnamen */ #include <avr/io.h> #include <stdint.h> int main(void) { // zahl als unsigned 8-Bit Integer Variable uint8_t zahl = 255; // Port A komplett auf Ausgabe setzen DDRA = 0xff; // Endlosschleife while (1) { PORTA = zahl; // Ausgabe an Port A zahl--; // zahl dekrementieren } } wird das Programm kompiliert, geBei einem Klick auf das Symbol ). bunden und der Debug-Modus gestartet (erkennbar am gelben Pfeil Außerdem wechselt das Fenster auf der linken Seite vom Reiter “AVR-GCC“ zum Reiter “I/O View“. Der gelbe Pfeil zeigt zunächst auf die erste ausführbare Anweisung. Mit einem Druck auf die Taste F11 (oder das Symbol ), wird die angezeigte Anweisung ausgeführt und der Pfeil springt zur nächsten. Auf diese Weise ist es möglich den Programmablauf Schritt für Schritt zu verfolgen. Alternativ kann durch einen Klick auf der automatische Programmablauf aktiviert werden (AutoStep). In diesem kleinen Beispiel kann man den Bewegungen des Pfeils mühelos folgen, aber bei größeren Projekten werden die schnellen Bewegungen schnell unübersichtlich. Mit kehrt man zum Einzelschrittmodus zurück oder beendet den DebugModus durch einen Klick auf (mit kann dieser erneut gestartet werden). 16 Ein Klick auf simuliert das Rücksetzen (Reset) des Mikrocontrollers, der Pfeil springt wieder auf die erste ausführbare Anweisung zurück und alle Register werden auf die Initialwerte zurückgesetzt. Eine interessante Funktion ist über den Button zugänglich. Dieser bietet die Möglichkeit, den eigenen C-Code im AVR-Assembler anzusehen. In der Darstellung des Assemblercodes werden die C-Befehle an der ansprechenden Stelle eingefügt und der Assemblercode automatisch kommentiert. In der I/O Ansicht im Fenster auf der linken Seite unter dem Punkt “I/O ATMEGA16“ (gekennzeichnet mit einem Ampelsymbol), gibt es einen Unterpunkt mit dem Titel “PORTA“. Klappt man diesen auf, kommen drei weitere Punkte zum Vorschein: PORTA, DDRA und PINA. Auf diese werde ich jetzt genauer eingehen. Das DDRA Register gibt die Datenrichtung für den Port A an. Eine eins (in der I/O-Ansicht ein schwarzes Kästchen) steht für Ausgabe, eine null (weißes Kästchen) für Eingabe. Die Datenrichtung wird im Beispielprogramm durch die Anweisung DDRA = 0xff; festgelegt, es werden alle Pins des Port A auf Ausgabe geschaltet (die Ausführung dieses Befehls ist im Debug-Modus nach dreimaligem Drücken der Taste F11 zu sehen). Im nächsten Schritt wird die Variable “zahl“ an den Port A ausgegeben. In der I/O-Ansicht passiert folgendes: Zunächst nimmt PORTA den Wert 0xFF (255) an und beim nächsten Schritt PINA. Wie darf man das verstehen? Das Register PORTA steht für den Zustand der internen pull-up-Widerstände, PINA dagegen für den tatsächlichen Pegel an den einzelnen Ausgabepins. Bei der Ausgabe der Zahl werden nun zuerst die pull-up-Widerstände auf den gewünschten Pegel gebracht und erst im nächsten Schritt (also beim nächsten Takt) wird dieser Wert auch tatsächlich an die Pins ausgegeben. Somit funktioniert der Simulator im AVR-Studio genau wie ein wirklicher Mikrocontroller: Bei diesem erfolgt die Ausgabe an die Pins ebenfalls mit einer Verzögerung von einem Takt. 17 Kapitel 4 Quellenverzeichnis Abbildungsverzeichnis: Abb. 1 - Mikrocontroller, schematischer Aufbau: www.erkenntnishorizont.de/robotik/uc/ucuebersicht.c.php Abb. 2 - AVR-Studio: selbsgemachtes Screenshot Quellenverzeichnis: direkt verwiesene Quellen: [1] [2] [3] [4] [5] [6] - www.uni-koblenz.de/~physik/informatik/techC.pdf, Seite 167, Zeile 4 www.rowalt.de/mc/avr/about.htm www.mikrocontroller.net/articles/AVR http://de.wikipedia.org/wiki/Atmel_AVR www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 http://winavr.sourceforge.net/ 18 alle Quellen: Literatur: Zengin, Zekeriya: Motorola 68HC05: B-Familie, Verlag Heinz Heise GmbH & Co KG: 19941 König, Anne und Manfred: Das PICmicro Profi-Buch, Franzis’ Verlag GmbH: 19991 Internet: www.ti.et-inf.uni-siegen.de/Mitarbeiter/Schwender/ mikrocontroller/Was_ist_ein_Mikrocontroller.pdf www.mikrocontroller.net/articles/Mikrocontroller www.mikrocontroller.net/articles/AVR www.mikrocontroller.net/articles/AVR-GCC www.mikrocontroller.net/articles/AVR-GCC-Tutorial www.mikrocontroller.net/articles/PIC www.mikrocontroller.net/articles/8051 www.mikrocontroller.net/articles/68HC05 www.mikrocontroller.net/articles/68HC08 www.uni-koblenz.de/~physik/informatik/techC.pdf - Seite 144, sowie 167 ff. www.at-mix.de/risc.htm www.at-mix.de/cisc.htm www.elektronik-kompendium.de/sites/com/0412281.htm www.elektronik-kompendium.de/sites/com/0501011.htm www.rowalt.de/mc/avr/about.htm www.atmel.com/dyn/resources/prod_documents/COMPILER.pdf http://de.wikipedia.org/wiki/Atmel_AVR 19 aktuelle Mikrocontroller: www.microchip.com/ParamChartSearch/chart.aspx? branchID=1031&mid=10&lang=en&pageId=74 www.freescale.com/files/microcontrollers/doc/ fact_sheet/8BITCIPRODMPFS.pdf www.atmel.com/dyn/products/param_table.asp? family_id=607&OrderBy=part_no&Direction=ASC www.atmel.com/dyn/products/param_table.asp? family_id=604&OrderBy=part_no&Direction=ASC Datenblätter der in den Vergleichen aufgeführten Mikrocontroller: ATtiny25: ATmega2560: ATmega16: www.atmel.com/dyn/resources/prod_documents/doc2586.pdf www.atmel.com/dyn/resources/prod_documents/doc2549.pdf www.atmel.com/dyn/resources/prod_documents/doc2466.pdf PIC12F635: PIC18F8722: ww1.microchip.com/downloads/en/DeviceDoc/41232B.pdf ww1.microchip.com/downloads/en/DeviceDoc/39646b.pdf MC908QT2A: www.freescale.com/files/microcontrollers/doc/data_sheet/ MC68HC908QY4A.pdf MC68HC908GR60A: www.freescale.com/files/microcontrollers/doc/data_sheet/ MC68HC908GR60A.pdf MC68HC05B6: www.freescale.com/files/microcontrollers/doc/data_sheet/ MC68HC05B6.pdf 20