Die Aufgabenstellung des Assignments ist es, eine Applikation für die Ansteuerung eines LED-Boards mit diversen Funktionalitäten zu realisieren. Zusätzlich wird mittels selbstentwickelter HALs auf die Hardware eines ATmega328P zugegriffen und Ansteuerungsfunktionen zur Verfügung gestellt.
Das Nutzen eines Hardware-Abstraction-Layers (HAL) ermöglicht dem Softwareentwickler mehr Komfort bei der Verwendung der Hardware eines Systems. Der direkte Hardwarezugriff wird hinter einer Art „Maske“ verschleiert und es stehen dem Softwareentwickler vereinfachte Befehle zu Verfügung, mit der er die Hardware in einer Applikation einbindet.
Das strikte Trennen der Abstraktionsschichten ermöglicht eine hohe Flexibilität und Portabilität. Bei Hardwareänderungen muss lediglich die HAL auf die Hardware angepasst werden. Die Anwendungssoftware ist vollständig von der Hardware entkoppelt.
Inhaltsverzeichnis
Abkürzungsverzeichnis
1. Einleitung
1.1 Aufgabenstellung
1.2 Ziele
2. Grundlagen
2.1 Mikrocontroller vs Personal-Computer
2.2 Softwarearchitektur
2.3 Applikation
2.4 Hardwareabstraktionsschicht
2.5 Die Programmiersprache C
3. Hardware-Architektur pC ATmega328P
3.1 General-Purpose Input/Output
3.2 Timer
3.3 Analogkomparator
3.4 Analog Digitalwandler
3.5 I/O Multiplexing
3.6 Central Prozess Unit
3.7 Speicher
3.7.1 SRAM
3.7.2 EEPROM
3.7.3 Flash
4.0 Hochladen der Software
4.1 Kompilieren
4.2 Flashen eines Mikrocontrollers
4.3 Bootloader
5. Praxis - Projekt LED-Applikation
5.1 Gliederung und Aufbau der Layer
5.2 Applikation- main.c
5.3 Design des Hardware-Abstraction-Layers LED.h
5.4 Design des Hardware-Abstraction-Layers GPIO.h
5.5 Design des Hardware-Abstraction-Layers _UART.h
5.6 Dokumentation Doxygen
5.7 Bedienoberfläche Processing
5.8 Ergebnis
6.0 FazitundAusbick
6.1 Fazit
6.2 Ausblick
Literaturverzeichnis
Anhang
Anhangsverzeichnis
Abbildungsverzeichnis
Abbildung 1: Vereinfachte Architektur
Abbildung 2: Auswahl unterschiedlicher Hardware auf der Arduino IDE
Abbildung 3: Schematischer Aufbau des Multiplexverfahrens
Abbildung 4: Ausschnitt aus der Datei: CAN40.map- Projekt LED-Applikation
Abbildung 5: Softwarearchitektur LED-Applikation
Abbildung 6: Sicht des Anwenders
Abbildung 7: AVR-Mikrocontrollervergleich [16]
Abkürzungsverzeichnis
Abbildung in dieser Leseprobe nicht enthalten
1. Einleitung
Das Nutzen eines Hardware-Abstraction-Layers (HAL) ermöglicht dem Softwareentwickler mehr Komfort bei der Verwendung der Hardware eines Systems. Der direkte Hardwarezugriff wird hinter einer Art „Maske“ verschleiert und es stehen dem Softwareentwickler vereinfachte Befehle zu Verfügung, mit der er die Hardware in einer Applikation einbindet.
Das strikte Trennen der Abstraktionsschichten ermöglicht eine hohe Flexibilität und Portabilität. Bei Hardwareänderungen muss lediglich die HAL auf die Hardware angepasst werden. Die Anwendungssoftware ist vollständig von der Hardware entkoppelt.
1.1 Aufgabenstellung
Eine Applikation für die Ansteuerung eines LED-Boards mit diversen Funktionalitäten realisieren. Zusätzlich wird mittels selbstentwickelter HALs auf die Hardware eines ATmega328P zugegriffen und Ansteuerungsfunktionen zur Verfügung gestellt.
1.2 Ziele
Im ersten Teil dieser Arbeit wird zunächst näher auf die Einbettung der diversen Schichten von der Benutzeroberflächen-Software bis zur Interaktion mit der Umwelt mittels Aktoren und Sensoren eingegangen. Auch Grundlegendes wie die Unterschiede eines Personal Computers und eines Embedded System werden näher beschrieben. Der zweite Teil der Arbeit beschäftigt sich dem Mikrocontroller ATmega328P. Hierbei werden die einzelnen Hardwarekomponenten beschrieben. Anhand dessen Beschreibung ist eine Adaption auch auf andere Mikrocontroller möglich. Die Übertragung von der Software zur Hardware mittels der avr-gcc wird analysiert und dargestellt. Im Anschluss wird in der Arbeit die Entwicklung von drei HALs für ein ATmega328P und ein LED-Board beschrieben. Diese HALs werden in die LED-Applikation inkludiert und verwendet. Die Hardwarekomponenten werden auf Funktion getestet und der Programmablauf wird optimiert. Hierzu wird die Hochsprache C verwendet. Im Programmcode werden zudem ausführliche Kommentare zur verbesserten Nachvollziehbarkeit beigefügt. Außerdem wird eine Bedienoberfläche für die Steuerung des LEDs mittels der IDE Processing bereitgestellt. Die Funktionalität wird abschließend überprüft, in dem das Programm kompiliert und in ein ATmega328P geladen wird.
2. Grundlagen
2.1 Mikrocontroller vs Personal-Computer
Elementare Unterschiede zwischen eingebetteten Systemen und PC-Systemen liegen in deren Anwendungsgebieten. Dennoch beruhen beide Systeme auf dem EVA-Prinzip.
Die eingebetteten Systeme werden vor allem in Geräten eingesetzt, bei denen es weniger auf Geschwindigkeit, sondern mehr auf Effizienz ankommt. Der Mikrocontroller ist in technischen Umgebungen eingebettet, wie z.B. Haushaltgeräten oder Fernbedingungen. Ein Mikrocontroller ist eine kleine Recheneinheit und speziell auf seine einfachen Aufgaben wie das Steuern, dem Regeln oder der Datenverarbeitung angepasst.
Ein Betriebssystem befindet sich auf dem Mikrocontroller nicht, welches ein enormes Energieeinsparpotenzial ist (vgl. [6], S. 12) (vgl. [12]).
Der Markt verfügt über diverse Varianten von Mikrocontrollern und für jede Aufgabe gibt es einen passenden Mikrocontroller.
Der Personal-Computer dagegen ist eine universelle Recheneinheit, mit der wiederum rechenintensive Programme durchgeführt werden können. Ein Betriebssystem und die Interaktion mit der Peripherie vereinnahmen Rechenleistung eines PCs. Aber auch hier geht der Trend Richtung Effizienz (siehe Raspberry Pi [13]).
Rechnerarchitekturen gibt es in zwei unterschiedlichen Varianten: die HarvardArchitektur und die Neumann-Architektur. Die Harvard-Architektur basiert auf zwei physikalisch getrennten Speichern, einem Datenspeicher und einem Programmspeicher. Ausgehend von dieser Speichertrennung ist eine parallele Übertragung von Daten und Befehlen möglich, was einen Geschwindigkeitsvorteil mit sich bringt, dennoch mit einem Hardwaremehraufwand1 und Kosten verbunden ist (vgl. [3], S .96). Die NeumannArchitektur hat dagegen einen gemeinsamen Daten- und Programmspeicher. Eine sequenzielle Übertragung von Daten und Befehlen führt zu einer Verzögerung der Verarbeitung. Hierbei kann es zum sogenannten Neumannflaschenhals2 kommen (vgl. [15], S. 238). Harvard-Architekturen sind vor allem in Mikrocontrollern und NeumannArchitekturen in PCs anzutreffen (vgl. [5], S.12). Auch unterscheiden sich die Prozessorarchitekturen in Rechnern. In PCs werden typischerweise Intel- und AMD- Prozessoren verbaut. Diese Prozessoren basieren auf der CISC-Architektur.
Ein Mikrocodespeicher beinhaltet komplexe Befehle, die in mehreren Zyklen ausgeführt werden. In der Regel haben CISC-Prozessoren meist mehr als 100 Maschinenbefehle. Sehr komplexe Befehle können auch als eigenes Mikroprogramm geschrieben werden. Das Mikroprogramm, welches im internen ROM eines Prozessors zur Verfügung steht, interpretiert Befehle und stellt die zerlegten Befehle der CPU zur Verfügung (vgl. [2], S. 623).
RISC-Architekturen dagegen setzen auf einen möglichst kleinen Befehlssatz. Die simplen Befehle werden in wenigen Takten ausgeführt. Aus den simplen Befehlen lassen sich durch Programmierung auch komplexere Ausführungen verwirklichen. In der Praxis ist es auch möglich mit einem Raspberry Pi, der auf der RISC-Architektur basiert eine CISCHardware zu emulieren3.
Ein weiteres Merkmal dieser Architektur ist, dass ein RISC-Prozessorentwurf ohne Mikrocodespeicher auskommt. Diese Einfachheit ermöglicht dem RISC-Prozessor eine kleinere Chipfläche einzunehmen. Dadurch ist eine Realisierung von mehreren Komponenten wie zum Beispiel Speicher, GPIOs, Timer und ADC auf einem Chip möglich. Die Integration solcher Komponenten auf einem Chip ist in Mikrocontrollern verwirklicht. Durch die Komponenten ist ein Mikrocontroller ohne zusätzliche Hardware in seinen Aufgaben sehr anpassungsfähig und vielfältig einsetzbar (vgl. [2], S.623) (vgl. [1], S.53).
2.2 Softwarearchitektur
Um ein System softwareseitig zu entwickeln, wird sich an verschiedenen Schichten bedient. Jede Schicht ist ein in sich geschlossenes Modul und kommuniziert mit den anderen Schichten nach oben oder unten. In der Abbildung 1 ist eine sehr vereinfachte Architektur dargestellt.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 1: Vereinfachte Architektur ermöglicht es der Applikation völlig unabhängig von der Hardware betrieben zu werden (vgl. [1], S. 109). Auf der komfortablen Arduino IDE z.B. wird ein solcher Austausch der HAL mittels eines Mausklicks realisiert (siehe Abbildung 2).
Abbildung 2: Auswahl unterschiedlicher Hardware auf der Arduino IDE
2.3 Applikation
Auf der Applikationsebene wird die Programmsequenz, sprich der Ablauf eines Prozesses, entwickelt. Ein komfortables Programmieren wird durch Nutzen der HALs ermöglicht. Die Prozedur-Programmierung muss sich nicht unnötig im Vorfeld mit der eingesetzten Hardware auseinandersetzen. Hierbei werden sogenannte „schöne Schnittstellen“ z.B. in der Arduino IDE der Befehl digitalWrite(PIN, HIGH);, genutzt.
2.4 Hardwareabstraktionsschicht
In der Hardwareprogrammierung befindet sich eine Stufe unter der Applikation. Nachdem Matrjoschka-Prinzip werden HALs ineinander verschachtelt. Die äußerste HAL steht dabei der Applikationsebene zur Verfügung und koppelt z.B. Aktoren oder Sensoren, welche die äußerste Hardware darstellen. Die innerste HAL bildet häufig dabei z.B. eine Kopplung zwischen den Registern und elektronischen Ein- / Ausgängen eines Mikrocontrollers. Dazwischen können sich weitere HALs befinden, wie z.B. das Ansteuern von Leistungselektronik. Jedes Einfügen weiterer Abstraktionsschichten geht auch immer mit einem Performance- und Speicherverlust einher (vgl. [1], S. 109).
2.5 Die Programmiersprache C
Die Programmiersprache C zeichnet sich vor allem dadurch aus, dass die Programmierer wissen, was sie tun. C findet in vielen Bereichen seine Anwendung. Vor allem aber in der Mikrocontroller-Programmierung. C ist durch das hardwarenahe Programmieren maximal effizient und ressourcenschonend. Über Pointer lassen sich z.B. Register direkt ansprechen (siehe Anhang 7). Auch die große Portabilität von C macht es in der hardwarenahen Programmierung unabdingbar (vgl. [10], S.6) (vgl. [11], S.XI).
Das Abarbeiten von Befehl für Befehl macht C zu einer prozeduralen Programmiersprache. Durch das Programmieren von Funktionen und Modulen (siehe Anhang 3 und 4) kann man C-Programme strukturiert und übersichtlich gestalten (vgl. [1], S.6).
3. Hardware-Architektur pC ATmega328P
Wie in Kapitel 2.1 beschrieben, ist ein Mikrocontroller durch seine interne Peripherie in seinen Aufgaben sehr flexibel einsetzbar.
Der ATmega328P gehört zu den AVR-Mikrocontrollern. Dieser Mikrocontroller zeichnet sich einerseits durch die Harvard-Architektur als auch mit der RISC Prozessor-Architektur aus. Zudem basiert er auf der LV-A und besitzt eine Busbreite von 8-Bit. (vgl. [4], S.95). Außerdem ist es möglich, durch das Abschalten von Peripherie4 und der Möglichkeit in einen Sleep-Modus zu wechseln, sehr energiesparend ein System zu betreiben (vgl. [1], S.99). Die integrierte Peripherie und Komponenten (siehe Anhang 1) des ATmega328P werden in den darauffolgenden Kapiteln erläutert5, besonders die GPIOs werden im Detail genauer erklärt, um im Kapitel 4 die praktische Lösung besser nachzuvollziehen.
3.1 General-Purpose Input/Output
Die Ansteuerung eines I/O-Pins ist durch das Setzen von Bits im Arbeitsspeicher möglich. Beginnend ab der Speicheradresse 0x23 bis zur 0x2B werden entsprechend die Pins nach gewünschter Funktion konfiguriert.
Das Datenrichtungsregister DDRx (x steht für „B“, „C“ oder „D“ ,je nach gewünschter Portbank) bestimmt die Richtung des Signalflusses. Ein gesetztes Bit legt den entsprechenden Pin als Ausgang fest, ein nicht gesetztes Bit als Eingang.
Der Datenport PORTx dient zum Setzen eines Pins und findet Verwendung beim Treiben von Signalen.
Der Anschlussport PINx dagegen ist nur zum Einlesen von Signalen gedacht und findet Verwendung beim Einlesen eines anliegenden Potentials (vgl. [4], S.108-109) (vgl. [5], S.275).
Außerdem ist ein Zuschalten des internen Pullup- Widerstands im Micro-Controller-UnitControllregister mit der Speicheradresse 0x55 durch das Setzen an Bit 4 (Pullup Disable) möglich (vgl. [1], S.62) (vgl. [9], S.428-430).
Mit der include-File <avr/io.h> wird die entsprechende zum ATmega328P passende HAL <iom328p.h> inkludiert[6] (vgl. [1], S.59).
3.2 Timer
Der ATmega328P ist mit zwei 8-Bit Timern und einem 16-Bit Timer ausgestattet (siehe Anhang 1). Timer werden als Zähler zur PWM-Erzeugung oder für die Zeitmessung verwendet. Die Quelle des Timertaktes ist durch einen Prescaler7 und des internen Systemtaktes konfigurierbar. Alternativ kann auch ein externer Takt als Taktgeber gewählt werden (vgl. [1], S.73).
3.3 Analogkomparator
Der Analogkomparator dient dem Spannungsvergleich zweier analogen Signale. Das Ändern eines Signals8 führt entsprechend bei Unter- oder Überschreiten des zweiten Signals zum Wechsel des digitalen Ausgangs des Analogkomparators (vgl. [8], S.264).
3.4 Analog Digitalwandler
Der AD-Wandler (ADC) basiert auf der sukzessiven Approximation9. Die Auflösung ist mit 10-Bit realisiert. Die interne Referenzspannung Vref von 5V begrenz die Eingangsempfindlichkeit (Auflösung) AU auf 4,91mV/Bit.
&u = Vref =
210Bits
57
= 4,91mV/Bit 1024Bits ' '
Um die Eingangsempfindlichkeit zu verbessern kann eine externe Referenzspannung[10] oder eine weitere interne Referenzspannungsquelle von 1,1V verwendet werden (vgl. [1], S.92).
3.5 I/O Multiplexing
Durch die integrierte Peripherie und Limitierung der I/O-Pins, ist es notwendig mittels eines Multiplexverfahrens (siehe Abbildung 3) die Pins in deren Funktionalität aufzuteilen. Die Konfiguration des Multiplexers, mittels Steuersignale der CPU, bestimmt welche Peripherie ausgewählt wird.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 3: Schematischer Aufbau desMultiplexverfahrens
Als Beispiel verfügt der ATmega328P am Port D I/O-Pins, die als digitale Ein- oder Ausgänge fungieren können oder als USART-Schnittstelle an den Pins PDO und PD1 ([9], S. 14).
3.6 Central Prozess Unit
Die CPU[11] (Mikroprozessor) ist die wichtigste Komponente des ATmega328P. Hier findet die Verarbeitung des Programmcodes statt. In der CPU wird mit Hilfe eines Programmzählers, der aufeine Speicheradresse im Programmspeicher zeigt, ein Befehl in den Befehlsdecoder des Steuerwerkes geladen. Nach Decodierung des Befehls berechnet eine ALU eine arithmetische oder logische Operation und speichert diese im Arbeitsregister zwischen oder verarbeitet das Ergebnis mit weiteren Befehlen weiter (vgl. [2], S.99).
3.7 Speicher
Drei verschiedene Speichertechnologien unterscheiden sich in deren Anwendungsgebieten, dabei wird sich an der Geschwindigkeit, der Persistenz und dem Volumen dieserTechnologien orientiert.
3.7.1 SRAM
Ein kleiner Zwischenspeicher, der sich durch hohe Speichergeschwindigkeiten auszeichnet. Speicherung erfolgt mit der CMOS-Technologie, die mittels einer Flip-Flip Verdrahtung Bits abspeichern. Nachteil sind die geringe Speicherkapazität, der hohe Stromverbrauch und der Verlust von Daten bei Spannungsunterbrechung (vgl. [7], S.132). Der SRAM dient der Recheneinheit als Arbeitsspeicher, um Variablen und Arrays abzulegen. Außerdem enthält der SRAM mehrere Register zur Steuerung der Peripherie (vgl. [4], S.97) (vgl. [1], S.58).
3.7.2 EEPROM
Der nichtflüchtige Speicher kann elektronisch programmiert und gelöscht werden. Der Vorteil dieser Datenspeicherung ist, dass Daten persistent abspeichert werden und aus dem Programm heraus programmierbar ist. Die Nachteile sind eine begrenzte Anzahl von Programmierzyklen und die langsame Programmierzeit der abzulegenden Daten. Im EEPROM werden üblicherweise Herstellerdaten oder Parameter abgelegt (vgl. [1], S.58) (vgl. [7], S.132). Mit der Inkludierung mit der Bibliothek <avr/eeprom.h> und der Nutzung der Makros ist es möglich, Daten im EEPROM abzulegen.
3.7.3 Flash
Der Programmspeicher ist als Flash-Speicher realisiert. Der Flash-Speicher ist eine Weiterentwicklung des EEPROMs mit dem Unterschied, dass Daten blockweise in Datenblöcken geschrieben oder gelöscht werden und somit über einen größeren Datenfluss verfügen. Wie der EEPROM ist der Flash-Speicher persistent (vgl. [7], S. 143). Auch die hohe Speicherkapazität zeichnet den Flash-Speicher aus.
[...]
1 Das doppelte an Busleitungen und Speicher werden benötigt.
2 Durch Engpass kommt es zum Datenstau.
3 z.B. mit Hilfe des Open-Source-Emulators „Bochs“ kann ein x86- oder AMD64-Prozessor emuliert werden
4 durch das Inkludieren der Bibliothek und das Anwenden der Makros aus <avr/sleep.h>
5 Aufgrund der Seitenbeschränkung werden die Kommunikationsschnittstellen nicht erläutert.
7 Frequenzteiler basierend auf der T-FlipFlip-Technologie (vgl. [8], S.300).
8 z.B. ein spannungsabhängigerTemperatursensor durch Temperaturänderung.
9 Schrittweise Annäherung des Digitalwertes an einer Messpannung.
10 z.B. eignet sich eine Präzision-Zenerdiode dafür.
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X. -
¡Carge sus propios textos! Gane dinero y un iPhone X.