Praktikum Eingebettete Systeme

Institut fu ¨r Informatik Professur fu ¨r Eingebettete Systeme Praktikum Eingebettete Systeme Wintersemester 2011/2012 Eingebettete Systeme Prof. D...
Author: Viktoria Waltz
3 downloads 0 Views 3MB Size
Institut fu ¨r Informatik Professur fu ¨r Eingebettete Systeme

Praktikum Eingebettete Systeme Wintersemester 2011/2012

Eingebettete Systeme

Prof. Dr. Uwe Brinkschulte Dipl.-Inform. Daniel Lohn Dipl.-Inform. Michael Bauer M. Sc. Benjamin Betting

1

Einfu ¨ hrung

Im Mittelpunkt des Praktikums stehen Eingebette Systeme und deren Hardware. Um die speziellen Anforderungen Eingebetteter Systeme an ihre Hardware zu verstehen muss deren Anwendungsgebiet von dem herk¨ ommlicher Rechensysteme abgegrenzt werden. Diese Abgrenzung liefert uns die Definition von Eingebetteten Systemen. Eine h¨ aufig verwendete Definition nach Thaller lautet: ”Bei Eingebetteten Systemen handelt es sich um einen durch Software kontrollierten Computer oder Mikroprozessor, der Teil eines gr¨oßeren Systems ist, dessen prim¨ are Funktion nicht rechenorientiert ist.” Eine etwas anschaulicherer und ausf¨ uhrlichere Definition findet sich auf Wikipedia: ”Der Ausdruck eingebettetes System (auch engl. embedded system) bezeichnet einen elektronischen Rechner oder auch Computer, der in einen technischen Kontext eingebunden (eingebettet) ist. Dabei hat der Rechner entweder die Aufgabe, das System, in das er eingebettet ist, zu steuern, zu regeln oder zu u ¨berwachen. Oder der Rechner ist f¨ ur eine Form der Daten- bzw. Signalverarbeitung zust¨andig, beispielsweise Ver/Entschl¨ usseln, De-/Codieren oder Filtern.” Beiden Definitionen ist gemeinsam, dass sie das Feld der Eingebetteten Systeme vom Bereich der Allzweck¨ /Mehrzweck-Rechner abgrenzen wollen. Dieser Ubergang gestaltet sich allerdings fließend: Konnten Handys zu ihrer Anfangszeit wenig mehr als Stimmen zu digitalisieren und Daten zu senden, k¨onnen sie heute dank Minibetriebssystemen und Java Applets beliebige Programme ausf¨ uhren. Waren Spielekonsolen anfangs nur wenig komplexer als Taschenrechner, k¨onnen sie heute mit Standardbetriebsystemen ausgestatten werden und bleiben im Leistungumfang kaum hinter Desktop Rechnern zur¨ uck. Einige Eingebetteten Systeme k¨ onnen also durchaus dieselbe Komplexit¨at wie Mehrzweckrechner erreichen und in manchen F¨ allen auch zu solchen werden. In unserem Alltag begegnen wir allerdings am h¨aufigsten einer anderen Art von Eingebetteten Systemen. Einfache und deshalb auch billige Rechensysteme sind in Sp¨ ulmaschinen, Kaffeautomaten oder digitalen Armbanduhren zu finden und damit beinahe allgegenw¨artig. Bei solchen Systemen reicht h¨aufig schon ein einzelner Mikrocontroller ohne Betriebssystem aus, um die gew¨ unschte Funktion zu leisten. Um einen hardwarenahen Einblick in das Gebiet der Eingebetten Systeme zu bieten, steht deshalb im Praktikum ein Versuchsboard mit integriertem ATmega128 Mikrocontroller und verschiedenen Peripherieanschl¨ ussen zu Verf¨ ugung. Der ATmega128 enth¨alt einen relativ einfachen 8 Bit Risc Prozessor. Dies erm¨ oglicht es auch unerfahrenen Anwendern Programme direkt in Assembler zu verfassen und so, die wichtigsten Komponenten eines Mikrocontrollers kennenzulernen und direkt anzusteuern. Die Lernziele des Praktikums lassen sich wie folgt zusammenfassen: • Detaillierte Einf¨ uhrung in Aufbau und Programmierung des ATmega128. • Einsatz der parallelen und der seriellen Schnittstellen des Mikrocontrollers zur Kommunikation mit anderen Rechnern. • Einsatz von Z¨ ahlern und Zeitgebern im Zusammenspiel mit Unterbrechungsbehandlung, um beispielsweise eine Pulsweitenmodulation zu realisieren. • Anbindung eines externen Speichers an das Mikrocontrollerboard und Implementierung eines einfachen Treibers inklusive Funktionstest. Am Ende des Praktikums sollen die Teilnehmer mit den grundlegenden Funktionen eines einfachen Rechnersystem vertraut sein. Dies stellt auch Inhaltlich eine Grundlage f¨ ur weitere Veranstaltungen auf dem Gebiet der Technische Informatik und Rechnerarchitektur dar.

2

2

Das Praktikumsboard

Ein Mikrocontroller stellt im Prinzip einem Mikrorechner auf einen Chip dar. Im Praktikum wird der Mikrocontroller ATmega128 von Atmel verwendet. Auf diesem befindet sich ein Prozessorkern, Speicher, Ein-/Ausgabeschnittstellen und weitere Komponenten wie A/D-Wandler, Z¨ahler-/Zeitgeber und Unterbrechungssteuerung. Die Schnittstellen f¨ ur alle Komponenten werden u ¨ber Pins an die Außenseite des Controllers gef¨ uhrt.

Abbildung 1: TQFP Geh¨auseformat eines Mikrocontrollers Um an die Ein-/Ausgabeschnittstellen des ATmega128 Peripherie, wie Taster oder LEDs anzuschließen, oder um auf den Programmspeicher zugreifen zu k¨onnen, muss der Mikrocontroller in eine gr¨oßere Schaltung integriert werden. So l¨ asst sich beispielsweise ein Nullmodemkabel nat¨ urlich nicht direkt an die Controllerpins f¨ ur die UART-Einheit anschließen. Zu diesem Zweck gibt es eine ganze Reihe unterschiedlicher Testboards, die sich in Umfang der integrierten Peripherie, Programmierschnittstellen und Erweiterungsm¨ oglichkeiten unterscheiden. Als Praktikumshardware hat man sich f¨ ur ein modulares Kit von Atmel entschieden. Das darin enthaltene STK500 bietet gleich mehrere Vorteile: • LEDs und Taster als Ansteuerungs- und Ausgabem¨oglichkeiten sind bereits auf dem Board integriert. • Ein Com Port als serielle Schnittstelle zur Kommunikation mit anderen Boards oder einem PC befindet sich ebenfalls auf dem STK500. • Es ist ein JTAG-Anschluss zur Programmierung und Runtime Debugging des ATmega128 integriert. • Der Mikrocontroller ist nicht fest mit dem Board verl¨otet, sondern kann durch eine Federhalterung jederzeit durch ein anderes Modell ausgetauscht werden. • S¨ amtliche Pins des Mikrocontrollers sind auf dem Board auf solide Kontaktstecker gef¨ uhrt und lassen sich so f¨ ur beliebige Peripherieger¨ ate nutzen. So kann das Board beispielsweise um die ben¨otigte Speicherkartenhalterung erweitert werden. • Da der Platz am Geh¨ ause des Mikrocontrollers sehr begrenzt ist, sind viele der Leitungen gemultiplext. Abh¨ angig davon, welche Komponente des ATmega128 im Programm ben¨otigt wird, l¨ asst sich dies durch neue Steckverbindungen realisieren. Der modulare Aufbau des Board gestaltet zwar den Betrieb im Praktikum schwieriger, als bei einer festen Verdrahtung, erlaubt aber auch die Erweiterbarkeit um beliebige Zusatzperiperie und die M¨oglichkeit

3

gemultipelexte Komponenten je nach Bedarf zu nutzen, ohne sich dauerhaft festlegen zu m¨ ussen. Die Anschl¨ usse f¨ ur die Praktikumsversuche sind dabei wie folgt:

Abbildung 2: Praktikumsboard mit nummerierten Anschl¨ ussen

1. Die Stromversorgung f¨ ur das gesamte Board, einschließlich des Mikrocontrollers, der Taster, LEDs und Zusatzperipherie. 2. Der untere serielle Anschluss steht f¨ ur die Versuche mit der UART-Schnittstelle zur Verf¨ ugung. ¨ Uber den oberen seriellen Anschluss kann auf den Speicher des ATmega128 zugegriffen werden. Da die Programmierung u ¨ber die JTAG-Schnittstelle einfacher ist und mehr M¨oglichkeiten bietet, siehe Abschnitt JTAG ICE mkII, wird nur der untere serielle Anschluss zu Kommunikationszwecken verwendet. 3. In dieser Federhalterung befindet sich der ATmega128. Wird der obere Rahmen nach unten gedr¨ uckt, ¨ offnet sich die Halterung f¨ ur die Pins und der Mikrocontroller kann entnommen oder gegen einen anderen ausgetauscht werden. 4. An den ATmega128 wird der JTAG Programmer u ¨ber diese 10 polige Steckleiste angeschlossen. Pin 1 und 2 sind sowohl auf dem STK500, als auch am JTAG ICE Anschluss gesondert gekennzeichnet. 5. Der Anschluss f¨ ur die acht Taster befindet sich links oben auf dem Board. Diese k¨onnen an einen beliebigen Port des ATmega128 angeschlossen werden. Um die Taster auszulesen muss die Portrichtung auf Eingabe gestellt sein. Werden die Taster gedr¨ uckt/losgelassen, stehen Einsen/Nullen im entsprechenden Eingaberegister. Alternativ lassen sich die Taster auch an externe Interrupteing¨ ange anschließen. Diese m¨ ussen in den Kontrollregistern des ATmega128 freigegeben werden, um auf Tastendruck einen Interrupt ausl¨osen zu k¨onnen. 6. Damit der UART im ATmega128 auch mit dem seriellen Anschluss verbunden wird, m¨ ussen die entsprechenden Pins am Mikrocontroller mit der Schnittstelle RXD/TXD, RS232 Spare auf dem Board verbunden werden. Der ATmega128 verf¨ ugt allerdings u ¨ber mehrere UARTs. Abh¨angig davon, welche UART-Einheit im Assemblerprogramm genutzt wird, m¨ ussen die Pins eines anderen Ports mit RXD/TXD verbunden werden. Eine Beispielschaltung, bei der Port E, und damit die UART Einheit 0, mit der seriellen Schnittstelle verbunden ist, findet sich am Ende dieses Kapitels. 4

7. Der Anschluss f¨ ur die acht LEDs befindet sich links unten auf dem Board. Diese k¨onnen an einen beliebigen Port des ATmega128 angeschlossen werden. Um die LEDs anzusteuern, muss die Portrichtung auf Ausgabe gestellt sein. Werden Einser/Nuller in das entsprechende Ausgaberegister geschrieben, so werden die LEDs aktiviert/deaktiviert. Nur die Verbindungen f¨ ur den JTAG-Programmer und die Stromversorgung sind immer fest vorgegeben. Alle anderen Steckverbindungen sind variabel. Zum Beispiel k¨onnen die Pins der UART-Einheiten im Assemblercode auch direkt angesteuert werden und zur Ausgabe von LED-Mustern dienen. Die Steckverbindungen h¨ angen also von der gew¨ unschten Peripherie und den verwendeten Ports im Assemblercode ab. Dies ¨ andert sich im Praktikum jedoch von Versuch zu Versuch. Besonders auf die Portrichtung (Ein/Ausgabe) im Assemblercode und die genaue Pinbelegung beim Stecken muss besonders geachtet werden.

Abbildung 3: Praktikumsboard mit Beispielanschluss Auf diesem Bild des STK500 ist die UART-Einheit 0 auf die seriellen Schnittstelle des Board geschaltet. Dazu verbindet das blau/weise, zweiadrige Kabel den Port E mit dem RXD/TXD-Anschluss (links oben). Zus¨ atzlich sind die LEDs an Port B angeschlossen (graues Kabel links unten im Bild). Am unteren rechten Bildrand ist ein serielles Kabel angeschlossen, das den UART des ATmega128 mit dem COM PORT am PC verbindet. Mit dieser Beschaltung kann das Board schon f¨ ur einfache Aufgaben benutzt werden. Zum Beispiel lassen sich so Tastaturbefehle am PC einlesen und als Eingaben im Assemblerprogramm verwenden. Der korrekte Datentransfer kann u ¨ber LED Ausgaben angezeigt werden.

5

3

JTAG ICE mkII

3.1

Nutzen des JTAG-Programmers

Um den ATmega128 zu programmieren, oder genauer gesagt, den erstellten Bin¨arcode in seinen Speicher abzulegen, w¨ urde eine einfache serielle Anbindung vollkommen ausreichen. Das Ziel des Praktikums ist aber nicht nur das Erstellen und Ausf¨ uhren von Assemblerprogrammen, sondern vor allem das Verst¨andnis von Programmabl¨ aufen und dem Aufbau des Mikrocontrollers. Deshalb wird ein zus¨atzlicher Programmer mit integrierter JTAG-Schnittstelle verwendet. Die JTAG-Schnittstelle wurde urspr¨ unglich verwendet, um die korrekte Funktion von Schaltungen nach der Endfertigung zu u ufen. Dazu m¨ ussen die Integrierten Schaltungen (ICs) mit zus¨atzlichen JTAG¨berpr¨ ¨ Testschaltkreisen versehen werden. Uber diese Zusatzschaltkreise l¨asst sich die eigentliche Schaltung auslesen und integrierte Speicherzellen beschreiben. So kann nach Fertigung und Einbau der ICs in gr¨oßere Systeme die Funktionalit¨ at mit Hilfe von Testprogrammen u uft und fehlerhafte Schaltkreise ausfin¨berpr¨ dig gemacht werden. Die M¨ oglichkeiten, die sich durch das Auslesen und Beschreiben der Register und Speicherzellen ergeben, sind weit gr¨ oßer, als das Testen auf korrekte Funktionalit¨at. Da der Zugriff auf die Schaltungen nicht an spezielle Testsoftware auf dem Chip oder einen eingeschr¨ankten Testmodus beschr¨ankt ist, kann der ¨ urspr¨ unglich nur zur Fertigungskontrolle gedachte JTAG-Anschluss auch zum Ubertragen des Codes in den Programmspeicher und sogar zum Runtime-Debugging verwendet werden. Das im Praktikum verwendete AVR Studio bietet eine virtuelle Ansicht vom angeschlossenen Mikrocontroller. Die vom Programmer u ¨ber die JTAG Schnittstelle erhaltenen Daten lassen sich so u ¨bersichtlich und leicht verst¨ andlich darstellen. Auf diese Weise bietet der JTAG ICE im Zusammenspiel mit dem AVR Studio gleich mehrere Vorteile f¨ ur die Praktikumsteilnehmer: • Der Programmcode kann auf dem Prozessor schrittweise ausgef¨ uhrt und auch angehalten werden. Registerinhalte und Speicherstellen k¨onnen jederzeit w¨ahrend der Programmausf¨ uhrung gelesen und beschrieben werden. Dies erleichtert die Fehlersuche in Programmen enorm. Gerade f¨ ur in Assemblerprogrammierung unerfahrene Anwender ist dies ein nicht zu untersch¨atzender Vorteil. • Durch Benutzermodifikationen an den Kontrollregistern lassen sich alternative Sprungrichtungen und andere Programmverzweigungen zur Laufzeit testet. Programmzweige k¨onnen gezielt angesteuert werden und sind nicht mehr an spezielle Ereignisse von außen gebunden. So k¨onnen zum Beispiel Programmabschnitte, die auftretende Fehler abfangen sollen, getestet werden, ohne dass diese tats¨ achlich auftreten m¨ ussen. • Da s¨ amtliche Kontrollregister w¨ ahrend des Programmablaufs einsehbar sind, l¨asst sich die Funktionsweise der Mikrocontrollerkomponenten einfacher nachvollziehen. Komponenten, wie die Z¨ahler/Zeitgebereinheiten, lassen sich u unschten Zustand ¨ber ihre Kontrollregister jederzeit in einen gew¨ versetzen. Folgezust¨ ande und ausgel¨oste Interrupt Service Routinen lassen sich so Schritt f¨ ur Schritt abarbeiten und beobachten. Dies erleichtert das Verst¨andnis des Zusammenspiels zwischen Software und den Hardwareeinheiten sehr.

3.2

Anschluss des JTAG-Programmers

Der JTAG-Programmer wird zwischen Entwicklungs- und Zielplattform geschaltet. Er nimmt den Programmcode vom AVR Studio entgegen, wandelt ihn in das JTAG-Format um und legt ihn, u ¨ber die JTAG-Schaltkreise, im Speicher des Mikrocontrollers ab. Von der Zielplattform liest der Programmer die Register- und Speicherinhalte aus und u ¨bermittelt sie an das AVR Studio.

6

Abbildung 4: JTAG Programmer mit angeschlossenem AVR Board An den PC wird der JTAG ICE mkII u ¨ber ein USB-Kabel angeschlossen. Im Gegensatz zum Anschluss u ¨ber den Com Port kann der Programmer so im laufenden Betrieb angeschlossen werden, wird automatisch erkannt und ben¨ otigt keine separaten Stromversorgung. An den ATmega128 wird der Programmer u ¨ber eine 10-polige Steckleiste auf der Oberseite des STK500 angeschlossen. Pin 1 und 2 sind sowohl auf dem STK500, als auch am JTAG ICE Anschluss gesondert gekennzeichnet.

Abbildung 5: JTAG Anschlusspins am Praktikumsboard F¨ ur den Betrieb des JTAG ICE mkII sind drei, auf der Oberseite befindliche LEDs wichtig. Diese liefern Informationen u ¨ber den aktuellen Status des Programmers, der Verbindung und des Target Device. • LED 1 leuchtet gr¨ un, wenn die Stromversorgung am Zielger¨at steht. Bei der im Praktikum verwen7

deten Hardware zeigt diese LED also an, ob der ATmega128 am STK500 richtig angeschlossen ist und mit Spannung versorgt wird. • LED 2 leuchtet rot, wenn die Stromversorgung des Programmers steht. Dies geschieht nach dem Einschaltet des Arbeits-PCs auch ohne zus¨atzliches Stromkabel am JTAG ICE automatisch, da die Stromversorgung u ¨ber den USB Anschluss ausreicht. • LED 3 leuchtet gr¨ un, wenn Daten u ¨bertragen werden, gelb bei Firmwareupgrades und w¨ahrend der Initialisierung und rot, wenn die Verbindung zum AVR Studio nicht steht. Die LED leuchtet nicht, wenn die Verbindung zum AVR Studio steht, aber keine Daten u ¨bertragen werden.

Abbildung 6: Status-LEDs am Programmer Mehr Information u ¨ber den JTAG ICE mkII erh¨alt man im AVR Studio unter HELP/ ” AVR Tool User Guide/JTAG ICE mkII“.

8

4

Das Terminal Programm

Um die Programme der Praktikumsversuche m¨oglichst dynamisch zu gestalten, sind nat¨ urlich Ein- und Ausgabem¨ oglichkeiten wichtig. Der ATmega128 verf¨ ugt zwar u ¨ber mehrere Kommunikationskan¨ale, auf dem Praktikumsboard selbst sind aber nur Taster und LEDs angeschlossen. Um in sp¨ateren Versuchen auch entsprechend komplexe Steuerungsm¨oglichkeiten zu haben, wird die UART-Schnittstelle des ATmega128 genutzt. Diese bietet die M¨ oglichkeit Pakete mit bis zu acht Datenbits zu empfangen/ verschicken und zeigt erfolgreiches senden/empfangen durch Statusflags und Interrupte an. Das STK500 Board bietet die M¨ oglichkeit den UART Port auf eine RS323 Schnittstelle zu legen. Diese l¨asst sich mit einem COM Port am Praktikums PC verbinden. Durch diese Anbindung lassen sich Tastaturkommandos vom PC zur Steuerung der Assemblerprogramme auf dem ATmega128 nutzen.

4.1

HyperTerminal

Das Betriebssystem Windows XP enth¨ alt bereits ein Terminalprogramm zur Kommunikation u ¨ber die serielle Schnittstelle. Mit Hilfe dieses Programms l¨asst sich eine Verbindung zu anderen Computern, zu Telnet-Sites, zu Bulletin-Board-Systemen (BBS), zu Onlinediensten und zu Host-Computern herstellen. Eine Verkn¨ upfung zum HyperTerminal Programm steht unter Start/Alle Programme/Zubeh¨or /Kommunikation/Hyperterminal. Beim erstem Starten muss eine neue Verbindung eingerichtet werden. Icon und Name der Verbindung d¨ urfen beliebig gew¨ ahlt werden.

Abbildung 7: Screenshot HyperTerminal Im n¨ achsten Schritt muss bei ”Verbindung herstellen u ¨ber:”der entsprechende COM Port gew¨ahlt werden. An der R¨ uckseite des PC Geh¨ auses sind die COM Ports nummeriert. Das Nullmodemkabel zwischen PC und STK500 muss also an den Port angeschlossen werden, der im Hyperterminal ausgew¨ahlt wird.

9

Abbildung 8: Screenshot HyperTerminal Als letzte Einstellung m¨ ussen die Bedingungen f¨ ur den Datentransfer festgelegt werden. Auch hier sind die Einstellungen davon abh¨ angig, mit welcher Konfiguration der ATmega128 gestartet wird. F¨ ur die Versuche im Praktikum wird eine Baudrate von 1200 Bits pro Sekunde, 8 Datenbits pro Paket, kein Test auf Parit¨ at, ein Stoppbit und Betrieb ohne Flusssteuerung empfohlen.

Abbildung 9: Screenshot HyperTerminal Unter ”Datei/Speichern unter”kann eine Verkn¨ upfung auf den Desktop erstellt werden, um das Terminalprogramm wieder mit denselben Einstellungen starten zu k¨onnen.

10

4.2

Die UART Einheit

Beim ATmega128 m¨ ussen jeweils zwei Konfigurationsregister f¨ ur die Baudrate und f¨ ur das Datenformat eingestellt werden. In die Register ucsrXc und ucsrXb werden die Konfigurationsbits f¨ ur die Flusssteuerung, die Parit¨atspr¨ ufung, das Stoppbit und die Datenbits pro Paket gesetzt. Das X im Registernamen steht dabei f¨ ur die jeweilige UART-Einheit 0 oder 1. ¨ Im Register icsrXa werden keine Konfigurationen vom Benutzer gespeichert, sondern der UART-Ubertragungsstatus angezeigt. ¨ In die Register ubrrXh und ubrrXl wird ein 16 Bit langer Wert gespeichert. Dieser steuert die Ubertragungsrate der jeweiligen UART-Einheit. In diesen Wert gehen zwei Faktoren ein: die gew¨ unschte Baudrate und die Taktfrequenz des ATmega128. Als Baudrate wurde im Hyperterminal 1200 Baud ausgew¨ahlt. Die ATmega Frequenz l¨ asst sich mit dem JTAG Programmer zwischen 1 bis 16 MHz einstellen. Der UBRR Wert berechnet sich dann wie folgt:

T aktf requenz in Hz + Baudrate · 8 Baudrate · 16

−1

Diese Werte k¨ onnen im Assemblercode als Konstanten mit dem Befehlen .equ zu Beginn des Programms ¨ ¨ festgelegt werden. Dies ist u der Ubertragungsrate ¨bersichtlicher und der Quellcode kann bei Anderungen leicht anpasst werden. .include m128def.inc” .equ F CPU = 16000000 ;Systemtakt in Hz .equ BAUD = 1200 ; Baudrate .equ UBRR VAL = ((F CPU+BAUD*8)/(BAUD*16)-1) Die Details zu den USART-Einstellungen und Konfigurationsregistern sind ausf¨ uhrlich im ATmega128 Handbuch beschrieben.

11

5

AVR Studio

Das wichtigste Softwaretool f¨ ur das Praktikum ist das AVR Studio. Es u ¨bernimmt gleich mehrere Aufgaben: • Entwicklungsumgebung zum Erstellen,Verwalten und Kompilieren des Programmcodes. • Kommunikation mit dem JTAG Programmer zum Laden des Programmcodes in den ATmega128. ¨ • Ubersicht u ¨ber alle Mikrocontrollerkompontenten, Register- und Speicherinhalte auch w¨ahrend der Programmausf¨ uhrung. Von besonderer Bedeutung ist dabei die Kompatibilit¨at mit dem JTAG ICE mkII. Das Einbinden des JTAG-Programmers in die Kommunikation mit dem ATmega128 vereinfacht nicht nur das Laden des Programmcodes in den Mikrocontroller, sondern erlaubt auch Runtime Debugging. So kann das Programm, w¨ ahrend seiner Ausf¨ uhrung auf dem Mikrocontroller, zu jeder Zeit im AVR Studio angehalten werden, um die Status-, Kontrollregister und Speicherbereiche auszulesen. Die Register und Speicherinhalte lassen sich dabei durch die JTAG-Schaltung nicht nur auslesen, sondern auch beschreiben. So k¨onnen zur Laufzeit neue Registerwerte eingegeben, Interruptflags gesetzt und Sprungrichtungen ge¨andert werden. Das AVR Studio ist also nicht nur die Entwicklungsumgebung, sondern wird auch zum Laden des Programmcodes in den ATmega128 und anschließendem Debuggen zur Laufzeit verwendet.

5.1

Anlegen eines neuen Projekts

Nach dem Start des AVR Studio wird der Benutzer aufgefordert Projekttyp, Projektname und Speicherort anzugeben. Sollte das entspechende Startfenster nicht erscheinen, kann es unter Project/New Project jederzeit wieder ge¨ offnet werden.

Abbildung 10: Projekteinstellungen im AVR Studio

12

F¨ ur die Versuche im Praktikum wird im Feld Project type“ die Einstellung Atmel AVR Assemb” ” ler“ ausgew¨ ahlt. Der Projektname sollte einen eindeutigen Bezug zur jeweiligen Aufgabe haben. Unter Location“ muss der Pfad zum jeweiligen Praktikumsordner eingegeben werden. Sollten f¨ ur spezielle Pro” grammieraufgaben andere Einstellungen notwendig sein, wird in den jeweiligen Aufgabenstellung auf die ¨ Anderungen hingewiesen. Mit dem Button next“ gelangt man zum n¨achsten Schritt. Hier wird nach der Programmiereinheit und ” dem Mikrocontroller des Projekts gefragt.

Abbildung 11: Auswahl Target Device im AVR Studio Im Feld Debug Platform“ muss JTAGICE mkII“ ausgew¨ahlt werden, unter Device“ der ATmega128 ” ” ” und als Port Option USB“. Anschließend kann die Eingabe der Projekteinstellungen mit dem Button ” Finish“ abgeschlossen werden. ”

13

5.2

Die Entwicklungsumgebung

Im Hauptfenster des AVR Studio gibt es eine Kontrollleiste am oberen Rand und f¨ unf Unterfenster darunter.

Abbildung 12: Entwicklungsumgebung im AVR Studio

• Fenster 1 zeigt den Projektnamen und die eingebundenen Dateien an. Hier k¨onnen auch weitere Quelldateien eingef¨ ugt werden. • Fenster 2 ist ein Texteditor zum Editieren des Quellcode. ¨ • Fenster 3 zeigt eine Ubersicht u ¨ber die Funktionseinheiten des ausgew¨ahlten Mikrocontrollers. ¨ • Fenster 4 liefert eine Ubersicht u ¨ber das Projekt. Fehler beim Kompilieren, Verbindungsstatus beim Programmieren und andere Informationen werden in diesem Feld angezeigt. • Wird in Fenster 3 eine Funktionseinheit ausgew¨ahlt, zeigt Fenster 5 die dazugeh¨origen Kontrollund Statusregister mit dem jeweiligen Inhalt und der Adresse an.

14

5.3

Kompilieren und Ausfu ¨ hren

Wenn der Programmcode vollst¨ andig eingegeben wurde, sind die n¨achsten Schritte das Kompilieren, das Kopieren in den ATmega128 Codespeicher und anschließend das Ausf¨ uhren. Daf¨ ur stehen zwei verschiedene Buttons zur Verf¨ ugung: 1. ASSEMBLE: Mit diesem Button wird der Quellcode u ¨bersetzt und alle eventuell noch vorhandenen Fehler angezeigt. Nachdem die letzten Fehler beseitigt wurden, ist der n¨achste Schritt das Beschreiben des ATmega128. 2. ASSEMBLE AND RUN: hier wird der Quellcode kompiliert und auf den ATmega128 geladen.

Abbildung 13: Screenshot AVR Studio

5.4

Debugging

Auch wenn das Programm syntaktisch korrekt ist, k¨onnen sich, gerade bei komplexeren Programmen, Fehler in der Programmstruktur verstecken. Um diese Fehler zu finden, m¨ ussen Sprungrichtungen, Speicherund Registerbelegungen in Abh¨ angigkeit von den auftretenden Eingaben kontrolliert werden. Daf¨ ur bietet das AVR Studio eine ganze Reihe praktischer Funktionen. Die wichtigsten dabei sind: 1. RUN: Startet die Ausf¨ uhrung des Programms auf dem ATmega128. 2. PAUSE: H¨ alt das Programm an. Alle virtuellen Mikrocontollerkomponenten im AVR Studio zeigen die tats¨ achlichen Belegungen im ATmega128 an. 3. RESET: Startet das Programm erneut. Interruptflags, Pointer und der Zustand von Funktionseinheiten werden zur¨ uckgesetzt. 4. STEP INTO: Erh¨ oht den Programmcounter um Eins. Es wird der n¨achste Befehl ausgef¨ uhrt. Mit dieser Schritt f¨ ur Schritt Abarbeitung des Programms wird fremder Code verst¨andlicher und eigener l¨ asst sicher besser auf Fehler untersuchen. 5. RUN TO CURSOR: F¨ uhrt das Programm aus, bis die Befehlszeile erreicht wird, in der sich der Cursor befindet.

15

Abbildung 14: Screenshot AVR Studio Daneben gibt es noch weitere M¨ oglichkeiten zum Debuggen, wie das Setzten von Breakpoints und Tracepoints und mehr. Das wichtigste Feature ist jedoch, dass sich das Programm unterbrechen l¨asst, ohne es zu beenden. Denn sobald das Programm mit PAUSE angehalten wird, k¨onnen alle Registerinhalte und Speicherbereiche ausgelesen und wenn n¨ otig auch ver¨ andert werden. Nachdem die Ver¨anderungen vorgenommen wurde, kann das Programm vom akutellen Befehl an, mit der neuen Speicherbelegung ausgef¨ uhrt werden. Der Programmcounter und nicht ver¨ anderte Register bleiben erhalten. Alternative Sprungrichtungen und Interruptbedingungen k¨ onnen so von Hand“ erzwungen werden, ohne dass ein ausl¨osendes Ereignis ” tats¨ achlich eintreten muss.

16

6

Assemblerprogrammierung

6.1

Warum Assemblerprogrammierung?

Da ein Mikrocontroller oder ein Mikroprozessor a priori kein Wissen dar¨ uber besitzt, welche Aufgabe er erf¨ ullen soll, muss er von einem Menschen dementsprechend programmiert werden. Allerdings ist das nicht so einfach, da der Mikrocontroller lediglich Maschinencode versteht. Bei diesem Maschinencode handelt es sich um eine Folge von Operationen, die in der Befehlssatzarchitektur (ISA1 ) definiert sind, wobei jede Operation bin¨ ar codiert ist. Allerdings ist so eine lange Folge von bin¨aren Zeichen f¨ ur den Menschen nur sehr schwer zu interpretieren, so dass eine Zwischenebene eingef¨ uhrt wurde, die sogenannte Assemblersprache. In der Assemblersprache werden den unterschiedlichen Maschinenbefehlen sogenannte Mnemonics zugeordnet, die f¨ ur den Menschen leichter verst¨andlich sind und einen Hinweis auf die Funktionalit¨ at der Operation geben. Das folgende Beispiel soll die bessere Lesbarkeit von Assembler gegen¨ uber Maschinencode verdeutlichen. Es sollen zwei Zahlen, die in den Registern r2 und r1 gespeichert sind, addiert und anschließend das Ergebnis im Register r2 gespeichert werden. • Assembler: add r2, r1 • Maschinencode: 0000 1100 0010 0001 Durch die Einf¨ uhrung von Hochsprachen, wie zum Beispiel C, C++ oder Java, konnte, von der Assemblersprache ausgehend, noch weiter abstrahiert werden. Trotzdem wird in manchen F¨allen noch immer die Assemblerprogrammierung verwendet, da sie gegen¨ uber Hochsprachen einige Vorteile besitzt. In Assembler geschriebene Programme sind meist deutlich kleiner und laufen schneller, was besonders bei einer leistungsschwachen Hardware mit wenig Speicher wichtig ist. Da das Programmieren in Assembler außerdem eine genaue Kenntnis der Hardware erfordert, k¨onnen hardwarespezifische Sonderfunktionen, die ein automatischer Compiler nur selten oder nie verwenden w¨ urde, zur Optimierung genutzt werden. Diesen Vorteilen stehen allerdings auch einige Nachteile entgegen. So ist es zum Beispiel fast unm¨oglich ein geschriebenes Programm auf eine andere Hardware zu portieren, da es f¨ ur den Einsatz auf der urspr¨ unglichen Hardware optimiert wurde und deshalb große Teile des Programms noch mal neu geschrieben werden m¨ ussten. Außerdem ist es sehr aufw¨andig Assemblerprogramm zu warten, wenn zum Beispiel ein Fehler behoben werden muss oder das Programm um eine neue Funktionalit¨at erweitert werden soll, denn dazu wird viel Wissen dar¨ uber ben¨ otigt, wie das Programm arbeitet. So muss zum Beispiel bekannt sein, welche Register verwendet werden und ob die Registerinhalte sp¨ater noch mal ben¨otigt werden. Ein weiterer Punkt, der f¨ ur den Einsatz von Assembler in diesem Praktikum spricht, ist, dass die Assemblerprogrammierung einen guten Einblick in die Funktionsweise der Hardware gibt.

6.2

Der AVR-Assembler

Der AVR-Assembler umfasst insgesamt 133 unterschiedliche Befehle, wobei die meisten nur einen Taktzyklus zur Ausf¨ uhrung ben¨ otigen. F¨ ur jedes Programm wird der Quellcode, also die Assemblerbefehle und Kommentare, in einer Datei mit der Endung .asm“ gespeichert. Dabei unterscheidet der Assembler nicht ” zwischen Groß- und Kleinschreibung. Nach einer erfolgreichen Kompilierung in Maschinencode, kann dieser in den Codespeicher des Mikrocontrollers u ¨bertragen werden. Sobald der Mikrocontroller mit diesem neuen Programm initialisiert ist, wird der Code sequentiell abgearbeitet, sofern der Programmfluss nicht durch einen Sprung ver¨ andert wird. Außerdem ist zu beachten, dass ein Mikrocontroller immer in einer Endlosschleife arbeitet, d.h. nachdem das Ende des Programms erreicht wurde, beginnt das Programm wieder von neuem. In der Quelldatei darf pro Zeile maximal eine Assembleranweisung stehen. Dabei kann es sich entweder um eine Direktive oder ein Mnemonik handelt. Zus¨atzlich kann die Zeile noch durch einen Kommentar erg¨anzt 1 ISA

: Instruction Set Architecture; Befehlssatzarchitektur

17

werden oder mit einer Sprungmarke beginnen. Eine Sprungmarke endet immer mit einem Doppelpunkt und in einem kompletten Assemblerprojekt d¨ urfen keine Sprungmarken denselben Namen haben, auch nicht, wenn sie in unsterschiedlichen Quelldateien des Projekts stehen. Kommentare werden immer durch ein Semikolon eingeleitet und gelten dann bis zum Ende der Zeile. Daraus ergeben sich dann die folgenden Strukturen f¨ ur eine Zeile2 : [Marke:] .Direktive [Operanden] [; Kommentar] [Marke:] Mnemonik [Operanden] [; Kommentar] [Marke:] [; Kommentar] 6.2.1

Direktive

Direktive werden haupts¨ achlich dazu genutzt, die unterschiedlichen Speicher anzusprechen oder um Makros zu definieren. Direktive beginnen immer mit einem vorangestellten Punkt. Hier ist ein kurze Auswahl der wichtigsten Direktive: • .CSEG Damit wird der Codespeicher (FLASH) ausgew¨ahlt. • .DSEG Damit wird der fl¨ uchtige Datenspeicher (RAM) ausgew¨ahlt. • .ESEG Damit wird der nichtfl¨ uchtige Datenspeicher (EEPROM) ausgew¨ahlt. • .BYTE Dient zur Allokierung von Speichplatz f¨ ur eine Variable. Beispiel: Puffer: .BYTE 24 Durch diese Zeile werden f¨ ur die Variable Puffer“ 24 Byte im Speicher reserviert. ” • .DEF Mit dieser Direktive kann einem Register ein symbolischer Name zugeordnet werden. Beispiel: .DEF temp = r16 Dadurch kann das Register r16 auch u ¨ber den symbolischen Namen temp“ angesprochen werden. ” • .EQU Mit dieser Direktive kann eine Konstante definiert werden. Beispiel: .EQU wartettakte = 10 • .INCLUDE Diese Direktive dient zum Einbinden von weiteren Dateien. Beispiel: .INCLUDE zaehler.asm“ ” An dieser Stelle wird der Inhalt der Datei zaehler.asm“ eingef¨ ugt. ” • .ORG Wenn diese Direktive im Codesegment verwendet wird, dann wird damit der Anfangspunkt des Programms im Programmspeicher festgelegt. Wenn diese Direktive im Datensegment verwendet wird, dann gibt sie die Anfangsposition im Arbeitsspeicher an. Wobei darauf zu achten ist, dass im Codesegment wortweise und im Datensegment byteweise addressiert wird. Beispiel: .CSEG .ORG 0x100 Diese Direktive ist z.B. notwendig, um die Interrupt Service Routinen (ISR) am Programmanfang zu u ¨berspringen. 2 in

Klammern stehende Teile sind optional

18

6.2.2

Mnemoniks

Die Mnemoniks lassen sich grob in vier unterschiedliche Befehlsklassen einteilen: • Arithmetische und Logische Befehle Zu dieser Klasse geh¨ oren die Befehle zum Addieren, Subtrahieren, Multiplizieren, bitweise UNDund ODER-Befehle, usw. • Sprungbefehle Hierzu geh¨ oren bedingte oder unbedingte Spr¨ unge und Unterprogrammaufrufe. • Befehle f¨ ur den Datentransfer Mit diesen Befehlen k¨ onnen Daten in den Speicher geschrieben oder aus diesem geladen werden. Außerdem k¨ onnen Konstanten oder Registerinhalte zwischen Registern verschoben werden, Einund Ausgabeschnittstellen aktiviert und auf den Stack zugegriffen werden. • Befehle, die einzelne Bits von Registern ver¨andern oder testen k¨onnen 6.2.3

Ein Beispielprogramm

Anhand eines einfachen Assemblerprogramms wird jetzt die Funktionsweise der unterschiedlichen Direktiven und Befehle verdeutlicht. Die in Klammern stehenden Zeilennummern geh¨oren dabei nicht zum Programm. Sie wurden eingef¨ ugt, damit die einzelnen Zeilen besser erkl¨art werden k¨onnen. (1).INCLUDE "m128def.inc" (2) (3).ESEG (4) (5) .EQU Wartetakte = 100 ; die Anzahl der Takte, die gewartet werden soll (6) (7).DSEG (8) (9) Puffer: .BYTE 24 ; ein 24 Byte großer Puffer (10) (11).CSEG (12) (13) .ORG 0x100 (14) init: (15) ; der Stackpointer wird initialisiert (16) ldi r16, high(RAMEND) (17) out SPH, r16 (18) ldi r16, low(RAMEND) (19) out SPL, r16 (20) ; Port A wird konfiguriert (21) ldi r16, 0xFF (22) out DDRA, r16 (23) out PORTA, r16 (24) main: (25) ldi r30, low(Puffer) (26) ldi r31, high(Puffer) (27) ldi r17, 24 (28) schleife: (29) ld r16, Z+ (30) out PORTA, r16 (31) dec r17 19

(32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44)

cpi r17, 0 brne schleife call warteschleife jmp main warteschleife: push r17 ldi r17, Wartetakte dec r17 cpi r17, 0 brne warteschleife pop r17 ret

Zuerst wird in der ersten Zeile die Datei 128def.inc“ eingebunden. In dieser sind alle symbolischen Na” men f¨ ur den ATmega128 definiert. Den jeweiligen Speicheradressen wird ein deskriptiver Registernamen zugewiesen. So kann im Quellcode direkt der Name anstelle der Speicheradresse verwendet werden. Das vereinfacht das Programmieren und hat verst¨andlicheren Code zur Folge. In Zeile 5 wird die Konstante mit dem Namen Wartetakte“ und dem Wert 100 definiert. Sie ist im ” EEPROM (siehe Zeile 3) des Mikrocontrollers abgelegt. Danach wird durch Zeile 9 ein 24 Byte großer Bereich im Arbeitsspeicher (siehe Zeile 7) f¨ ur die Variable Puffer“ reserviert. ” Ab Zeile 11 betreffen alle Befehle den Codespeicher. Durch Zeile 13 wird am Anfang des Codespeichers Platz gelassen, z.B. f¨ ur die Interrupt Service Routinen. Mit Hilfe des Codes aus den Zeilen 16 bis 19 wird der Stackpointer initialisiert. Er beginnt am Ende des Arbeitsspeichers (RAMEND) und w¨ achst dann zum Anfang des Arbeitsspeichers hin. Auf den Stack kann u ¨ber die Befehle push“ und pop“ zugegriffen werden. Mit push“ wird ein Registerinhalt als ” ” ” oberstes Element auf dem Stack gespeichert und der Stackpointer inkrementiert, mit pop“ wird das ” oberste Stackelement in ein Register geladen und der Stackpointer dekrementiert. Außerdem dient der Stack als Ablage f¨ ur die R¨ ucksprungadressen bei Unterprogrammaufrufen. Beim Aufruf einer Interrupt Service Routine wird der aktuelle Programmcounter auf dem Stack abgelegt, das entsprechende Unterprogramm ausgef¨ uhrt und anschließend der Programmcounter automatisch wieder vom Stack geladen. Dies ist allerdings nur m¨ oglich, wenn das Unterprogramm die R¨ ucksprungadresse auf dem Stack nicht zerst¨ ort“. Das heißt, dass das oberste Stackelement am Anfang des Unterprogramms auch das oberste ” Stackelement am Ende des Unterprogramms sein muss. Da der Stackpointer 16 Bit umfasst, besteht er aus zwei 8 Bit Registern. Das SPL-Register enth¨alt den unteren Teil des Stackpointers und das SPH-Register enth¨alt den oberen Teil. Die Zeilen 21 bis 23 dienen zur Konfiguration des Ports A. Eine genauere Beschreibung der Port-Register befindet sich im Handbuch zum ATmega 128. Das Hauptprogramm umfasst die Zeilen 25 bis 35. Nach einer vollst¨andigen Abarbeitung, beginnt das Hauptprogramm wieder von vorne (siehe Zeile 35). Es dient zur Ausgabe des Inhalts der Variable Puf” fer“ auf Port A. Nachdem alle 24 Byte ausgegeben wurden, wird das Unterprogramm Warteschleife“ ” aufgerufen. Im Unterprogramm wird der Inhalt des Registers r17 anfangs auf dem Stack kopiert (Zeile 38) und zum Ende wird dieser alte Registerinhalt wieder vom Stack geladen (Zeile 43). Somit wird auch in Zeile 44 die korrekte R¨ ucksprungadresse vom Stack geholt. F¨ ur die bedingten Spr¨ unge in den Zeilen 33 und 42 werden bestimmte Bits des Statusregisters des Mikrocontrollers ausgewertet. Abh¨ angig von diesem Ergebnis wird der Sprung genommen oder nicht. Weitere Informationen zum AVR-Assembler finden Sie im Handbuch zum ATmega 128 und im AVR Studio bei Assembler Help“ unter dem Men¨ upunkt Help“. ” ”

20

7 7.1

Versuchsu ¨ bersicht Theorie- und Praxisaufgaben

In manchen Versuchen gibt es Theorie- und Praxisaufgaben. Die gesamten Versuchsbeschreibungen sollen vor den jeweiligen Terminen gelesen werden. Die Theorieaufgabe sind als Vorbereitung bereits vor dem Praktikumstermin zu l¨ osen. Das AVR-Studio steht als Download zur Verf¨ ugung. Dank eines integriertem Simulators k¨onnen Assemblerprogramme auch ohne STK500 zu Hause entworfen und getestet werden. Es steht den Studenten frei ihre Programme zu Hause zu entwickeln. Trotzdem m¨ ussen s¨amtliche Aufgaben zu den Praktikumsterminen vorgef¨ uhrt und der Quelltext erl¨ autert werden.

7.2

Versuchsaufbau

Die Aufgaben sind nach ihrem Inhalt und ben¨otigten Vorkenntnissen sortiert. Die einzelnen Versuche weichen in ihrem Umfang und der Anzahl an Aufgaben voneinander ab. Je nach Vorbereitung kann die L¨ osung eines Versuchs mehrere Termine ben¨otigen. F¨ ur 4 Versuche stehen 6 Termine zur Verf¨ ugung an denen die Studenten ihre L¨ osungen vorf¨ uhren m¨ ussen. Die ersten beiden Versuche legen allgemeine Grundlagen in den Bereichen Assemblerprogrammierung und einfachen Mikrocontrollerkomponenten, die letzen beiden Versuche besch¨ aftigen sich mit komplexeren Komponenten. Insgesamt stellt der Inhalt dieses Bachelor ES-Praktikum eine Vorbereitung f¨ ur die Versuche im sp¨ateren Master ES-Praktikum dar.

7.3

Versuch 1

Ziel des ersten Versuchs ist es die Arbeitsumgebung, speziell das AVR Studio und das STK500, kennenzulernen und erste Erfahrungen mit der Assemblerprogrammeirung zu sammeln. Dazu soll zu Anfang ein vorgegebenes Assemblerprogramm verbessert, ausgef¨ uhrt und analysiert werden. Anschließend sollen weitere simple Assemblerprogramme zur Ansteuerung einfacher Peripheriefunktionen eigenst¨andig entwickelt werden.

7.4

Versuch 2

Im zweiten Versuch soll die grundlegende Funktionsweise und die wichtigsten Einheiten eines Microcontrollers kennengelernt werden. Neben der Funktionsweise von Z¨ahler/Zeitgebern steht die Entwicklung von Interrupt Service Routinen (kurz ISR) und deren Einbinden in das Hauptprogramm im Vordergund.

7.5

Versuch 3

Im dritten Versuch steht eine weitere Schnittstelle des ATmega128 im Vordergund, der USART. Ziel des ¨ ein ein Versuchs ist es, den Mikrocontroller um eine zus¨atzliche Eingabem¨oglichkeit zu erweitern. Uber Terminalprogramm (z.B. HyperTerminal) sollen Tastaturkommandos von einem PC u ¨ber den COM Port an die serielle Schnittstelle (USART) des ATmega u ¨bermittelt werden.

7.6

Versuch 4

Im vierten Versuch steht das Zusammenspiel aus Z¨ahlern/Zeitgebern, Interrupt Service Routinen und Ein-/Ausgaben im Vordergrund. Aufbauend auf dem zweiten und dritten Versuch werden aufwendigere Programme und komplexere Modi der Funktionseinheiten in den Aufgaben behandelt. Spannungsgesteuerte Helligkeitsanpassung der LEDs sowie deren Steuerung u ¨ber ein Terminalprogramm nehmen dabei eine zentrale Rolle ein.

21

8

Versuch 1

8.1 8.1.1

Inhalt Ziel

Ziel des ersten Versuchs ist es die Arbeitsumgebung, speziell das AVR Studio und das STK500, kennenzulernen. Anschließend werden erste Schritte in der Asemblerprogrammierung unternommen. Dazu soll ein vorgegebenes Assemblerprogramm eingebunden, korrigiert und anschließend ausgef¨ uhrt werden. Anschließend sind selbst¨ andig kleinere Erweiterungen am Quellcode vorzunehmen. Der Versuch ist erfolgreich abgeschlossen, wenn die Assemblerprogramme die vorgegebene Peripherieschaltung des Praktikumsboard in gew¨ unschter Weise steuern. 8.1.2

Material zur Hardware

Der Inhalt s¨amtlicher Einf¨ uhrungskapitel des Praktikumshandbuch werden vorausgesetzt. Zus¨atzlich ist zur Vorbereitung auf den ersten Versuch das Kapitel I/O Ports/Configuring the Pin“im ATme” ga128 Handbuch wichtig. Weiteres Material zum STK500 findet sich in der Hilfe des AVR Studio. 8.1.3

Material zur Assemblerprogrammierung

In den Einf¨ uhrungskapiteln des Praktikumshandbuch wird der prinzipielle Aufbau das Assemblercodes und Beispielprogramme vorgestellt. Im ATmega128 Handbuch im Kapitel Instruction Set Summa” ry“steht eine Kurz¨ ubersicht u ugung. Zus¨atzlich steht im AVR Studio ¨ber alle Assemblerbefehle zur Verf¨ unter Help/Assembler Help“eine Kurzanleitung zum Befehlsatz. ” Eine ausf¨ uhrliche Dokumentation des Assembler Befehlssatz finden Sie im Atmel Handbuch zum AVR 8-bit Instruction Set.

8.2

Theorie- und Praxisaufgaben

Die Theorieaufgabe sind bereits als Vorbereitung auf den Praktikumstermin zu l¨osen. Das AVR-Studio steht als Download zur Verf¨ ugung. Dank eines integriertem Simulators k¨onnen auch ohne STK500 Hardware die Assemblerprogramme zu Hause entworfen und getestet werden. Es steht den Studenten frei ihre Programme zu Hause zu entwickeln. Trotzdem m¨ ussen s¨amtliche Aufgaben zu den Praktikumsterminen vorgef¨ uhrt und der Quelltext erl¨ autert werden.

8.3

Aufgabe 1.1

Als erstes muss das AVR Studio gestartet werden, um ein neues Projekt anzulegen. Alle wichtigen Informationen daf¨ ur finden Sie im Kapitel Praktikumsumgebung. Besonders ist darauf zu achten, dass als Projekttyp die Einstellung Assemblerprojekt ausgew¨ahlt werden muss. Anschließend soll das folgende Programm eingegeben und kompiliert werden. .include m128def.inc“ ” .DSEG .CSEG .org 0x100 init: ldi r16, 0xfff out PORTD, r16

22

out DDRB, r16 out PORTB, r16 main: in r16, PIND out PORTB, r16 jmp main

8.4

Aufgabe 1.2

Beim Kompilieren taucht eine Fehlermeldung auf. • Was bedeutet diese Fehlermeldung? • Antwort:

• Welche Schritte werden w¨ ahrend der Initialisierung (Abschnitt init) durchgef¨ uhrt? • Antwort:

¨ Andern Sie das Programm so ab, dass es fehlerfrei kompiliert werden kann. Tragen Sie anschließend in den Programmcode Kommentare zu den einzelnen Anweisungen ein.

8.5

Aufgabe 1.3

Nachdem das Programm lauff¨ ahig ist, muss die Periperie an die richtigen Ports angeschlossen werden. An Port D sollen die Taster angeschlossen werden, an Port B die LEDs. Nehmen Sie die ben¨otigten Anschl¨ usse vor und lassen Sie es dann vom Tutor u ufen. ¨berpr¨ Hinweis: Erkl¨ arungen der Portanschl¨ usse und Beispielschaltungen stehen im Kapitel Praktikumsboard“. ” • Welche Funktion hat der main Abschnitt? • Antwort:

• Eine Abfrage der Taster k¨ onnte beispielsweise durch einen Z¨ahlerinterrupt ausgel¨ost werden. In dem Programm aus Aufgabe 1.1 werden die Taster aber in einer Endlosschleife st¨andig abgefragt. Wie nennt man dieses Verfahren? • Antwort:

Verbinden Sie den JTAG-ICE mit dem Rechner und dem STK500. Programmieren Sie anschließend den ATmega128 und f¨ uhren Sie das Programm vor. 23

8.6

Aufgabe 1.4

Erweitern sie die main Routine so, dass nur noch jeder zweite Taster LEDs anschaltet. Benutzen Sie dazu ein Maskenregister und Logikoperationen wie AND, OR oder XOR.

8.7

Aufgabe 1.5

Gegeben sei folgendes Programmverhalten: Alle LEDs sind w¨ahrend der Initialisierung angeschaltet und wechseln durch Dr¨ ucken des jeweiligen Tasters ihren Zustand (an/aus). Entwerfen Sie das entsprechende Assemblerprogramm.

8.8

Aufgabe 1.6

Als n¨ achster Schritt sollen die Taster 1,3,5 und 7 jeweils die LEDS 1&2, 3&4, 5&6 und 7&8 an-/ausschalten. Zus¨ atzlich zu den bisherigen Logikoperatoren ist es in dieser Aufgabe sinnvoll Shift Operationen zu verwenden. Shiften entspricht im Bin¨ arsystem dem Multiplizieren und Dividieren mit zwei.

8.9

Aufgabe 1.7

Als n¨ achster Schritt sollen die Taster 1 bis 4 jeweils die LEDS 1&2, 3&4, 5&6 und 7&8 an-/ausschalten. Sie d¨ urfen beim Abfragen der Tasterstellungen davon ausgehen, dass zu einem beliebigem Zeitpunkt jeweils nur ein Taster gedr¨ uckt ist. Hinweis: Anstatt einzelne Bits zu u ufen k¨onnen auch gr¨oßer/kleiner ¨berpr¨ Vergleiche mit 2er Potenzen durchgef¨ uhrt werden.

24

9

Versuch 2

9.1

Inhalt

Im zweiten Versuch sollen die wichtigsten Einheiten eines Mikrocontrollers kennengelernt werden. Neben der Funktionsweise von Z¨ ahler/Zeitgebern steht die Entwicklung von Interruptserviceroutinen (kurz ISR) und deren Einbinden in das Hauptprogramm im Vordergrund. Als Ergebnis sollen Programme zur zyklischen Ausgabesteuerung und zum Entprellen der Taster entstehen.

9.2

Interrupte (Theorieaufgabe)

Zur Vorbereitung der ersten Aufgaben des zweiten Versuchs sind die Kapitel AVR CPU Core“, In” ” terrups“und external Interrups“im ATmega128 Handbuch zu lesen. Beantworten Sie danach folgende ” Fragen schriftlich: • Welche Adresse wird nach dem Starten oder einem Reset angesprungen? • Wieviel Speicherplatz liegt zwischen zwei benachbarten Interruptadressen? • Welche Befehle k¨ onnen sinnvoll im Adressbereich 0x00 - 0x44 vorkommen? • Mit welchen Befehlen werden alle Interrupte ein-/ausgeschaltet? • Auf welchen Speicherbereich wird der Stackpointer im Beispielprogramm aus Kapitel 6 gesetzt? • Mit welchen Befehlen wird auf den Stack zugegriffen. • Ist die Datenstruktur des Stack ein FIFO Speicher? • Beschreiben Sie den Programmablauf eines Interrupts. Erl¨autern Sie dabei die Funktion des Stackpointers, die Werte des Programmcounters und den Status der Interrupt Flags.

• Wof¨ ur wird der Befehl reti ben¨ otigt? • In welchem Fall kann auf einen Sprungbefehl an (nicht zu!) Adresse 0x00 verzichtet werden? • Falls im Main Abschnitt bedingte Sprungbefehle verwendet werden, muss zu Beginn der ISR ein Register vom Programmierer im Stack gesichert, und vor Beenden der ISR wieder geladen werden. Welches Regsiter?

25

9.3

Aufgabe 2.1

Welche Funktion hat folgendes Programm: .include m128def.inc“ ” .DSEG .CSEG .org 0x00 jmp init .org 0x04 reti .org 0x08 jmp taster2 .org 0x100 init: cli mov r16, 0x0a out EICRA, r16 out EIMSK, r16 sei main: nop jmp main taster2: reti

9.4

Aufgabe 2.2

Schreiben Sie ein Assemblerprogramm mit folgenden Eigenschaften: • Es sollen vier externe Interrupte eingebunden werden. • Die Kontaktleiste der Taster soll mit Port D verbunden werden (siehe ATmegahandbuch Seite 2). • Mit den LEDs soll eine Bin¨ arzahl angezeigt werden. • Die main Routine soll nur aus einer Ausgabe Schleife bestehen. • Mit einem der Taster soll die Bin¨ arzahl um eins, mit einem weiteren Taster um zwei erh¨oht werden. Der dritte Taster soll die Bin¨ arzahl um eins dekrementieren und der vierte Taster die Zahl verdoppeln. Die ben¨ otigten Rechenoperationen sollen in den ISRs ausgef¨ uhrt werden.

9.5

Aufgabe 2.3

Im n¨ achsten Assemblerprogramm soll ein LED-Muster einmal pro Sekunde ringf¨ormig nach links geschiftet werden. Daf¨ ur soll kein Z¨ ahler-/Zeitgeber verwendet werden, sondern eine Schleife im main“ ” Abschnitt. Ber¨ ucksichtigen Sie dabei die MHz Zahl des Atmega128, die Prozessorzyklen pro Befehl und die Schleifenl¨ ange.

9.6

Aufgabe 2.4

Erweitern sie das Programm aus Aufgabe 2.3 so, dass ein Taster den Shiftvorgang anhalten und auch wieder freigeben kann.

26

9.7

Z¨ ahler-/Zeitgeber (Theorieaufgabe)

Informieren Sie sich im ATmega128 Handbuch u ¨ber die Funktionsweise und die verschiedenen Modi der Z¨ ahler/Zeitgebereinheiten und beantworten Sie folgende Fragen schriftlich: • Beim ATmega128 stehen vier Z¨ ahler-/Zeitgebereinheiten zur Verf¨ ugung. Zwei davon als 8 Bit Einheiten, zwei weitere als 16 Bit Einheiten. Was ist mit der Bezeichnung 8 Bit bzw 16 Bit gemeint? • Antwort:

F¨ ur die Initialisierung und Konfiguration der Z¨ahler-/Zeitgebereinheiten sind f¨ unf Register besonders wichtig: OCRx, TCNTx, TCCRx, TIFR und TIMSKp. Wof¨ ur stehen diese Abk¨ urzungen und was sind die Aufgaben der Register? • OCRx:

• TCNTx:

• TCCRx:

• TIFR:

• TIMSK:

Beim Einsatz der Z¨ ahler/Zeitgebereinheiten lassen sich drei wichtige Modi unterscheiden. Erkl¨aren Sie kurz die Eigenschaften (Anzahl und Zeitpunkt der Interrupte, Zyklendauer, etc.): • Normaler Modus:

• CTC Modus:

27

• fast PWM Modus:

• Im ATmega128 Handbuch sind die beiden Begriffe MAX -Wert und TOP -Wert definiert. Was ist der Unterschied? Geben Sie ein kurzes Beispiel.

Im normalen Modus der Z¨ ahler/Zeitgebereinheiten gibt es mehre Faktoren welche die Frequenz/Periode beeinflussen. Nennen Sie drei M¨ oglichkeiten die Periode des Timer Overflow Interrupt zu beeinflussen. • Erstens: • Zweitens: • Drittens:

9.8

Aufgabe 2.5

Schreiben Sie ein Programm f¨ ur Z¨ ahler/Zeitgebereinheit 0, das eine Stoppuhr mit Zehntelsekunden, Sekunden- und Minutenanzeige umsetzt. Die Ausgabe f¨ ur die Anzeigen soll an zwei Ports im BCD Format erfolgen. Als zus¨ atzliche Hardware wird eine vierstellige 7-Segmentanzeige an die beiden Ports angeschlossen.

9.9

Aufgabe 2.6

Erweitern Sie das Programm aus Aufgabe 2.5 um zwei externen Taster. Einer soll die Stoppuhr zur¨ ucksetzen, der andere anhalten bzw. weiterlaufen lassen.

9.10

Aufgabe 2.7

Bei dem Praktikumsboard kommt es vor, dass ein einmaliges Dr¨ ucken des Tasters mehrfache erkannt wird. Ein sinnvolles Unterprogramm f¨ ur verschiedene Anwendungen w¨are die Interruptroutinen der Taster so zu ¨ andern, dass sie nach einer Aktivierung f¨ ur mehrere Millisekunden gesperrt sind. Die einfachste L¨ osung ist ein wechselseitiges Sperren/Freigeben der Interruptservice Routinen von Taster und Z¨ ahler: • Beim Ausl¨ osen des Tasters wird die dazugeh¨orige Aktion ausgef¨ uhrt. Danach sperrt sich die TasterISR selbst, gibt die Z¨ ahler-ISR frei und setzt den Z¨ahlerstand zur¨ uck. Anschließend wird die Taster ISR mit reti verlassen. • Aufgabe der Z¨ ahler-ISR ist es, die Taster ISRs f¨ ur eine gewisse Sperrzeit zu blocken. Dazu muss ¨ ein Uberlauf mit der Periode der Sperrzeit generiert und abgefangen werden. Anschließend muss die Taster ISR wieder freigegeben werden und sich die Z¨ahler-ISR selbst sperren. • Das Sperren und Freigeben der jeweiligen ISRs hat u ¨ber die einzelnen Interruptfreigaberegister zu erfolgen. W¨ ahrend das globale Interruptflag Interrupte nur insgesamt an- und abschalten kann,

28

wird im jeweiligen globalen Interrupt Mask Register entschieden ob das zugeh¨orige Interrupt Flag ausgewertet wird oder nicht. Das Interrupt Flag selbst wird automatisch von der Hardware gesetzt. Das jeweilige Interrupt Mask Register, z.B. Timer/Counter Interrupt Mask Register (TIMSK) oder External Interrupt ¨ Mask Register (EIMSK) wird vom Programmierer gesetzt. Uber das globale Interruptflag lassen sich in sensiblen Codeabschnitten Interrupte generell abschalten. Erweitern Sie das Programm aus Aufgabe 2.6 so, dass die Taster wie oben beschrieben f¨ ur zwei Sekunden gesperrt werden. Hinweis: Bei der Verwendung einer 8 Bit Z¨ahlereinheit und einer Sperrzeit von zwei Sekunde m¨ ussen Sie die Z¨ ahlerbreite mit einem Hilfsregister erweitern. Frage: Warum sollte nicht einfach eine Warteschleife von zwei Sekunden direkt in die ISR des Tasters integriert werden?

29

10 10.1

Versuch 3 Inhalt

Im dritten Versuch steht eine weitere Schnittstelle des ATmega128 im Vordergrund, der USART. Ziel des Versuchs ist es die Assemblerprogramme um eine interaktive Eingabe zu erweitern. Zu diesem Zweck werden von einem PC u ¨ber ein Terminalprogramm (HyperTerminal) Tastaturkommandos u ¨ber den COM Port an die serielle Schnittstelle des ATmega u ¨bermittelt. Wichtige Parameter zur Konfiguration der Bau¨ drate und des Ubertragungsprotokoll sind im Einf¨ uhrungskapitel Das Terminal Programm“ erl¨autert. ” Die Konfigurationsregister und Betriebsmodi werden im Kapitel USART“ des ATmega128 Handbuchs ” erkl¨ art. Die beiden Kapitel Das Terminal Programm“ im Praktikumshandbuch und USART“ im AT” ” megahandbuch sind f¨ ur das Praktikum vorzubereiten.

10.2

Ausgabe 3.1

Beantworten Sie folgende Fragen: • Welche Einstellungen m¨ ussen im UBRRH und UBRRL Register gespeichert? • Von welchen Parametern h¨ angt diese Einstellung ab? • Wird auf das Kontrollregister UCSRnA schreibend oder lesend zugegriffen? ¨ • In welchem Register werden die Einzelheiten des Ubertragungsprotokolls festgelegt?

10.3

Ausgabe 3.2

Ziel des ersten Testprogramms mit Einbindung der USART Schnittstelle ist es die Eingabe des Terminalprogramms abzurufen, die Hexdecodierung der Eingabe mit dem Befehl inc um eins zu erh¨ohen und anschließend an das Terminalprogramm zur¨ uckzuschicken. Die am USART ankommenden Pakete sollen durch Polling abgefragt werden. Das korrekte Senden der Antwort soll ebenfalls in einer Schleife u uft ¨berpr¨ werden. Das Programm l¨ asst sich also in drei Teile gliedern: • Konfigurieren und Initialisieren der UART-Einheit • Polling auf ankommende Daten • Antwort generieren, senden und u ufen ¨berpr¨

10.4

Ausgabe 3.3

Um die Kommunikation u ¨ber die UART-Schnittstelle auch in anderen Programmen verwenden zu k¨onnen, muss das Programm abge¨ andert werden, da das Polling weitere Programminhalte verhindert. Machen Sie sich mit den ISRs des UART vertraut und ersetzen Sie die Pollingroutinen in dem Programm aus Aufgabe 3.2.

10.5

Ausgabe 3.4

¨ ¨ Andern Sie Programm 2.2 ab, so dass anstatt den Taster-ISR die Anderungen der LED Ausgabe durch verschiedene Kommandos u ¨ber das HyperTerminal erfolgen.

30

11 11.1

Versuch 4 Inhalt

Im vierten Versuch sollen weitere Z¨ ahlermodi untersucht werden und das Zusammenspiel aus Z¨ahlern/Zeitgebern, ISRs und Ein-/Ausgaben besser kennengelernt werden.

11.2

Das PWM Verfahren (Theorieaufgabe)

In dieser Aufgabe sollen die LEDs auf dem Praktikumsboard unterschiedlich helle Muster ausgeben. Die Helligkeit einer LED h¨ angt dabei von der angelegten Spannung ab. Bei der Helligkeitsregelung im Praktikum gibt es aber ein Problem. Der Ausgabepegel an den Ports kann nur zwei Werte annehmen: 0 Volt bei einer Eins im Ausgaberegister und 5 Volt bei einer Null. Die Helligkeitsdimmung ist u ¨ber Puls Weiten Modulation trotzdem m¨ oglich. Das Prinzip ist einfach: Innerhalb einer festen Periode der Dauer c liegt f¨ ur eine bestimmte Zeit a die Eins am Ausgang. Beim Erreichen des fest eingestellten Vergleichswert v schaltet die Ausgabe um und es liegt f¨ ur den Rest der Periode (b = c − a) die Null am Portausgang. Durch das Verh¨altnis von a zu b liegt dabei innerhalb eines Zyklus im Mittel ein Wert zwischen 5 und 0 Volt an. Wenn die Zyklusdauer im Sekundenbereich liegt blinkt die LED. Wird die Zykluszeit kleiner gew¨ahlt flackert sie. Ist die Zyklusdauer jedoch klein genug, zum Beispiel im ms Bereich, nimmt das Menschliche Auge kein Flimmern war, sondern lediglich die abgestufte Helligkeit.

Bei dieser Abbildung steht m f¨ ur den Z¨ ahlermaxwert und v f¨ ur den Vergleichswert. Die Dauer von c bestimmt die Zykluszeit. An der Markierung i1 erreicht der Z¨ahlerwert (der linear ansteigende Graph) den Vergleichswert v. Jetzt wird von der Z¨ahler-/Zeitgebereinheit der Compareinterrupt (i1) ausgel¨ost. Erreicht der Z¨ ahlerwert sein Maximum m wird der Overflowinterrupt (i2) ausgel¨ost und der Z¨ahlerwert auf Null zur¨ uckgesetzt. Werden in den ISRs von i1 und i2 unterschiedliche Werte an den Ports ausgegeben, entsteht nach dem oben beschriebenen Verfahren ein Durchschnittswert als gemittelte Ausgabe. Entscheident dabei ist, dass • die Zykluszeit c kurz genug ist, • die Z¨ ahlerbreite die Abstufungen des m¨oglichen Ausgabewerts bestimmt, • und das Verh¨ altnis von m zu v (beachte die lineare Abh¨angigkeit zu a und b) den mittleren Ausgabewert bestimmt.

31

Die Zyklusdauer bestimmt die zeitliche Aufl¨osung (z.B flackern bei LED einer Ansteuerung oder stottern bei einer Motorsteuerung). Die Z¨ ahlerbreite hingegen bestimmt die Aufl¨osung der Werte die angenommen werden k¨ onnen (Anzahl der verschiedenen Ausgabewerte zwischen 0 und 5 Volt bei der LED Ansteuerung). Bei fester Frequenz des Z¨ ahlers verlangsamt ein hoher Maxwert allerdings auch die Zykluszeit. Eine weitere Besonderheit bei der LED Ansteuerung besteht darin, dass die maximale Helligkeit bereits bei unter 5 Volt erreicht wird. Liegt f¨ ur mehr als 2/3 der Periodendauer eine Null am Ausgabeport, ist die maximale Helligkeit erreicht. • Bei einer Periodendauer von 128 Takten; wie lange muss eine Eins ausgegeben werden, um eine mittlere Ausgangsspannung von ca. 3 Volt zu erreichen? - Anzahl der Takte: • Wie viele Takte braucht man bei einer Z¨ahlerbreite von 16 Bit? - Anzahl der Takte: • Was f¨ allt bei dem Vergleich mit dem vorherigem Ergebnis auf? • Wie heißt der Fehler der zu dieser Abweichung f¨ uhrt? -

11.3

Die PWM beim ATmega

Die Funktion des PWM-Modus l¨ asst sich auch in Software realisieren. Dazu m¨ ussen bei dem Z¨ahler der ¨ Uberlaufund Vergleichsinterrupt abgefangen werden, um die Ausgabe zu steuern. Der Wert im Vergleichsregister bestimmt den Abstand zwischen den beiden ISRs innerhalb eines Zyklus. Die Pulsweitenmodulation im Hardwaremodus hat den Vorteil, dass die Pegelausgabe ohne Aufruf einer ISR geschieht. Es kann als nicht zu Verz¨ ogerungen durch andere ISR kommen. Die Softwareemulation des PWM-Verfahrens bietet aber einen entscheidenden Vorteil: Im Hardwaremodus gibt der Z¨ ahler den Pegel nur an einem einzelnen, nicht ver¨anderbaren Pins aus (siehe ATmegahandbuch Seite 2). Welche Aktionen bei der Software-PWM ausgef¨ uhrt werden, ist frei w¨ahlbar/programmierbar. Nat¨ urlich l¨ asst sich die Softwareemulation auch komplett ohne Z¨ahler-/Zeitgebereinheit programmieren, indem man die ben¨ otigten Unterprogramme im Hauptprogramm aufruft und nicht in den ISRs. Hinweis:Beachten Sie bei der Verwendung der 16 bit Z¨ahler-/Zeitgeber besonders das Kapitel Accessing ” 16-bit Registers“im Atmega128 Handbuch.

11.4

Aufgabe 4.1

PWM ganz simpel: Schreiben Sie ein kurzes Programm ohne ISRs das alle LEDs mit gerader Nummer ganz hell und alle LEDs mit ungerader Nummer gedimmt ansteuert. Die Ansteuerung soll in der main Schleife geschehen.

11.5

Aufgabe 4.2

Ver¨ andern Sie die main Schleife so, dass jede der LEDs eine andere Helligkeit hat. Z¨ahler-/Zeitgebereinheiten werden weiterhin nicht ben¨ otigt, wohl aber der shift Befehl.

11.6

Aufgabe 4.3

Ein Nachteil der beiden vorherigen Programme ist es, dass sie im Vordergund laufen und keine anderen Funktionen mehr vom ATmega ausgef¨ uhrt werden k¨onnen. Schreiben sie ein neues Programm, bei dem die PWM Funktionalit¨at von den ISRs u ¨bernommen wird. 32

11.7

Aufgabe 4.4

Erweitern Sie Ihr Programm aus Aufgabe 4.3 um einen weiteren Z¨ahler, der die LEDs kontinuierlich heller werden l¨ asst. Ist die maximale Helligkeit erreicht sollen die LEDs abgeschaltet werden und das Programm neu beginnen.

11.8

Aufgabe 4.5

Erweitern Sie Ihr Programm aus Aufgabe 4.4 indem Sie die USART Schnittstelle miteinbeziehen. Fangen Sie vier verschiedene Befehle aus den Terminaleingaben ab um • mit Befehl 1 die LEDs ihre Helligkeit schneller wechseln zu lassen. Je h¨aufiger der Befehl eingegeben wird, desto schneller sollen die LEDs ihre Helligkeit ¨andern. • mit Befehl 2 sollen die LEDs ihre Helligkeit langsamer wechseln. Je h¨aufiger der Befehl eingegeben wird, desto langsamer sollen die LEDs ihre Helligkeit wechseln. • mit dem dritten Befehl sollen die LEDs in ihrer aktuellen Helligkeit eingefroren werden. Wird der Befehl ein zweites mal gesendet, sollen sie mit ihrer alten Geschwindigkeit wieder die Helligkeit wechseln. • mit Befehl 4 soll die Richtung der Helligkeits¨anderung umgekehrt werden. Wurden die LEDs bisher heller, sollen sie jetzt dunkler werden. Sobald sie ausgehen, sollen sie auf maximale Helligkeit zur¨ uckgesetzt werden. Wurden die LEDs bisher dunkler, sollen sie jetzt heller werden. Sobald sie maximal hell sind, sollen sie ausgeschaltet werden und dann wieder kontinuierlich heller werden.

33