Sie sind auf Seite 1von 13

Kontrollfragen und Übungsaufgaben zu Mikrocontroller

Prof. Dr.-Ing. Frank Kesel


Hochschule Pforzheim

3. Februar 2015

Inhaltsverzeichnis

1 Aufgaben zu Kapitel 1 2

2 Aufgaben zu Kapitel 2 3

3 Aufgaben zu Kapitel 3 4

4 Aufgaben zu Kapitel 4 5

5 Aufgaben zu Kapitel 5 7

6 Lösungen zu Kapitel 1 7

7 Lösungen zu Kapitel 2 8

8 Lösungen zu Kapitel 3 9

9 Lösungen zu Kapitel 4 10

10 Lösungen zu Kapitel 5 13
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 2

1 Aufgaben zu Kapitel 1

Bitte versuchen Sie zunächst die Aufgaben zu lösen ohne in die Lösungen oder das Skript zu schauen, um Ihren
Kenntnisstand zu kontrollieren. Bei manchen Aufgaben kann es auch hilfreich sein, ein Beispiel zu program-
mieren und mit dem Simulator oder dem Laborboard zu testen.
Aufgabe 1.1:
Beschreiben Sie die Prinzipien des von-Neumann-Rechners.
Aufgabe 1.2:
Was zeichnet einen Mikrocontroller gegenüber einem Mikroprozessor aus?
Aufgabe 1.3:
Zeichnen Sie ein Blockdiagramm für ein Mikrocontrollersystem und erläutern Sie die Funktion der einzelnen
Bestandteile.
Aufgabe 1.4:
Was bezeichnet der Begriff „Wortbreite“ eines Mikroprozessors? Welche Wortbreite besitzt der Cortex-M0 und
was sagt dies über seine Leistungsfähigkeit aus?
Aufgabe 1.5:
Was versteht man unter dem Adressraum eines Prozessors? Welchen Adressraum wird ein 16-Bit-Prozessor in
der Regel besitzen?
Aufgabe 1.6:
Wie werden das Programm und die Daten in einem „von-Neumann“-Speichersystem üblicherweise angeord-
net?
Aufgabe 1.7:
Geben Sie den Wertebereich des Datentyps uint16_t an.
Aufgabe 1.8:
Charakterisieren Sie eine lokale, statische Variable in einer Funktion bezüglich Lebensdauer, Gültigkeit und
Initialisierung.
Aufgabe 1.9:
Welche Daten werden im „Heap“ gespeichert und welche im „Stack“?
Aufgabe 1.10:
Gegeben sei folgende Variablendeklaration in C:
unsigned long int i = 0xdeadbeef;
Ordnen Sie die Daten der Variablen im Speicher ab Adresse 0x00000010 in Big-Endian-Anordnung an. Zeich-
nen Sie die hierzu einen Ausschnitt aus dem Speicher von Adresse 0x00000010 bis 0x00000018 und füllen Sie
den Speicher entsprechend byteweise. Nicht benutzte Bytes setzen Sie auf 0x00.
Aufgabe 1.11:
Gegeben sei folgender Assemblerbefehl: add A, 90h
und der zugehörige Maschinenbefehl lautet (hexadezimal): 24 90
Der Befehl addiert den Inhalt des Bytes an der Adresse 90h zum Akkumulator A hinzu. Beschreiben Sie, wie
ein Mikroprozessor diesen Befehl abarbeitet. Nehmen Sie hierzu an, dass der Prozessor pro Speicherzugriff
genau ein Byte aus dem Speicher holen kann.
Aufgabe 1.12:
Was versteht man unter einer so genannten „Memory Map“?
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 3

Aufgabe 1.13:
Weshalb werden RISC-Prozessoren auch als „Load-Store“-Maschinen bezeichnet?

2 Aufgaben zu Kapitel 2

Aufgabe 2.1:
Wie sieht das Geschäftsmodell der Firma ARM aus?
Aufgabe 2.2:
Charakterisieren Sie die drei Anwendungsprofile der ARM-Cortex-Prozessoren. Wie kann man den Cortex-M0
einordnen?
Aufgabe 2.3:
Wodurch unterscheiden sich „Thread“-Mode und „Handler“-Mode beim Cortex-M0?
Aufgabe 2.4:
Welche spezielle Aufgabe hat das Register R15 im Cortex-M0?
Aufgabe 2.5:
In welchem Register sind die ALU-Flags gespeichert?
Aufgabe 2.6:
Was ist die Datenbreite, mit der die Cortex-ALU Daten verarbeiten kann?
Aufgabe 2.7:
Gegeben sei folgender Ausschnitt aus einem C-Programm:
uint32_t a, b, c;
a = 0xFFFFFFFE;
b = 3;
c = a + b;
Erläutern Sie bitte, welche ALU-Flags beim Ausführen der letzten Zeile aktiv werden und begründen Sie Ihre
Antwort (hier wäre der Einsatz des Simulators hilfreich).
Aufgabe 2.8:
Aus der „Memory Map“ des NUC130 kann man entnehmen, dass der Flash-Memory-Speicher von Adresse
0x0000_0000 bis 0x0001_FFFF angeordnet ist. Was ist die maximale Größe eines Programms für den NUC130
in Byte?
Aufgabe 2.9:
Was versteht man unter dem „Programm-Image“?
Aufgabe 2.10:
Beschreiben Sie bitte, wie der Cortex-M0 vom Reset bis zum Ausführen der ersten Instruktion des Programms
kommt.
Aufgabe 2.11:
Erläutern Sie bitte die Funktionsweise des Stack im Cortex-M0, der im „Full-Descending“-Modus arbeitet.
Zeichnen Sie hierzu den Stack, welcher an der Adresse 0x2000_8000 anfangen soll und zeichnen Sie das
Ergebnis einer PUSH- und POP-Operation ein. Nehmen Sie an, dass ein Byte mit dem Wert 0x55 auf den Stack
gebracht und vom Stack geholt wird. Welches Register ist für die Adressierung des Stack wichtig?
Aufgabe 2.12:
Ein Kollege kommt zu Ihnen und bittet Sie um Hilfe. Sein Programm funktioniert nicht richtig und Sie sollen
herausfinden, wo das Problem liegt. Er sagt Ihnen, dass er in seinem Programm Daten dynamisch mit „malloc“
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 4

anlegt und einige rekursive Funktionen benutzt. In der Startup-Datei des Programms finden Sie folgendes:
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000000
Was könnte das Problem Ihres Kollegen sein? Erläutern Sie das Problem bitte genauer.

3 Aufgaben zu Kapitel 3

Aufgabe 3.1:
Erläutern Sie bitte die Aufgaben des Compilers und des Linkers.
Aufgabe 3.2:
Im Projektverzeichnis finden Sie Dateien mit der Endung „.obj“. Was ist der Inhalt dieser Dateien?
Aufgabe 3.3:
Was versteht man unter einem verschiebbaren Modul?
Aufgabe 3.4:
Aus welchem Grund benötigen Sie in einem KEIL-Projekt für den NUC130 unbedingt die Datei „star-
tup_NUC1xx.s“?
Aufgabe 3.5:
Was ist ein „Haltepunkt“ (Breakpoint) und wozu dient er?
Aufgabe 3.6:
Erläutern Sie den Unterschied zwischen Simulator und Debugger.
Aufgabe 3.7:
Was ist der „Reset Handler“ und wo befindet sich der Code hierfür?
Aufgabe 3.8:
Erläutern Sie bitte, was folgende Code-Zeile in C bewirkt:
(*(volatile uint32_t *) 0x50000000) = 0x12345678;
Aufgabe 3.9:
Beschreiben Sie bitte was der Qualifier volatile bei der Deklaration einer Variablen bewirkt.
Aufgabe 3.10:
Deklarieren Sie für den Zugriff auf eine Peripherieeinheit PERI1 eine Struktur als neuen Datentyp PERI_TYPE,
welche drei Register R1, R2 und R3 beinhaltet. Die Register seien alle jeweils ein Byte groß und das Register
R1 steht an der Anfangsadresse 0x4000_0010 der Peripherieeinheit. Die Register R2 und R3 folgen darauf
ohne Adresslücke. Legen Sie per define einen Zeiger PERI1 auf die Struktur mit der Anfangsadresse an, so
dass im Hauptprogramm folgende Zeile ausgeführt werden kann:
PERI1->R2 = 0x55;
Erläutern Sie, was die Zeile bewirkt. Schreiben Sie am besten ein vollständiges Programm und testen Sie es im
Simulator.
Aufgabe 3.11:
Erläutern Sie mit Hilfe einer Zeichnung, was es bedeutet, wenn der Ausgangsport für die Ansteuerung einer
LED „low-aktiv“ ist.
Aufgabe 3.12:
Erläutern Sie bitte, was nachfolgende Code-Zeile beim NUC130-System auf unserem Labor-Board bewirkt:
joystick = ~GPIOE->PIN_B0;
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 5

4 Aufgaben zu Kapitel 4

Aufgabe 4.1:
Erläutern Sie die Arbeitsweise des „SysTick“-Timers im Cortex-M0.
Aufgabe 4.2:
Was ist die maximale Zeitverzögerung, die Sie mit dem „SysTick“-Timer bei einem Takt von 12 MHz erreichen
können? Begründen Sie Ihre Antwort.
Aufgabe 4.3:
Erläutern Sie bitte die Aufgaben eines UART.
Aufgabe 4.4:
Was bedeutet die Abkürzung „8N1“ bei den Einstellungen im RS232-Protokoll? Wieviele Bytes können Sie
maximal pro Sekunde übertragen, wenn die Baudrate 9600 Baud beträgt?
Aufgabe 4.5:
Zeichnen Sie bitte den zeitlichen Ablauf bei der Übertragung des Zeichens ’H’ (ASCII-Code: 0x48) im RS-
232-Protokoll auf. Die Übertragung findet mit einer Baudrate von 9600 Baud statt und der Mode ist „8O1“.
Beachten Sie bitte, dass Sie die Parität korrekt ermitteln müssen. Wählen Sie den Maßstab der Zeichnung
geeignet und geben Sie die Dauer eines Bits zahlenmäßig genau an.
Aufgabe 4.6:
Erläutern Sie bitte, was passiert, wenn sich die Baudraten von Sender und Empfänger um mehr als 5% unter-
scheiden.
Aufgabe 4.7:
Weshalb benötigen Sie ein so genanntes „Null-Modem“-Kabel um zwei NUC130-Boards per RS232 verbinden
zu können?
Aufgabe 4.8:
Es soll für den UART2 eine Baudrate von 57600 Baud erzeugt werden. Die Taktfrequenz beträgt 12 MHz
und der programmierbare Vorteiler ist M = 16. Berechnen Sie den notwendigen Wert für das Baudratenregister
BRD. Geben Sie den prozentualen Fehler der damit erzeugten Baudrate bezogen auf die verlangte Soll-Baudrate
an.
Aufgabe 4.9:
Was bewirkt folgender Ausschnitt aus einem Programm, welches Zeichen über den UART sendet:
if(UART2->FSR.TX_FULL == 0){
UART2->DATA = ’x’;
}
Wozu wird insbesondere die Abfrage UART2->FSR.TX_FULL == 0 benötigt und was würde passieren, wenn
diese Abfrage fehlt?
Aufgabe 4.10:
Was unterscheidet das SPI-Protokoll vom RS232-Protokoll?
Aufgabe 4.11:
Geben Sie eine Begründung dafür an, weshalb beim SPI-Protokoll die Daten im Mode 3 mit der steigenden
Flanke übernommen werden. Zeichnen Sie ein Timing-Diagramm für die Begründung.
Aufgabe 4.12:
Bekanntlich werden die ASCII-Zeichen auf dem LC-Display unseres Laborsystems jeweils durch eine 5x8-
Matrix dargestellt, wobei die benötigten Byte-Werte im Feld font5x7 gespeichert sind. Bitte geben Sie für
den nachfolgenden Ausschnitt aus diesem Feld an, welches Zeichen hier gespeichert ist. Zeichnen Sie zur
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 6

Lösung eine 5x8-Matrix und tragen Sie die schwarzen Pixel ein.
const uint8_t font5x7[]={
...
0x7E,0x11,0x11,0x11,0x7E,
Aufgabe 4.13:
Gegeben sei nachfolgender Ausschnitt aus einer Funktion LCD_PrintChar, welche einzelne Zeichen an das
LCD ausgibt. Die Funktion LCD_SingleWrite sendet dabei ein Byte über die SPI-Schnittstelle zum LCD.
Erläutern Sie zunächst, wie ein ASCII-Zeichen, dessen Wert als Argument übergeben wird, von der Funktion
an das LCD gesendet wird. Ändern Sie dann den Ausschnitt so ab, dass die Zeichen invertiert ausgegeben
werden.
void LCD_PrintChar(uint8_t character){
...
for(i = 0; i<5; i++) {
LCD_SingleWrite(font5x7[i + character*5]);
}
LCD_SingleWrite(0);
...
}
Aufgabe 4.14:
Was muss man tun, um das LCD vom Daten- in den Kommando-Mode zu schalten?
Aufgabe 4.15:
Gegeben sei ein 8-Bit-AD-Wandler, welcher mit einer (Referenz-)Spannung von 5 Volt betrieben wird. Geben
Sie den kleinsten erkennbaren Spannungsunterschied (1 LSB) des Wandlers in Volt an. Zeichnen Sie die „Trep-
penfunktion“ (x-Achse: analoge Spannung, y-Achse: Binäre Werte) des Wandlers für die ersten fünf binären
Werte von 00000000 bis 00000100.
Aufgabe 4.16:
Ein ADC entnimmt einer analogen Signalquelle Proben mit einer Rate von fadc = 88 kHz. Wie hoch darf die
maximale Frequenz der Signalquelle sein, so dass das Signal möglichst ungestört gewandelt werden kann?
Welchen Fehler können Sie auch bei Einhalten dieser Bedingung beim ADC prinzipbedingt nicht vermeiden?
Geben Sie eine obere Grenze für diesen Fehler an, wenn es sich um einen 12-Bit-ADC handelt, welcher mit
einer Referenzspannung von 3,3 Volt betrieben wird. Gehen Sie davon aus, dass keine Kennlinienfehler vorlie-
gen.
Aufgabe 4.17:
Welche Aufgabe hat die „Sample&Hold“-Stufe beim ADC? Erläutern Sie die Arbeitsweise anhand einer Prin-
zipskizze.
Aufgabe 4.18:
Erläutern Sie das ADC-Prinzip „Sukzessive Approximation“ anhand eines 3-Bit-ADC, welcher mit einer Re-
ferenzspannung von 5 Volt betrieben wird. Zeigen Sie, wie ein analoger Wert von 4,2 Volt durch den ADC in
ein binäres Ergebnis im SAR gewandelt wird. Wie genau ist der binäre Wert?
Aufgabe 4.19:
Wie lange dauert eine AD-Wandlung im NUC130, wenn der ADC mit 22,1184 MHz betrieben wird und wie
hoch ist die maximale Signalfrequenz eines durch den ADC zu wandelnden Signals?
Aufgabe 4.20:
Woran können Sie erkennen, dass der ADC im NUC130 mit einer Wandlung fertig ist?
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 7

Aufgabe 4.21:
Gegeben sei ein 10-Bit-ADC mit einer Referenzspannung von 5 Volt. Sie sollen die vom ADC gewandelten
Werte in eine Spannung umwandeln, um diese später ausgeben zu können. Gehen Sie davon aus, dass sich
diese Spannung ebenfalls in einem Bereich zwischen 0 und 5 Volt bewegt. Geben Sie zunächst einen Algo-
rithmus (Berechnungsschema) an, welcher die einzelnen Ziffern (1 Vorkommastelle, 3 Nachkommastellen) des
Spannungswertes berechnet. Schreiben Sie anschließend eine C-Funktion, welche dieses Berechnungsschema
implementiert. Der Funktion soll der gewandelte Wert als uint16_t übergeben werden (die höherwertigen 6
Bit sind als 0 anzunehmen) und ein Zeiger auf einen String, in welchem die Ziffern inklusive Dezimalpunkt
und dem ’V’ gespeichert werden. (Wenn Sie möchten, können Sie diese Funktion im Simulator testen.)

5 Aufgaben zu Kapitel 5

Aufgabe 5.1:
Nehmen Sie an, Sie sollen in einem Programm Zeichen vom UART empfangen. Diskutieren Sie an diesem
Beispiel den Unterschied zwischen einer Lösung durch „Polling“ und einer Lösung mit „Interrupt“.
Aufgabe 5.2:
Was ist ein so genannter „Interrupt Handler“?
Aufgabe 5.3:
Welche Aufgaben übernimmt der NVIC im Cortex-M0 im Hinblick auf Interrupts von Peripherieeinheiten?
Aufgabe 5.4:
Wozu dient die „Exception-Vektor-Tabelle“?
Aufgabe 5.5:
Was muss man tun, damit die Interrupts einer Peripherieeinheit wirksam werden?
Aufgabe 5.6:
Welches Problem wird durch Interrupt-Prioritäten gelöst und wie viele verschiedene Interrupt-Prioritäten sind
im Cortex-M0 möglich?
Aufgabe 5.7:
Was versteht man unter „geschachtelten Interrupts“ (nested interrupts)?

6 Lösungen zu Kapitel 1

Hinweise zu den Lösungen: Die Lösungen sind aus Platzgründen sehr knapp gehalten und geben nur die we-
sentlichen Sachverhalte wieder oder verweisen auf das Skript. Abbildungen sind in der Regel keine angegeben.
Ihre Lösungen in der Klausur müssen natürlich ausführlicher sein, müssen die geforderten Abbildungen ent-
halten und dürfen nicht einfach auf das Skript verweisen!
Aufgabe 1.1:
Siehe Skript Kapitel 1 Folie 8.
Aufgabe 1.2:
Er verfügt über spezielle Peripherieeinheiten, die auf dem Chip integriert sind.
Aufgabe 1.3:
Siehe Skript Kapitel 1 Folie 24.
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 8

Aufgabe 1.4:
Breite der Register und mit der die Daten in der CPU verarbeitet werden. Der Cortex hat eine Wortbreite von
32 Bit und kann somit 32 Bit Daten in einem Maschinenbefehl verarbeiten.
Aufgabe 1.5:
Die Anzahl der maximal adressierbaren Bytes im Speicher, ein 16-Bit-Prozessor wird in der Regel einen
Adressraum von 216 Bytes haben
Aufgabe 1.6:
Das Programm ab Adresse 0 und dann folgend die Daten (statische Daten, Heap, Stack)
Aufgabe 1.7:
0 bis 65535
Aufgabe 1.8:
Gültig innerhalb einer Funktion, Initialisierung einmal beim ersten Aufruf der Funktion, Variable behält ihren
Wert nach Verlassen der Funktion
Aufgabe 1.9:
Dynamische Daten im Heap, lokale, automatische Variablen im Stack
Aufgabe 1.10:
Adresse 0x00000010: 0xde, Adresse 0x00000011: 0xad, Adresse 0x00000012: 0xbe, Adresse 0x00000013:
0xef, Rest: 0x00
Aufgabe 1.11:
siehe Folie 40 ff. in Kapitel 1
Aufgabe 1.12:
Die „Memory Map“ definiert für ein Mikrocontrollersystem die Aufteilung der Adressen auf Speicher und
Peripherieeinheiten
Aufgabe 1.13:
Der Zugriff auf den Speicher ist nur über spezielle Load- und Store-Befehle möglich. Bei arithmetischen Be-
fehlen ist kein Zugriff auf den Speicher möglich, sondern nur auf Arbeitsregister.

7 Lösungen zu Kapitel 2

Aufgabe 2.1:
ARM entwickelt die Pozessorkerne als so genannte „IP-Blöcke“ und verkauft diese an Halbleiterhersteller (z.B.
Nuvoton). Diese entwickeln damit Mikrocontrollersysteme auf einem Chip.
Aufgabe 2.2:
A-Profil: Leistungsstarke Prozessoren für Smartphones, Tablets etc.; R-Profil: Für Echtzeitbetriebssysteme;
M-Profil: Mikrocontroller für preissensitive Anwendungen; der M0 gehört zum M-Profil
Aufgabe 2.3:
Thread-Mode: Ausführen des Anwendungsprogramms, Handler-Mode: Ausführen der Exception- und Inter-
rupt-Handler
Aufgabe 2.4:
R15 = PC (Programmzähler)
Aufgabe 2.5:
Im xPSR- bzw. APSR-Register (Programm Status Register)
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 9

Aufgabe 2.6:
32 Bit
Aufgabe 2.7:
C = 1, alle anderen Flags = 0, die Operation ergibt eine Zahlenbereichsüberschreitung
Aufgabe 2.8:
131.072 Bytes
Aufgabe 2.9:
Das Image beinhaltet den Anfangswert des Stack-Pointers, die Exception-Vektoren und das ausführbare Pro-
gramm
Aufgabe 2.10:
Siehe Folie 39 in Kapitel 2 im Skript.
Aufgabe 2.11:
Nach der PUSH-Operation liegt der Wert 0x00000055 ab Adresse 0x20007FFC im Speicher, da der Stack-
Pointer (MSP = R13) zunächst um 4 dekrementiert wird und dann der Wert als 32-Bit Datum gespeichert
wird. Nach der POP-Operation zeigt der MSP wieder auf 0x20008000. Der gerettete Wert wurde wieder in ein
Arbeitsregister zurückkopiert, bleibt aber im Speicher stehen. Siehe auch Abbildung auf Folie 42 Kapitel 2 im
Skript.
Aufgabe 2.12:
Für den Heap wurde kein Speicher reserviert, durch die rekursiven Funktionen ist es möglich, dass der Stack
den Heap überschreibt.

8 Lösungen zu Kapitel 3

Aufgabe 3.1:
Compiler: Kompiliert den C-Quellcode in ausführbaren und verschiebbaren Maschinencode. Der Linker bindet
die Module zusammen und legt deren Anfangsadressen fest.
Aufgabe 3.2:
Dies sind die kompilierten oder assemblierten Module, die verschiebbaren Maschinencode enthalten.
Aufgabe 3.3:
Die Anfangsadresse eines verschiebbaren Moduls kann noch verändert werden und somit müssen z.B. Sprung-
adressen vom Linker nach der Festlegung der Anfangsadresse noch berechnet werden.
Aufgabe 3.4:
In diesem Assembler-Quellcode ist der Code für den Reset-Vektor, welcher nach Reset ausgeführt werden
muss. Von dort erfolgt der Sprung zum Hauptprogramm (main-Routine).
Aufgabe 3.5:
Während des „Debuggens“ kann man den Prozessor die Ausführung des Programms fortsetzen lassen und die
Ausführung an einer bestimmten Stelle im Quellcode durch Setzen eines Breakpoints unterbrechen.
Aufgabe 3.6:
Beim Simulator läuft das Programm auf einem Modell des Prozessor im Entwicklungsrechner, beim Debugger
läuft das Programm auf der realen Hardware.
Aufgabe 3.7:
Wenn der Prozessor rückgesetzt wird, dann springt der Prozessor (nach Laden des Stack Pointers) zum „Reset
Handler“. Dieser ist daher ein „Exception Handler“, da man den Reset auch als Exception versteht. Der Code
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 10

für den „Reset Handler“ befindet sich normalerweise in der Datei „startup_NUC1xx.s“.
Aufgabe 3.8:
Die folgenden Adressen im Hauptspeicher werden beschrieben („Little-Endian“-Format!): 0x50000000 = 0x78,
0x50000001 = 0x56, 0x50000002 = 0x34, 0x50000003 = 0x12
Aufgabe 3.9:
Er zwingt den Compiler dazu, eine Stelle im Hauptspeicher zu lesen oder zu schreiben und keine Optimierungen
hinsichtlich des Speicherzugriffs vorzunehmen.
Aufgabe 3.10:
Die Aufgabe kann durch nachfolgendes Listing gelöst werden. Die Code-Zeile bewirkt, dass der Wert 0x55 auf
die Speicherstelle 0x40000011 geschrieben wird.

Listing 1: Lösung zu Aufgabe 3.10


1 #include "stdint.h"
2
3 typedef struct {
4 volatile uint8_t R1;
5 volatile uint8_t R2;
6 volatile uint8_t R3;
7 } PERI_TYPE;
8
9 #define PERI1 ((PERI_TYPE *) 0x40000010)
10
11 int main (void){
12
13 PERI1->R2 = 0x55;
14
15 }

Aufgabe 3.11:
Siehe Folie 42 Kapitel 3 im Skript
Aufgabe 3.12:
Die Tasterwerte des Joysticks werden eingelesen und in der Variablen joystick gespeichert.

9 Lösungen zu Kapitel 4

Aufgabe 4.1:
24-Bit Abwärtszähler; bei Nulldurchgang wird ein Flag gesetzt, welches einen Interrupt auslösen kann
Aufgabe 4.2:
Es sind 224 = 16.777.216 Zählschritte mit dem Timer möglich; bei einem Takt von 12 MHz ergibt sich somit
eine maximale Zeitverzögerung von T = 224 /12 MHz = 1, 398 s
Aufgabe 4.3:
Parallel-Seriell-Wandlung der zu sendenden Daten, seriell-parallel-Wandlung der empfangenen Daten, Senden
und Empfangen der Daten nach dem RS-232-Protokoll
Aufgabe 4.4:
„8N1“: 8 Datenbits, keine Parität, 1 Stoppbit, daher 10 Zeichen pro übertragenem Byte; Baudrate 9600 Baud
→ Anzahl Bytes pro Sekunde = 9600/10 Byte/s = 960 Byte/s
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 11

Aufgabe 4.5:
Zeichnung analog zu Folie 21 in Kapitel 4; übertragenes Zeichen „H“ = 0b01001000 (LSB zuerst!); Paritätsbit
= 1; Bitdauer = 1/9600 s = 104,17 µ s
Aufgabe 4.6:
Die Bits werden nicht korrekt abgetastet und damit die Zeichen fehlerhaft übertragen
Aufgabe 4.7:
RxD und TxD müssen gekreuzt werden, also RxD auf TxD verbunden werden
Aufgabe 4.8:
12 MHz
BRD = 16×57.600 Baud − 2 = 11, 020833, bei gewähltem Wert von BRD = 11 ergibt sich BR = 57.692,3 Baud,
92,3
der Fehler beträgt F = 57.600 · 100% = 0, 1%
Aufgabe 4.9:
Der ASCII-Code für das Zeichen „x“ wird auf den UART-Sendepuffer geschrieben. Der UART versendet dann
das Zeichen. Die Abfrage stellt sicher, dass nur dann ein Zeichen auf den UART geschrieben wird, wenn der
Sendepuffer (FIFO) nicht voll ist.
Aufgabe 4.10:
Das SPI-Protokoll ist ein synchrones Protokoll, RS232 ist asynchron.
Aufgabe 4.11:
CPOL = 1: inaktiver Zustand des Taktes ist 1, CPHA = 1: Daten werden mit der zweiten Taktflanke übernom-
men, dies ist die steigende Flanke, wenn der inaktive Zustand 1 ist. Timing-Diagramm siehe Folie 45 in Kapitel
4 für CPOL und CPHA = 1.
Aufgabe 4.12:
Es ist das große „A“. Zeichnung analog zu Folie 49 in Kapitel 4.
Aufgabe 4.13:
Das Font-Array font5x7 wird durch den Wert des Zeichens multipliziert mit 5 (da jedes Zeichen 5 Bytes
umfasst) und der Addition der Laufvariaben i in der Schleife adressiert und das entsprechende Byte mit den
Pixelwerten der Funktion LCD_SingleWrite als Argument übergeben. Um die Zeichen invertiert auszugeben
muss der Code so abgeändert werden: LCD_SingleWrite(~font5x7[i + character*5]);
Aufgabe 4.14:
Der Eingang A0 des LCD-Controllers muss auf 1 (Daten) oder 0 (Kommando) gesetzt werden (mit entspre-
chendem Makro).
Aufgabe 4.15:
Auflösung 8 Bit, daher 1 LSB = 5 V / 256 = 19,53 mV, Treppenfunktion analog zu Folie 62 (ohne Offset) oder
Folie 63 (mit Offset).
Aufgabe 4.16:
Es muss gelten fsignal,max < fA,max /2, also fsignal,max = 44 kHz. Der Quantisierungsfehler von ±1/2 LSB =
±402µ V kann nicht vermieden werden.
Aufgabe 4.17:
Die S&H-Stufe tastet den Spannungswert am Eingang ab und speichert ihn auf einer Kapazität, so dass er
während der Wandlung konstant bleibt. Skizze siehe Folie 69 Kapitel 4.
Aufgabe 4.18:
3 „Gewichte“: 1/2 × Ure f = 2, 5V , 1/4 × Ure f = 1, 25V , 1/8 × Ure f = 0, 625V , Ablauf analog zu Folie 71:
(1 × 1/2 + 1 × 1/4 + 0 × 1/8) × 5V , also Binärwert = 110
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 12

Aufgabe 4.19:
Wandlungszeit TA = 21/22, 1184 MHz = 0, 949µ s. Daher fA = 1, 053 MHz und fs,max = 526, 628 kHz.
Aufgabe 4.20:
Das ADF-Flag ist gesetzt.
Aufgabe 4.21:
1 LSB = 5 V / 1024 = 0,004883 V, daher Spannungswert = Code × 4883 und Rechnung gemäß Algorithmus auf
Folie 82. Listing 2 zeigt den Quellcode für die Lösung, inklusive der main-Routine für den Test im Simulator.
Der Code für die Umrechnung in ASCII-Codes wurde zur besseren Übersicht in eine Funktion ausgelagert. Der
Wert 0x03FF ist der maximale Wert, den der ADC ausgeben könnte. Hierfür erhalten wir einen umgerechneten
Wert von 4,995 V, welcher am Ende im String steht.

Listing 2: Lösung zu Aufgabe 4.21


1 #include "stdint.h"
2
3 char int2ascii(uint8_t digit) {
4 if(digit < 10)
5 return digit + 0x30; //ASCII character 0-9
6 else
7 return digit - 10 + 0x41; //ASCII A-F
8 }
9
10 #define LSB 4883
11 #define DIVISOR 1000000
12 void convert2volt(uint16_t value, uint8_t *stringPtr){
13 uint32_t x;
14 uint8_t i;
15
16 x = (uint32_t)value * LSB;
17 for(i = 0; i<5; i++){
18 if(i == 1){ //Insert decimal point
19 stringPtr[i] = 0x2E;
20 }
21 else { //Calculate single digits
22 stringPtr[i] = int2ascii((uint8_t)(x / DIVISOR));
23 x = (x % DIVISOR)*10;
24 }
25 }
26 stringPtr[5] = ’V’; //Voltage unit
27 stringPtr[6] = 0; //Zero termination
28 }
29
30 int main (void){
31 uint16_t x = 0x03FF;
32 uint8_t out[7];
33
34 convert2volt(x, out);
35 }
Kontrollfragen und Übungsaufgaben zu Mikrocontroller 13

10 Lösungen zu Kapitel 5

Aufgabe 5.1:
„Polling“: Man frägt entsprechende Flags im UART ab, die den Zustand der Empfangspuffer signalisieren
(Bytes gesendet, Bytes empfangen); „Interrupt“: Die Flags lösen einen Interrupt aus und ein entsprechender
Interrupt Handler wird aufgerufen.
Aufgabe 5.2:
Eine Funktion welche nicht durch die Software sondern durch die Hardware (Prozessor + NVIC) aufgerufen
wird.
Aufgabe 5.3:
Freischalten von Interrupts, speichern von Interruptereignissen (pending), Programmierung von Prioritäten, im
Zusammenspiel mit dem Prozessor: Ausführen des Interrupts durch Laden des Vektors in den PC
Aufgabe 5.4:
Speichert die Anfangsadressen der Exception Handler
Aufgabe 5.5:
Freischalten des Interrupts, z.B. durch die Funktion NVIC_EnableIRQ(IRQn)
Aufgabe 5.6:
Wenn mehrere Interrupts gleichzeitig aktiv werden, wird über die Priorität festgelegt, welcher Interrupt als ers-
tes ausgeführt wird. Ein Interrupt höherer Priorität kann einen Interrupt niedrigerer Priorität unterbrechen und
so möglichst der Handler möglichst schnell zur Ausführung kommen. Im Cortex-M0 gibt es vier Prioritätsebe-
nen.
Aufgabe 5.7:
Wenn ein Interrupt Handler durch einen weiteren Interrupt (mit höherer Priorität) unterbrochen wird.