Übungen mit ausführlichen Lösungen

Startseite · Cliff Notes · Formelsammlung · Probeklausuren · Glossar

Kuratierte Aufgaben zu den wichtigsten Konzepten, mit Schritt-für-Schritt-Lösung und Methode/Begründung. Jede Aufgabe ist mit einem Schwierigkeitsgrad markiert: Easy (Abfrage/1 Schritt) · Medium (Rechnung/mehrere Fakten) · Hard (mehrstufig oder subtile Falle). Erst selbst rechnen, dann Lösung aufklappen! Alle Zahlen gehen ohne Taschenrechner auf.

Nach Thema: Grundlagen/C · ARM-Architektur · Power Mgmt · PIO · Seriell/I²C · Timer · Signalverarbeitung · Regelung · CRC · Leitungscodes · Interrupt/SWI · Diagramme · Weitere Themen

Nach Aufgabentyp: Code schreiben · Code ändern · Zeichnen/Skizzieren · Herleitungen · Register-Konfiguration · Anwendung/Design


Thema: Grundlagen & C

Kap. 1

Ü1.1 - volatile Medium

Aufgabe: Erklären Sie, warum die folgende Schleife ohne volatile fehlerhaft optimiert werden könnte, und was volatile bewirkt.

int status = 0;
void poll(void){ while(status==0) ; }
Lösung

status wird nur durch externe Hardware (z. B. ein Peripherie-Register/ISR) verändert, nicht durch den Code der Schleife. Der Compiler "sieht" nur, dass status im Schleifenrumpf nie geändert wird → er darf den Wert einmal in ein Register laden und die Schleife durch eine Endlosschleife ersetzen. Mit volatile int status; muss der Compiler bei jedem Durchlauf den tatsächlichen Wert neu lesen → die Schleife endet, wenn die Hardware status setzt.

Ü1.2 - DMA vs. Memory-Mapped I/O Easy

Aufgabe: Wahr/falsch: "DMA nennt man das Prinzip, dass der Prozessorkern auf Peripheriebausteine in gleicher Form wie auf den Arbeitsspeicher über Adressen zugreift." Begründen Sie.

Lösung

Falsch. Beschrieben ist Memory-Mapped I/O. DMA = ein separater Controller überträgt Daten zwischen Peripherie und Speicher ohne den Prozessorkern. (KL20 Aufg. 1.4 - klassische Falle.)

Ü1.3 - Bitmanipulation: setzen / löschen / toggeln / testen Easy

Aufgabe: reg ist ein 32-Bit-Register. Schreiben Sie C-Ausdrücke, um (a) Bit 5 zu setzen, (b) Bit 12 zu löschen, (c) Bit 0 zu toggeln, (d) zu prüfen, ob Bit 7 gesetzt ist.

Lösung
reg |=  (1u << 5);      // (a) setzen
reg &= ~(1u << 12);     // (b) löschen (Maske invertieren!)
reg ^=  (1u << 0);      // (c) toggeln
if (reg & (1u << 7)) { ... }   // (d) testen

Merkhilfe: |= setzt, &= ~ löscht, ^= toggelt, & testet. Alle lassen die übrigen Bits unverändert.

Ü1.4 - Der klassische Bit-Bug Medium

Aufgabe: Ein Kollege setzt Bit 5 mit reg = (1 << 5);. Warum ist das oft ein Fehler?

Lösung

reg = (1<<5) überschreibt das ganze Register mit 0x20 und löscht damit alle anderen Bits (z. B. bereits konfigurierte Pins). Zum Setzen eines einzelnen Bits ohne die anderen zu stören: reg |= (1<<5);. Genau deshalb bietet Atmel getrennte SODR/CODR-Register (atomar, kein Read-Modify-Write).

Ü1.5 - Schiebeoperationen Easy

Aufgabe: Berechnen Sie (a) 1 << 14, (b) 0x0F000000 >> 24, (c) die Maske für "Bits 8 bis 11 setzen".

Lösung

(a) 1 << 14 = 16384 (= 0x4000). (b) 0x0F000000 >> 24 = 0x0000000F = 15. (c) Bits 8-11 = 0xF << 8 = 0x00000F00.

Ü1.6 - Compiler-Optimierung Medium

Aufgabe: (a) Welche -O-Stufe zum Debuggen, welche als Release-Standard? (b) Warum ist gerade bei -O3 das Schlüsselwort volatile wichtig?

Lösung

(a) -O0 zum Debuggen (stabiles Zeilen-Mapping), -O2 als Release-Standard (gute Balance). -Os für kleine Codegröße (Flash). (b) Aggressive Optimierung entfernt "überflüssige" Lese-/Schreibzugriffe. Bei Peripherie-Registern/HW-Variablen führt das zu Fehlern (weggelassene Zugriffe). volatile verbietet diese Optimierung für die betroffene Variable.

Ü1.7 - static vs. volatile vs. const Easy

Aufgabe: Ordnen Sie zu: (1) Sichtbarkeit auf die Moduldatei beschränken, (2) Wert kann sich außerhalb des Programmflusses ändern, (3) Wert darf vom Programm nicht geändert werden.

Lösung

(1) static, (2) volatile, (3) const. Kombinationen möglich, z. B. static volatile für ein modulinternes HW-Flag; ein nur lesbares Statusregister ist const volatile.


Thema: ARM-Architektur

ARM-Architektur

ÜA.1 - CPSR-Flags nach SUBS Hard

Aufgabe: Ein SUBS-Befehl rechnet 5 - 5. Welche der Flags N, Z, C, V werden gesetzt?

Lösung

Ergebnis = 0 → Z = 1. Nicht negativ → N = 0. Bei ARM-Subtraktion bedeutet C = 1 = kein Borrow (Minuend ≥ Subtrahend), also C = 1. Kein Vorzeichenüberlauf → V = 0. Falle: Bei Subtraktion ist C=1 das "Gutfall"-Ergebnis (kein Borrow) - nicht intuitiv.

ÜA.2 - Thumb vs. ARM Medium

Aufgabe: Nennen Sie Vor- und Nachteile des Thumb-Befehlssatzes gegenüber dem 32-Bit-ARM-Satz.

Lösung

Thumb = 16-Bit-Befehle → ~65 % der Codegröße, höhere Codedichte, energieeffizienter/schneller bei 16-Bit-Speichern. Nachteile: meist nur Register R0-R7 direkt, keine bedingte Ausführung (außer Branches), auf 32-Bit-Speicher langsamer. Thumb-2 (Cortex-M3) mischt 16-/32-Bit-Befehle. Das T-Bit im CPSR zeigt den Zustand an.

ÜA.3 - Prozessormodi & Stack Pointer (Cortex-M3) Medium

Aufgabe: (a) Welche zwei Modi kennt der Cortex-M3? (b) Welcher Stack Pointer gilt wann? (c) Ist Handler Mode privilegiert?

Lösung

(a) Thread Mode (Anwendungscode, nach Reset) und Handler Mode (Exceptions/Interrupts). (b) MSP (Main SP) für OS/Handler, PSP (Process SP) für unprivilegierten Anwendungscode; nur einer ist sichtbar (banked). (c) Ja, Handler Mode ist immer privilegiert.

ÜA.4 - Pipeline-Flush Easy

Aufgabe: Der Cortex-M3 hat eine 3-stufige Pipeline (Fetch-Decode-Execute). Wann muss sie geleert ("geflusht") werden?

Lösung

Bei Branch (Sprung), Exception/Interrupt oder Breakpoint - dann sind die bereits geladenen Folgebefehle ungültig. Ein Flush kostet Takte → Branches sind "teuer".


Thema: Power Management

Kap. 2

Ü2.1 - Peripheral Clock einschalten (SAM3X) Medium

Aufgabe: Aktivieren Sie die Takte für PIOA (PID 11) und TC8 (PID 35).

Lösung
  • PID 11 < 32 → PMC->PMC_PCER0 = 1 << 11;
  • PID 35 ≥ 32 → PMC->PMC_PCER1 = 1 << (35-32); (Bit 3)

Methode: PID 0-31 → PCER0 Bit=PID; PID 32-44 → PCER1 Bit=PID−32.

Ü2.2 - Enable/Disable/Status-Konzept Medium

Aufgabe: Warum getrennte …ER/…DR/…SR-Register statt eines les-/schreibbaren Registers?

Lösung

Für atomare Bit-Operationen ohne Read-Modify-Write → keine Race Condition, wenn eine ISR gleichzeitig ein anderes Bit schaltet. Status wird über …SR nur gelesen.

Ü2.3 - Taktzustand nach Reset Easy

Aufgabe: Welcher Takt ist nach dem Reset ein-, welcher ausgeschaltet - und warum ist das sinnvoll?

Lösung

CPU-Takt: ein, Peripherie-Takt: aus. So startet der Kern sofort und schaltet dann gezielt nur die benötigte Peripherie ein → minimaler Energieverbrauch.

Ü2.4 - Warum spart ein kleinerer Takt Energie? Medium

Aufgabe: Begründen Sie, warum Reduktion der Taktfrequenz (bzw. Clock-Gating) Energie spart.

Lösung

Dynamische CMOS-Verlustleistung ist proportional zur Schaltfrequenz (PCU2fP \sim C\,U^2 f). Weniger/kein Umschalten → weniger Verbrauch. Clock-Gating (Baustein von der Clock trennen) senkt den dynamischen Anteil auf nahezu 0.

Ü2.5 - LED blinkt nicht Medium

Aufgabe: PIO ist korrekt als Ausgang konfiguriert und SODR/CODR werden geschaltet - trotzdem tut sich nichts. Was ist die wahrscheinlichste Ursache?

Lösung

Der Peripherie-Takt für den PIO-Baustein wurde nicht eingeschaltet (PMC_PCER). Ohne Clock ist der PIO-Controller "tot". Erster Blick bei nicht-funktionierender Peripherie: Power Management / PMC.


Thema: Parallele I/O

Kap. 3

Ü3.1 - SODR/CODR & 7-Segment Medium

Aufgabe: High-aktive Anzeige, a=PA0 … g=PA6, alles aus. Welche Ziffer nach PIOA->PIO_SODR = 0b1101101;?

Lösung

0b1101101 → Bits a=1,b=0,c=1,d=1,e=0,f=1,g=1 → Segmente a, c, d, f, g → Ziffer 5.

Ü3.2 - Init-Reihenfolge Easy

Aufgabe: Richtige Reihenfolge von PIO_OER, PMC_PCER, PIO_PER, SODR?

Lösung
  1. PMC_PCER (Clock an) → 2. PIO_PER (Pin dem PIO zuordnen) → 3. PIO_OER (als Ausgang) → 4. SODR/CODR (Pegel).

Ü3.3 - Taster mit Pull-Widerstand Medium

Aufgabe: Ein Taster verbindet den Pin bei Betätigung mit Masse (GND). Welcher interne Widerstand ist nötig, und welche Pegel liest man?

Lösung

Pull-Up einschalten (PIO_PUER). Ruhezustand: Pin auf High (= 1); gedrückt: Low (= 0)active low. (Ohne Pull-Up wäre der offene Eingang floating → zufällige Werte.) Mechanische Taster zusätzlich entprellen.

Ü3.4 - Pin-Multiplexing (Peripheriefunktion) Medium

Aufgabe: Ein Pin soll die USART-Funktion TXD übernehmen statt normaler PIO. Welche Schritte (SAM3X)?

Lösung
  1. Peripherie-Clock einschalten (PMC). 2. Pin vom PIO lösen: PIO_PDR (PIO Disable). 3. Peripherie A oder B wählen: PIO_ABSR. Danach steuert das USART-Modul den Pin. Merke: PIO_PER = PIO steuert; PIO_PDR = Peripherie steuert.

Ü3.5 - 7-Segment: Pins sparen mit Decoder Medium

Aufgabe: Eine 4-stellige Anzeige im Zeitmultiplex. Wie viele Pins (a) ohne, (b) mit BCD-Decoder?

Lösung

(a) Ohne Decoder: 8 Segmentleitungen (a-g + dp) + 4 Stellenauswahl = 12 Pins (statt 8×4=32 ohne Multiplex). (b) Mit BCD-Decoder: 5 (4 BCD + dp) + 4 Stellenauswahl = 9 Pins.

Ü3.6 - Tastaturmatrix Medium

Aufgabe: 16 Tasten als 4×4-Matrix. Wie viele Pins statt Einzelanschluss, und wie wird abgefragt?

Lösung

4 + 4 = 8 Pins statt 16. Abfrage im Zeitmultiplex: Spalten nacheinander aktivieren (Output), Reihen messen (Input, mit Pull-Up/Down). Aus aktiver Spalte + gemessener Reihe folgt die Taste.

Ü3.7 - Warum low-aktive LED? Medium

Aufgabe: Warum werden LEDs oft low-aktiv angeschlossen (leuchten, wenn der Pin Low ist)?

Lösung

Weil die Ausgangsstufe eines µC nach Masse meist mehr Strom "sinken" kann, als sie nach High "sourcen" kann. Bei low-aktiv fließt der LED-Strom von +UB+U_B in den Pin (Sink) → der Prozessor muss den Strom nicht selbst liefern.


Thema: Seriell / I²C

Kap. 4

Ü4.1 - "9600 8N1" Easy

Aufgabe: Erklären Sie "9600 8N1" und die minimale Leitungszahl (außer Masse).

Lösung

9600 Baud, 8 Datenbits, None Parität, 1 Stoppbit. Minimal 2 Leitungen: TXD + RXD, gekreuzt.

Ü4.2 - I²C Start/Stop & ACK Medium

Aufgabe: Beschreiben Sie Start-/Stopp-Bedingung und ACK/NACK.

Lösung
  • Start: SDA fällt auf Low während SCL High. Stopp: SDA steigt auf High während SCL High.
  • Sonst ändert sich SDA nur bei SCL Low.
  • ACK = Low (Empfänger bestätigt), NACK = High. Idle = beide High.

Ü4.3 - USART Wahr/Falsch Easy

Aufgabe: "Das THR serialisiert die Daten." Richtig?

Lösung

Falsch. Das Shift-Register (TSR) serialisiert; THR ist nur der Puffer für die CPU. Empfang analog: RSR deserialisiert → aus RHR lesen.

Ü4.4 - Übertragungszeit berechnen Medium

Aufgabe: Wie lange dauert die Übertragung von 100 Bytes bei 9600 8N1?

Lösung

Pro Byte-Rahmen: 1 Start + 8 Daten + 0 Parität + 1 Stopp = 10 Bit. 100 Bytes = 1000 Bit. Zeit = 1000 / 9600 ≈ 0,104 s = 104 ms. Falle: Nicht 8 Bit pro Zeichen rechnen - der Rahmen hat 10 Bit.

Ü4.5 - Paritätsbit bestimmen Easy

Aufgabe: Datenbits 1111001. Welches Paritätsbit bei gerader (even) bzw. ungerader (odd) Parität?

Lösung

Anzahl Einsen = 5 (ungerade). Even: Paritätsbit = 1 (macht 6, gerade). Odd: Paritätsbit = 0 (5 ist schon ungerade).

Ü4.6 - Synchron vs. asynchron Easy

Aufgabe: Ist I²C synchron oder asynchron? Und RS-232? Warum braucht Async ein Startbit?

Lösung

I²C = synchron (Taktleitung SCL). RS-232 = asynchron. Async braucht ein Startbit, damit sich der Empfänger auf den Zeichenbeginn synchronisiert und danach in Bit-Mitte abtastet.

Ü4.7 - RS-232-Pegel Medium

Aufgabe: Warum nutzt RS-232 z. B. −15 V für logisch 1 und +15 V für logisch 0, und wozu ein MAX232?

Lösung

Negative Logik mit hohen Spannungen → große Störsicherheit über lange Kabel. µC arbeiten mit TTL/CMOS → ein Pegelwandler (MAX232) erzeugt die ±-Spannungen und wandelt zurück.

Ü4.8 - I²C-Arbitrierung Hard

Aufgabe: Zwei Master starten gleichzeitig; Master A adressiert 0x50, Master B 0x48 (7-Bit). Wer gewinnt die Arbitrierung?

Lösung

0x50 = 1010000, 0x48 = 1001000. Vergleich MSB zuerst: Bit6 1=1, Bit5 0=0, Bit4 A=1, B=0. B zieht SDA auf Low; A sendet 1, liest aber 0A verliert und stoppt. Master B (0x48) gewinnt. Regel: Wer als Erster eine 0 gegen die 1 eines anderen durchsetzt, gewinnt → effektiv die niedrigere Adresse. Der Verlierer stört die Übertragung nicht.

Hinweis zum Kursbezug (bitte lesen): Die folgenden Zusatzaufgaben (Ü4.9 ff.) stützen sich ausschließlich auf den in Kap. 4 behandelten Stoff. Zwei häufig erwartete I²C-Themen sind im Skript nicht enthalten und daher hier bewusst weggelassen bzw. nur als Randnotiz markiert: Clock Stretching / Taktdehnung (kommt im gesamten Kursmaterial nicht vor) und der Repeated Start (Sr) bzw. kombinierte Schreib-Lese-Zugriff (im Skript wird nur eine Start-...-Stop-Sequenz gezeigt; interne Registeradressen laufen am SAM3X über IADRSZ im TWI_MMR). Wer eine Klausur schreibt, die diese Themen behandelt, muss sie separat nachtragen.

Ü4.9 - Pull-Ups & Open-Drain Easy

Aufgabe: Warum braucht der I²C-Bus an beiden Leitungen Pull-Up-Widerstände, und wieso liegt der Bus im Ruhezustand auf High?

Lösung

Die Teilnehmer sind Open-Drain/Open-Collector: Sie können eine Leitung nur aktiv auf Low ziehen, aber nicht aktiv auf High treiben. Den High-Pegel stellt allein der Pull-Up her. Ohne Pull-Ups blieben SDA/SCL nach dem Loslassen floating → kein definierter High-Pegel, keine Kommunikation. Da im Leerlauf niemand zieht, ziehen die Pull-Ups beide Leitungen auf Highidle high. Tipp: Genau daraus folgt auch, dass mehrere Teilnehmer eine Leitung gleichzeitig auf Low ziehen dürfen (Wired-AND) - Grundlage für ACK und Arbitrierung.

Ü4.10 - Adressbyte konstruieren Medium

Aufgabe: Ein Sensor hat die 7-Bit-Adresse 0x3A. Welches erste Byte legt der Master für (a) einen Schreib- und (b) einen Lesezugriff auf den Bus (jeweils binär und hex)?

Lösung

0x3A = 011 1010 (7 Bit). Das R/W-Bit ist das LSB des ersten Bytes, also wird die Adresse um 1 nach links geschoben:

  • (a) Write (R/W=0): 0111 0100 = 0x74.
  • (b) Read (R/W=1): 0111 0101 = 0x75.

Falle: Nicht einfach 0x3A senden. Die 7-Bit-Adresse steht in den oberen 7 Bit, das R/W-Bit kommt unten dazu (Adresse × 2, ggf. +1). MSB zuerst auf dem Bus.

Ü4.11 - Übertragungszeit auf dem Bus Medium

Aufgabe: Ein Master schreibt im Standard Mode (100 kBit/s) 3 Datenbytes an einen Slave. Wie viele Taktimpulse fallen ungefähr an, und wie lange dauert das grob?

Lösung

Jedes übertragene Byte belegt 9 SCL-Takte: 8 Datenbits + 1 ACK. Übertragen werden 1 Adressbyte + 3 Datenbytes = 4 Bytes4 × 9 = 36 Taktimpulse. Bei 100 kBit/s ist 1 Bit = 10 µs36 × 10 µs = 360 µs. Mit Start- und Stop-Bedingung grob ≈ 0,38 ms. Falle: Pro Byte sind es 9 Takte (nicht 8) - das ACK-Bit wird gern vergessen. Start/Stop sind Zustandswechsel, keine vollen Datenbits.

Ü4.12 - Logikanalysator auswerten Hard

Aufgabe: Nach einer Start-Bedingung zeigt der Analysator die von SCL getakteten SDA-Werte (MSB zuerst): 1 0 1 0 0 0 1 und danach eine 0. Anschließend zieht ein anderer Baustein SDA im nächsten Takt auf 0. (a) Slave-Adresse? (b) Lese- oder Schreibzugriff? (c) Bedeutung der letzten 0?

Lösung

Die ersten 7 getakteten Bits sind die Adresse: 1010001 = 0x51. Das 8. Bit ist das R/W-Bit = 0Schreibzugriff (Master→Slave). Die vom Slave getriebene 0 danach ist das ACK (Slave 0x51 ist vorhanden und bestätigt). Falle: Das 8. Bit gehört nicht zur Adresse, sondern ist R/W. Die Adresse ist nur 7 Bit breit. Das ACK kommt vom Empfänger, hier also vom Slave.

Ü4.13 - Gültigkeitsregel für SDA Medium

Aufgabe: Zu welchem Zeitpunkt darf sich SDA ändern - und warum lassen sich Start/Stop dadurch überhaupt von normalen Datenbits unterscheiden?

Lösung

Regel: Während der Datenübertragung darf SDA sich nur ändern, wenn SCL = Low ist; bei SCL = High muss SDA stabil bleiben (der Empfänger tastet dann ab). Start und Stop sind die einzige Ausnahme: dort wechselt SDA gerade bei SCL = High. Weil eine SDA-Flanke bei SCL=High sonst nie vorkommt, ist sie eindeutig als Rahmensignal (Start = fallend, Stop = steigend) erkennbar.

Ü4.14 - Arbitrierung bis in die Daten Hard

Aufgabe: Zwei Master adressieren denselben Slave 0x50 zum Schreiben und beginnen gleichzeitig. Danach sendet Master A das Datenbyte 0x80, Master B das Datenbyte 0x40. Wer gewinnt, und an welcher Stelle entscheidet es sich?

Lösung

Adress- und R/W-Bit sind identisch (0x50, Write) → hier fällt noch keine Entscheidung, beide senden dieselben Pegel. Die Arbitrierung läuft bitweise weiter in die Daten: 0x80 = 1000 0000, 0x40 = 0100 0000. Schon am ersten Datenbit (MSB) sendet A 1, B 0. B zieht SDA auf Low; A liest 0 obwohl es 1 sendet → A verliert, Master B gewinnt. Tipp: Arbitrierung endet nicht mit der Adresse - sie vergleicht jedes Bit weiter, bis sich die Sender unterscheiden. Der Verlierer zieht sich zurück, ohne die laufende Übertragung zu stören.

Ü4.15 - Kein ACK - Ursachensuche Medium

Aufgabe: Der Master sendet Start + Adresse, aber SDA bleibt an der ACK-Stelle High (NACK). Nennen Sie zwei plausible Ursachen.

Lösung

NACK = High = keine Bestätigung. Mögliche Ursachen (zwei genügen): (1) Unter dieser Adresse antwortet kein Slave (falsche Adresse im TWI_MMR.DADR, Zahlendreher, oder Adresse ohne R/W-Bit gedacht). (2) Der Slave ist nicht versorgt/getaktet oder falsch verdrahtet. (3) Pull-Ups fehlen, sodass der Slave die Leitung gar nicht sauber auf Low ziehen kann bzw. der Bus nie High wird. Falle: NACK heißt zunächst nur "keine Reaktion" - nicht automatisch "Slave defekt". Zuerst Adresse und Pull-Ups prüfen.

Ü4.16 - Bus bleibt Low Medium

Aufgabe: Im Leerlauf messen Sie SDA und/oder SCL dauerhaft auf Low, es kommt keine Kommunikation zustande. Was erwarten Sie im gesunden Leerlauf, und was ist die typische Ursache?

Lösung

Gesund: Im Leerlauf sind beide Leitungen High (idle high durch Pull-Ups). Dauerhaft Low deutet auf: Kurzschluss nach Masse, ein Teilnehmer, der die Leitung festhält (hängender Baustein/Reset-Problem), oder fehlende/fehlerhafte Pull-Ups in Kombination mit einem aktiv ziehenden Ausgang. Ergebnis: Start-Bedingung (SDA-Flanke bei SCL=High) ist gar nicht erzeugbar → Bus blockiert.

Ü4.17 - Geschwindigkeits-Modi Easy

Aufgabe: Nennen Sie die I²C-Modi mit Raten und geben Sie an, welcher nur unidirektional (nur Schreiben) ist.

Lösung

Standard 100 kBit/s · Fast 400 kBit/s · Fast Mode Plus 1 MBit/s · High Speed 3,4 MBit/s · Ultra Fast 5 MBit/s. Ultra Fast Mode ist unidirektional (nur Schreiben).

Ü4.18 - TWI-Register am SAM3X Medium

Aufgabe: (a) In welchem Register stehen Slave-Adresse und Richtung, und welcher Wert des Richtungsbits bedeutet Lesen? (b) Skizzieren Sie den Ablauf, um als Master Transmitter ein Byte zu senden.

Lösung

(a) TWI_MMR (Master Mode Register): Slave-Adresse in DADR, Richtung in MREAD (0 = Write, 1 = Read); interne Adresslänge über IADRSZ. (b) Start setzen, Adresse+Write senden → auf TXRDY im TWI_SR warten → Byte in TWI_THR schreiben (ggf. für weitere Bytes wiederholen) → beim letzten Byte STOP im TWI_CR setzen → auf TXCOMP warten. Master aktivieren über MSEN im TWI_CR. Tipp: TXRDY = "THR frei, nächstes Byte darf rein", TXCOMP = "gesamte Übertragung inkl. Stop fertig". Nicht verwechseln.

Ü4.19 - Laborhardware Easy

Aufgabe: Besitzt der AT91 eine I²C/TWI-Einheit? Und der SAM3X? Bis zu welchem Modus kann der RP2040?

Lösung

AT91: keine I²C-Unterstützung. SAM3X: 2× TWI (Standard/Fast Mode, 7/10-Bit-Adressen, interruptfähig). RP2040: 2× I²C bis Fast Mode Plus. Falle: Eine I²C-Aufgabe, die sich explizit auf den AT91 bezieht, ist ein Hinweis auf einen Fehler in der Aufgabenstellung - der AT91 hat kein TWI.

Ü4.20 - Wahr/Falsch I²C (Klausurformat) Medium

Aufgabe [Klausurformat, vgl. KL20 Aufg. 6]: Richtig oder falsch?

  1. Start = fallende SDA-Flanke bei SCL = High.
  2. ACK ist ein High-Pegel (1).
  3. I²C überträgt Datenbits mit dem LSB zuerst.
  4. Im Ruhezustand liegen SDA und SCL auf Low.
  5. R/W-Bit = 1 bedeutet Lesen (Slave → Master).
  6. Ein Master, der 1 sendet, aber 0 auf SDA liest, hat die Arbitrierung verloren.
  7. I²C ist eine asynchrone Schnittstelle.
  8. Außerhalb von Start/Stop darf SDA sich nur ändern, während SCL Low ist.
Lösung
NrAntwortBegründung
1WahrStart = fallende SDA-Flanke bei SCL = High.
2FalschACK = Low (0), NACK = High.
3FalschI²C überträgt MSB zuerst (nur UART-Daten sind LSB zuerst).
4FalschRuhezustand = beide High (idle high durch Pull-Ups).
5WahrR/W = 1 = Read (Slave sendet), 0 = Write.
6WahrGenau das ist die Verlustbedingung der Arbitrierung.
7FalschI²C ist synchron (Taktleitung SCL).
8WahrGültigkeitsregel; Start/Stop sind die einzige Ausnahme (SCL High).

Falle: Aussagen 3 und 7 sind die klassischen Verwechslungen (MSB/LSB und sync/async).

Ü4.21 - MSB- vs. LSB-Reihenfolge Hard

Aufgabe: Das Byte 0x53 wird einmal per I²C und einmal als UART-Datenbyte gesendet. Geben Sie jeweils die Bitreihenfolge auf der Leitung an.

Lösung

0x53 = 0101 0011.

  • I²C (MSB zuerst): 0, 1, 0, 1, 0, 0, 1, 1.
  • UART-Daten (LSB zuerst): 1, 1, 0, 0, 1, 0, 1, 0.

Falle: Das ist der meistgetestete Stolperstein des Kapitels: I²C = MSB zuerst, UART-Nutzdaten = LSB zuerst. Beim UART-Rahmen kommen außen noch Start-/Stopbit dazu, die Datenbits selbst laufen aber LSB zuerst.

Ü4.22 - Wie viele Slaves? Medium

Aufgabe: Wie viele Slaves lassen sich laut Skript mit der 7-Bit-Adressierung an einem Bus betreiben?

Lösung

Laut Skript bis zu 127 Slaves über die 7-Bit-Adresse.

Hinweis (Abweichung zur Praxis): 7 Bit ergeben rechnerisch 128 Adressen; die Skript-Zahl 127 ergibt sich, wenn man die allgemeine Ruf-Adresse 0x00 (General Call) abzieht. In der realen I²C-Spezifikation sind 16 Adressen reserviert, sodass praktisch nur 112 frei nutzbar sind. Für die Klausur zählt die Skript-Angabe 127; die Diskrepanz ist hier nur zur Einordnung vermerkt.

Ü4.23 - Schreibsequenz vollständig aufschlüsseln Hard

Aufgabe: Der Master schreibt das Byte 0xA5 an den Slave mit 7-Bit-Adresse 0x21. Listen Sie die vollständige Bus-Sequenz auf (Rahmensignale, Bits, ACKs).

Lösung

0x21 = 010 0001, Write → erstes Byte 0100 0010 = 0x42. 0xA5 = 1010 0101. Ablauf (MSB zuerst):

Schritt  Ereignis                         SDA (bei SCL=High)
1        START                            SDA fällt (SCL High)
2        Adressbit 6..0                   0 1 0 0 0 0 1
3        R/W-Bit                          0   (Write)
4        ACK (vom Slave)                  0
5        Datenbit 7..0                    1 0 1 0 0 1 0 1
6        ACK (vom Slave)                  0
7        STOP                             SDA steigt (SCL High)

Als Sequenzdiagramm:

sequenceDiagram
    participant M as Master
    participant S as Slave 0x21
    M->>S: START + 0100001 + R/W=0 (Write)
    S-->>M: ACK (0)
    M->>S: Datenbyte 10100101 (0xA5, MSB zuerst)
    S-->>M: ACK (0)
    M->>S: STOP

Falle: Zwischen den beiden Bytes liegt je ein ACK vom Slave (Low). Adresse+R/W ergeben zusammen genau ein 8-Bit-Rahmenbyte (0x42), nicht 7 Bit plus separates Bit.


Thema: Timer

Kap. 5

Ü5.1 - Optimaler Prescaler + RC Medium

Aufgabe: f_CLK = 32 MHz, 16-Bit, f_A = 50 Hz. Prescaler (aus 2/8/32/128/1024) und RC?

Lösung

Ideal = 32·10⁶/(50·65536) ≈ 9,77Prescaler 32 (8 wäre zu klein → RC>65536). RC = 32·10⁶/(32·50) = 20 000 (< 65536).

Ü5.2 - Servo-PWM Medium

Aufgabe: Servo 50 Hz (20 ms), 1,5 ms High = Mitte. f_CLK=16 MHz, 16-Bit. Prescaler, RC, RA?

Lösung

Ideal ≈ 4,88Prescaler 8. RC = 16·10⁶/(8·50) = 40 000. T_step = 8/16 MHz = 0,5 µsRA = 1,5 ms/0,5 µs = 3 000 (= 7,5 %).

Ü5.3 - Signal aus Init-Code (Altklausur) Hard

Aufgabe [Q: ALT 2009]: f_CLK=16 MHz; WAVE, CPCTRG, ACPA=Set@RA, ACPC=Clear@RC, MCK/32; RA=100, RC=1000. Frequenz? Und Umbau auf symmetrisches 1-kHz-Rechteck?

Lösung

T_step = 32/16 MHz = 2 µs; T_A = 1000·2 µs = 2 ms500 Hz. High von RA…RC = 900 Schritte → 90 %. 1 kHz symmetrisch: RC = 1 ms/2 µs = 500, RA = 250 (50 %).

Ü5.4 - Capture: Periodendauer Medium

Aufgabe: Capture, Prescaler=8, f_CLK=25 MHz, RA=125, RB=3250. Periode? Mindest-Messdauer?

Lösung

T_A = (3250−125)·8/25·10⁶ = 3125·320 ns = 1 ms. Mindest-Messdauer ≥ 2·T_A = 2 ms (Worst Case).

Ü5.5 - ns pro Zählschritt Easy

Aufgabe: f_CLK = 5 MHz, Prescaler 8. ns pro Inkrement?

Lösung

T_step = 8/5·10⁶ = 1,6 µs = 1600 ns.

Ü5.6 - PWM-Tastverhältnis Easy

Aufgabe: Wave-Mode PWM (Clear@RA, Set@RC+Reset). RC = 10 000, RA = 2 500. (a) Tastverhältnis? (b) RA für 40 %?

Lösung

(a) D = RA/RC = 25 %. (b) RA = 0,40·10 000 = 4 000.

Ü5.7 - Ultraschall-Entfernung Medium

Aufgabe: Der Echo-Impuls eines HC-SR04 dauert 1,2 ms. Schallgeschwindigkeit 340 m/s. Wie weit ist die Wand entfernt?

Lösung

Schall läuft hin und zurücks = v·t/2 = 340 · 1,2·10⁻³ / 2 = 0,408/2 = 0,204 m = 20,4 cm. Falle: Ohne den Faktor /2 ergäbe sich der doppelte (falsche) Abstand.

Ü5.8 - Overflow-Zeit Medium

Aufgabe: (a) 16-Bit, f_CLK = 8 MHz, Prescaler 1024, kein RC. Nach welcher Zeit Überlauf? (b) Warum ist das beim SAM3X (32 Bit) unkritischer?

Lösung

(a) T_ovf = 2¹⁶·1024/8·10⁶ = 65536·1024/8·10⁶ ≈ 8,39 s. (b) 32 Bit → Faktor 65536 mehr Zählbereich → Überlauf erst nach Stunden; lange Zeiten ohne Kaskadierung.

Ü5.9 - Frequenzmessung via Capture Medium

Aufgabe: Prescaler=32, f_CLK=16 MHz, gemessen RA=200, RB=1200 (Periode). Frequenz?

Lösung

T = (1200−200)·32/16·10⁶ = 1000·2 µs = 2 msf = 500 Hz. (T_step = 2 µs.)

Ü5.10 - Wenn ein Timer nicht reicht Hard

Aufgabe: f_CLK = 32 MHz, 16-Bit-Zähler. Sie wollen eine Periode von 10 s. Geht das mit einem Kanal? Was tun?

Lösung

f_A = 0,1 Hz. Selbst mit Prescaler 1024: RC = 32·10⁶/(1024·0,1) = 312 500 - das ist > 65 536, passt nicht in 16 Bit. → Kaskadierung zweier Zähler oder 32-Bit-Timer. (Grenze: RC ≤ 2^Bitbreite.)

Ü5.11 - Zwei PWM-Ausgänge aus einem Zähler Easy

Aufgabe: Ein Zähler steuert TIOA (über RA) und TIOB (über RB). RC = 1000, RA = 300, RB = 700. Tastverhältnisse?

Lösung

TIOA: RA/RC = 30 %; TIOB: RB/RC = 70 %. Ein Zähler, gemeinsame Frequenz, zwei unabhängige Tastverhältnisse.

Ü5.12 - Periodischer Interrupt (Compare-Mode) Medium

Aufgabe: Ein OS-Scheduler braucht einen 1-ms-Tick. f_CLK = 8 MHz, Prescaler 8. Welcher RC, welcher Modus?

Lösung

Compare-Mode: bei Counter==RC → Interrupt + Reset. T_step = 8/8 MHz = 1 µsRC = 1000.


Thema: Signalverarbeitung

Kap. 7

Ü7.1 - Spektrum → Zeitfunktion Medium

Aufgabe: Spektrum: 50 Hz (A=2), 150 Hz (A=1). (a) f(t)? (b) sin(100π·t) enthalten? sin(300π·t)?

Lösung

(a) f(t) = 2·sin(2π·50·t) + 1·sin(2π·150·t). (b) sin(100π t)→50 Hz → A=2; sin(300π t)→150 Hz → A=1. Merkregel: sin(kπt) → f = k/2.

Ü7.2 - Abtasttheorem & Aliasing Medium

Aufgabe: f_max = 400 Hz. Welche von 700/800/850 Hz ist korrekt? Was bei 700 Hz?

Lösung

f_s > 2·400 = 800 Hz (strikt) → nur 850 Hz. Bei 700 Hz: Alias |700−400| = 300 Hz.

Ü7.3 - ADC-Wortlänge (Thermoelement) Hard

Aufgabe: 0,5 mV/°C, 0-200 °C, Auflösung 0,5 °C. Wortlänge n?

Lösung

U = 200·0,5 mV = 100 mV, Schritt = 0,5·0,5 = 0,25 mV2^n ≥ 100/0,25 = 400n = 9 (2⁹=512).

Ü7.4 - Datenmenge Easy

Aufgabe: f_s = 800 Hz, 16 Bit, 10 s. Wie viele Byte?

Lösung

800·10·2 Byte = 16 000 Byte (16 Bit = 2 Byte).

Ü7.5 - Zähl- vs. Wägeverfahren Easy

Aufgabe: "Zählverfahren ist um Faktor log(N) schneller als Wägeverfahren." Richtig?

Lösung

Falsch. Das Wägeverfahren (sukzessive Approximation, MSB zuerst) ist schneller und braucht konstant n Schritte; das Zählverfahren ist langsam und wertabhängig.

Ü7.6 - Gleitender Mittelwert berechnen Medium

Aufgabe: Messreihe x = 4, 8, 6, 10, 12, 8 (Index 0…5), gleitender Mittelwert der Ordnung n=4. Berechnen Sie die verfügbaren Mittelwerte.

Lösung

Erst ab Index 3 (n−1) berechenbar:

  • m₃ = (4+8+6+10)/4 = 7
  • m₄ = (8+6+10+12)/4 = 9
  • m₅ = (6+10+12+8)/4 = 9

Wirkung: Tiefpass (glättet Rauschen), aber verzögert.

Ü7.7 - Quantisierungsfehler Easy

Aufgabe: 10-Bit-ADC, Bereich 5 V. (a) Auflösung (1 LSB)? (b) maximaler Quantisierungsfehler?

Lösung

(a) ΔU = 5 V/2¹⁰ = 5 V/1024 ≈ 4,88 mV. (b) e_max = ½ LSB ≈ 2,44 mV.

Ü7.8 - DAC / R2R-Netzwerk Medium

Aufgabe: 8-Bit-DAC, Referenz 6 V. (a) Ausgangsänderung pro 1 Bit? (b) Ausgangsspannung für 0xC0?

Lösung

(a) 1 LSB = 6 V/2⁸ = 6 V/256 ≈ 23,4 mV. (b) 0xC0 = 192U = 192/256 · 6 V = 4,5 V.

Ü7.9 - Oversampling & Auflösung Hard

Aufgabe: Um durch Überabtastung + Mittelung 2 zusätzliche Bits zu gewinnen: um welchen Faktor muss man überabtasten?

Lösung

Pro zusätzlichem Bit ist 4×-Oversampling nötig → für 2 Bit: 4² = 16× (allgemein 4^(Δbits)). Nebeneffekte: besserer SNR, einfacherer Anti-Aliasing-Filter.

Ü7.10 - Aliasing mehrfach Hard

Aufgabe: Ein 10-Hz-Signal wird abgetastet mit (a) 12 Hz, (b) 11 Hz, (c) 5 Hz. Welche scheinbare Frequenz jeweils?

Lösung

(a) |12−10| = 2 Hz. (b) |11−10| = 1 Hz. (c) f_s = 5 Hz: Signal faltet auf |10 − 2·5| = 0 HzGleichanteil. Alle verletzen Nyquist.

Ü7.11 - Datenvolumen: HiFi vs. Telefon Medium

Aufgabe: 1 min Audio, mono. (a) HiFi 44,1 kHz/16 Bit, (b) Telefon 8 kHz/8 Bit. Datenmengen und Verhältnis?

Lösung

(a) 60·44100·16 bit = 5 292 000 Byte ≈ 5292 kByte. (b) 60·8000·8 bit = 480 000 Byte = 480 kByte. Verhältnis ≈ 11×.


Thema: Regelung

Kap. 8

Ü8.1 - PID-Anteile Easy

Aufgabe: Ordnen Sie zu: (1) eliminiert bleibende Regelabweichung, (2) reagiert sofort proportional, (3) dämpft, verstärkt aber Rauschen.

Lösung

(1) I (Integral), (2) P (Proportional), (3) D (Differential).

Ü8.2 - Windup Medium

Aufgabe: Was ist Windup, wie begegnet man ihm?

Lösung

Bei Stellglied-Sättigung wächst der I-Anteil weiter, obwohl die Stellgröße nicht steigen kann → langes Nachschwingen. Anti-Windup: I-Anteil begrenzen (Clamping).

Ü8.3 - Zweipunktregler & Hysterese Easy

Aufgabe: Warum braucht ein Zweipunktregler (Thermostat) eine Hysterese?

Lösung

Ohne Hysterese schaltet er am Sollwert sehr schnell ein/aus (Rattern). Mit Hysterese (Schmitt-Trigger): einschalten unter einer unteren, ausschalten über einer oberen Schwelle → ruhiges Schalten.

Ü8.4 - Steuerung vs. Regelung Easy

Aufgabe: Unterschied Steuerung (open loop) vs. Regelung (closed loop)? Welche reagiert auf Störungen?

Lösung

Steuerung: kein Feedback → kann auf Störungen nicht reagieren. Regelung: misst den Istwert und korrigiert die Regeldifferenz → kompensiert Störgrößen (z. B. Praktikums-Fahrzeug).

Ü8.5 - Diskretisierung & Echtzeit Hard

Aufgabe: Warum sollte die Regelschleife per Timer-Interrupt und nicht per Polling laufen, und was passiert bei schwankender Abtastzeit?

Lösung

PID-Diskretisierung nutzt die Abtastzeit T (Integral→Summe·T, Differential→Differenz/T). Ein konstantes T ist Voraussetzung für Stabilität. Polling ist nicht deterministisch → Jitter verfälscht I-/D-Anteil. Daher Timer-Interrupt (fester Takt).


Thema: CRC

Kap. 10 §7

Ü10.1 - Prüfbits berechnen Hard

Aufgabe [Q: ALT 2009]: g(x) = x⁵ + x³ + 1, Nachricht 1 0 0 1 1 1 1 1 0 0 1. Prüfbits?

Lösung

g = 101001 (6 Bit → 5 Prüfbits). Nachricht + 5 Nullen, Modulo-2-Division → Rest 01010. Gesendet: 10011111001 01010.

Ü10.2 - Generatorpolynom binär Hard

Aufgabe [Q: ALT]: CRC-5, g(x)=x⁵+x²+1. (a) Binär? (b) Prüfbits für 111 010 111?

Lösung

(a) 100101. (b) + 5 Nullen, Division → Rest 10100. Gesendet: 111010111 10100.

Ü10.3 - Gültigkeit & HW Medium

Aufgabe: Empfangen 1111 0010 (4 Daten + 4 FCS), CRC-4 10011. Gültig? Welche HW realisiert CRC?

Lösung

11110010 ÷ 10011Rest 0000gültig. HW: LFSR (Schieberegister + EXOR-Gatter).

Ü10.4 - CRC-Division komplett Medium

Aufgabe: g(x) = x³ + x² + 1, Nachricht 1010. Prüfbits Schritt für Schritt und gesendeter Code.

Lösung

g = 1101 (Grad 3 → 3 Prüfbits). Nachricht + 3 Nullen = 1010000. Modulo-2 (XOR):

1010000
1101          (Pos 0)
-------
0111000
 1101         (Pos 1)
 ------
 0001100
    1101      (Pos 3)
    ----
    0000001

Rest = 001 → Prüfbits 001, gesendet 1010001. Kontrolle: 1010001 ÷ 1101 → Rest 000.

Ü10.5 - Hamming-Distanz Medium

Aufgabe: Zwei Code-Wörter 10110 und 11011. (a) Hamming-Distanz? (b) Fehler erkennbar/korrigierbar?

Lösung

(a) XOR: 10110 ⊕ 11011 = 011013 Einsen → d = 3. (b) Erkennen d ≥ e+12 Fehler erkennbar; Korrigieren d ≥ 2e+11 Fehler korrigierbar.

Ü10.6 - CRC vs. Paritätsbit Medium

Aufgabe: Warum ist CRC einem einfachen Paritätsbit (VRC) überlegen?

Lösung

Ein Paritätsbit erkennt nur eine ungerade Anzahl Bitfehler - bei 2 (geraden) Fehlern versagt es. CRC erkennt zusätzlich Bündelfehler bis zum Grad des Polynoms und praktisch alle Mehrfachfehler; Stärke hängt vom Generatorpolynom ab.


Thema: Leitungscodes

Kap. 10

Ü11.1 - NRZ & Manchester Medium

Aufgabe [Q: ALT]: 0 1 0 1 1 0 0 0 1 0 in NRZ und Manchester (IEEE 802.3). Welcher Code ist selbsttaktend?

Lösung
  • NRZ: Pegel = Bit (0=Low, 1=High), pro Bit konstant.
  • Manchester (802.3): Mittenflanke je Bit, 1 = steigend, 0 = fallend.
  • Selbsttaktend = Manchester (Flanke in jedem Bit). NRZ nicht.

Ü11.2 - Baud vs. Bit Easy

Aufgabe: 1 MBit/s im Manchester-Code → Baudrate?

Lösung

Manchester: 1 Bit = 2 Symbole → 2 MBaud.

Ü11.3 - NRZI-S codieren Medium

Aufgabe: Codieren Sie 1 0 1 1 0 0 1 in NRZI-S (Pegelwechsel bei 0, kein Wechsel bei 1). Startpegel Low.

Lösung
Bit1011001
Aktion-toggle--toggletoggle-
PegelLHHHLHH

→ Pegelfolge L, H, H, H, L, H, H.

Ü11.4 - Manchester decodieren Medium

Aufgabe: Manchester (IEEE 802.3), vier Mittenflanken: steigend, steigend, fallend, steigend. Welche Bits?

Lösung

802.3: steigend = 1, fallend = 0 → 1 1 0 1. (Nach G. E. Thomas invertiert: 0 0 1 0.)

Ü11.5 - Grenzen von NRZI-S Hard

Aufgabe: NRZI-S soll das Sync-Problem von NRZ lösen. Bei welcher Bitfolge scheitert es trotzdem?

Lösung

NRZI-S toggelt nur bei 0. Bei einer langen Folge von Einsen gibt es keinen Pegelwechsel → wieder Synchronisationsverlust. (NRZI-M analog mit langen Nullen.) Manchester löst das vollständig (Flanke in jedem Bit).

Ü11.6 - RZ-Code Easy

Aufgabe: Vorteil und zwei Nachteile des RZ-Codes (3 Pegel)?

Lösung

Vorteil: selbsttaktend. Nachteile: doppelte Bandbreite (Baud = 2·Bitrate) und ein Gleichspannungsanteil → erschwert galvanische Trennung.


Thema: Interrupt / SWI

Kap. 6 · Kap. 9

Ü12.1 - Polling vs. Interrupt Easy

Aufgabe: Je zwei Vorteile von Polling und von Interrupts.

Lösung

Polling: einfacher; geringerer HW-Aufwand (Busy Waiting: sofortige Reaktion). Interrupt: CPU frei/Sleep (stromsparend); Ereignis wird immer überwacht, klareres Hauptprogramm.

Ü12.2 - Interrupt-Ablauf Medium

Aufgabe: Reihenfolge: (a) ISR ausführen, (b) IVR lesen, (c) Kontext sichern, (d) IRQ-Anforderung, (e) EOICR schreiben, (f) Kontext restaurieren + Rücksprung.

Lösung

d → c → b → a → e → f. (KL20 Aufg. 7.)

Ü12.3 - SWI-Nummer extrahieren Hard

Aufgabe: Wie ermittelt der ARM7-SWI-Handler die SWI-Nummer?

Lösung

Die Nummer steht im Maschinencode des Befehls. Handler lädt den Befehl an [LR−4] und maskiert die oberen 8 Bit (BIC r0,r0,#0xff000000) → 24-Bit-Nummer.

Ü12.4 - Shared-Data-Problem Medium

Aufgabe: Hauptprogramm und ISR nutzen dieselbe Variable. Was kann schiefgehen und wie schützt man sich?

Lösung

Eine Unterbrechung mitten in einer nicht-atomaren Operation führt zu inkonsistenten Daten (Race Condition). Schutz: kritischen Abschnitt durch kurzes Sperren der Interrupts kapseln; gemeinsame Variablen volatile.

Ü12.5 - AIC vs. NVIC Medium

Aufgabe: Zwei wesentliche Unterschiede zwischen AT91-AIC und Cortex-M-NVIC.

Lösung

NVIC: in den Kern integriert, automatisches Stacking, Tail-Chaining/Late-Arriving/verschachtelt, 16 Prioritäten. AIC: 8 Prioritäten + FIQ, Kontextsicherung/Reentrant explizit zu programmieren, EOICR am Ende.

Ü12.6 - Prioritätsrichtung Hard

Aufgabe: Beim NVIC (Cortex-M): laufender Interrupt hat Prioritätswert 5, ein neuer kommt mit Wert 2. Wird unterbrochen?

Lösung

Ja. Beim NVIC ist 0 = höchste Priorität - kleinerer Wert = höher. Wert 2 > Wert 5 (in Priorität) → der neue Interrupt verdrängt den laufenden. Falle: Beim AT91-AIC ist es umgekehrt (7 = höchste). Immer die Richtung prüfen!

Ü12.7 - Spurious Interrupt Medium

Aufgabe: Was ist ein "Spurious Interrupt" und warum braucht man dafür einen Handler?

Lösung

Ein Geister-Interrupt: die Anforderung verschwindet, bevor die CPU sie verarbeitet (Glitch/spätes Löschen). Der AIC liefert die Adresse aus dem Spurious Vector Register. Ein Handler ist zwingend, sonst Absturz.

Ü12.8 - Software-Interrupt: Zweck Medium

Aufgabe: Wozu dient der Software-Interrupt (SVC/SWI) und welchen Moduswechsel bewirkt er?

Lösung

Synchroner Aufruf, um vom User Mode in den privilegierten (Supervisor/Handler) Mode zu wechseln → kontrollierter Aufruf von Systemdiensten (z. B. putchar). Die Nummer im Befehl wählt den Dienst.


Thema: Diagramm-Aufgaben

Wie in der echten Klausur: aus einem Diagramm ablesen bzw. ein Signal dekodieren. Jede Grafik ist aus den Aufgabenwerten erzeugt (Grafik und Lösung stimmen also immer überein).

D1 - Timer-Signal ablesen Hard

Nachgebaut nach Musterklausur SS 2020, Aufgabe 2. Am Ausgang TIOA wird das folgende Signal gemessen. System: f_CLK = 5 MHz, 16-Bit-Zähler, Prescaler aus 2, 8, 32, 128, 1024.

010 ms20 msHL
Gemessenes Signal am Ausgang TIOA

Fragen: a) Frequenz? b) Tastverhältnis? c) optimaler Prescaler? d) ns/Zählschritt? e) RC? f) RA? g) RB für 50 % an TIOB?

Lösung
  • a) Frequenz: Periode = 10 ms → f = 1/10 ms = 100 Hz.
  • b) Tastverhältnis: High-Anteil 3 ms von 10 ms → 30 %.
  • c) Prescaler: ideal = 5·10⁶/(100·65536) ≈ 0,76 → nächstgrößer 2 (RC = 25000 ≤ 65536).
  • d) ns/Schritt: 2/5·10⁶ = 400 ns.
  • e) RC: 5·10⁶/(2·100) = 25 000.
  • f) RA: 0,30 · 25 000 = 7 500.
  • g) RB (50 %): 0,50 · 25 000 = 12 500.

D2 - Frequenzspektrum ablesen Medium

Eine Fourier-Analyse von S(t) liefert dieses Amplitudenspektrum.

f [Hz]A310012002400
Amplitudenspektrum von S(t)

Fragen: a) S(t) als Summe? b) f_max? c) minimale Abtastfrequenz? d) Alias der 400-Hz-Linie bei f_s = 700 Hz?

Lösung
  • a) S(t) = 3·sin(2π·100·t) + 1·sin(2π·200·t) + 2·sin(2π·400·t).
  • b) f_max = 400 Hz.
  • c) f_s > 2·400 = 800 Hz (strikt) → minimal etwas über 800 Hz.
  • d) Alias = |700 − 400| = 300 Hz.

D3 - Leitungscode dekodieren Medium

Das folgende Signal ist Manchester-codiert (IEEE 802.3). Welche 5 Bit stecken dahinter?

HL
Manchester-Signal (5 Bit), Bitgrenzen gestrichelt
Lösung

IEEE 802.3: steigende Mittenflanke = 1, fallende = 0. Flanken: steigend, fallend, steigend, steigend, fallend → 1 0 1 1 0. (Nach G. E. Thomas invertiert: 0 1 0 0 1.)

D4 - Capture-Messung Medium

Im Capture-Modus wird an den steigenden Flanken der Zählerstand geladen (RA bei der 1., RB bei der 2.). Gemessen: RA = 1000, RB = 9000; Prescaler = 8, f_CLK = 8 MHz.

HLRARB
Eingangssignal; RA/RB an den steigenden Flanken erfasst

Fragen: a) Periodendauer? b) Frequenz?

Lösung
  • T_step = 8/8·10⁶ = 1 µs.
  • a) T = (9000 − 1000)·1 µs = 8 ms.
  • b) f = 1/8 ms = 125 Hz.

D5 - ADC-Kennlinie ablesen Easy

Übertragungskennlinie eines ADC mit Eingangsbereich U = 8 V.

U_inCode08 V7
ADC-Übertragungskennlinie (Treppe)

Fragen: a) Wie viele Bit / Stufen? b) Auflösung (1 LSB)? c) max. Quantisierungsfehler?

Lösung
  • a) 8 Stufen = 2³ → 3 Bit.
  • b) ΔU = 8 V/8 = 1 V.
  • c) ½ LSB = 0,5 V.

D6 - Fourier-Synthese erkennen Hard

Ein periodisches Signal hat dieses Spektrum (Grundfrequenz 100 Hz).

f [Hz]A11001/33001/5500
Nur ungerade Vielfache, Amplitude ~ 1/k

Fragen: a) Welche Signalform? b) Warum nur ungerade Vielfache? c) Wie fällt die Amplitude?

Lösung
  • a) Ein Rechtecksignal (Fourier-Reihe der Rechteckfunktion).
  • b) Ein ideales Rechteck enthält nur die ungeraden Harmonischen (100, 300, 500 Hz …); die geraden heben sich auf.
  • c) Die k-te Harmonische fällt mit 1/k (1, 1/3, 1/5 …). Mehr Oberwellen → „eckiger".

Thema: Weitere Themen

Kap. 11 · SPI · Watchdog · DMA/PDC · Memory-Map · APCS

W1 - Thumb-Codedichte Medium

Aufgabe: Ein Programm belegt im 32-Bit-ARM-Code 4000 Byte. Wie groß ist es etwa im Thumb-Code, und was sind Vor- und Nachteil?

Lösung

Thumb ≈ 65 % der Codegröße → ca. 2600 Byte. Vorteil: höhere Codedichte, energieeffizienter/schneller bei 16-Bit-Speicher. Nachteil: eingeschränkter Befehlssatz (meist nur R0-R7, keine bedingte Ausführung außer Branches), auf 32-Bit-Speicher langsamer. Thumb-2 (Cortex-M3) mischt 16/32-Bit und hebt die Einschränkung auf.

W2 - Systemstart & Remapping Hard

Aufgabe: Der folgende Boot-Ablauf (AT91) ist gegeben. (a) Warum muss der RAM über Adresse 0 „remapped" werden? (b) Wozu dienen die Schritte „Vektortabelle kopieren" und „Stacks setzen"?

flowchart TD
  A["Reset: PC = 0x00000000 (ROM/Flash)"] --> B["Interrupt-Controller (AIC) initialisieren"]
  B --> C["Vektortabelle Flash nach RAM kopieren"]
  C --> D["Remapping: RAM ueber Adresse 0 einblenden (EBI)"]
  D --> E["Stacks & Stackpointer je Modus setzen"]
  E --> F["BSS / Variablen initialisieren"]
  F --> G["Sprung nach main()"]
Lösung

(a) Beim Reset startet der Prozessor bei 0x00000000; dort muss nicht-flüchtiger Speicher (ROM/Flash) liegen. Im Betrieb will man an Adresse 0 aber RAM (für eine veränderbare Vektortabelle). Ein Memory Controller (EBI) blendet daher nach dem Start den RAM über Adresse 0 ein (Remapping). (b) Vektortabelle Flash → RAM kopieren: damit Interrupt-/Exception-Vektoren zur Laufzeit gesetzt/geändert werden können. Stacks je Modus setzen: ARM7 hat pro Modus (IRQ, SVC, …) einen eigenen Stackpointer, der vor der ersten Nutzung initialisiert werden muss.

W3 - Assembler: wann sinnvoll? Easy

Aufgabe: Nennen Sie zwei Fälle, in denen Assembler nötig/sinnvoll ist, und zwei Gründe dagegen.

Lösung

Dafür: Startup-Code, Context-Switch im OS, zeitkritische ISR, extreme Optimierung, Verständnis von Compiler-Output/Fehlersuche. Dagegen: geringe Produktivität (Faktor 5-10), schlechte Lesbarkeit/Wartbarkeit, prozessorspezifisch (nicht portierbar). In großen Projekten (Linux-Kernel) < 3 %.

W4 - SPI vs. I²C Medium

Aufgabe: Nennen Sie die Leitungen einer SPI-Schnittstelle und zwei Unterschiede zu I²C.

Lösung

SPI-Leitungen: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK (Takt), SS/CS (Chip/Slave Select, pro Slave eine). Unterschiede zu I²C: (1) SPI ist Vollduplex (getrennte MOSI/MISO), I²C Halbduplex (eine SDA). (2) SPI adressiert per Chip-Select-Leitung statt per 7-Bit-Adresse. (3) SPI ist meist schneller, braucht aber mehr Leitungen. Beide sind synchron (eigener Takt).

W5 - Watchdog Easy

Aufgabe: Wozu dient ein Watchdog-Timer, und was passiert, wenn das Programm ihn nicht regelmäßig „füttert"?

Lösung

Der Watchdog überwacht die Programmaktivität: das Programm muss in regelmäßigen Abständen ein Lebenszeichen senden (Watchdog zurücksetzen/„füttern"). Bleibt das aus (Absturz/Endlosschleife), nimmt der Watchdog einen Fehler an und löst einen Reset aus. (Analogie: Totmann-Knopf.)

W6 - DMA / PDC-Transfer einrichten Hard

Aufgabe: Schreiben Sie den Code, um len Bytes aus dem Puffer buf per PDC (DMA) über USART1 zu senden, und beschreiben Sie, was am Ende passiert.

Lösung
USART1->US_TPR  = (uint32_t) buf;   // Transmit Pointer = Startadresse des Puffers
USART1->US_TCR  = len;              // Transmit Counter = Anzahl Bytes
USART1->US_PTCR = US_PTCR_TXTEN;    // PDC-Sender aktivieren

Die Hardware dekrementiert US_TCR bei jedem gesendeten Byte automatisch; erreicht der Zähler 0, wird der Interrupt ENDTX ausgelöst. Vorteil: die CPU ist während des Transfers frei (kein Byte-für-Byte-Polling).

W7 - Memory-Map: Registeradresse berechnen Medium

Aufgabe: Die PMC-Basisadresse ist 0x400E0600, das Register PMC_PCER0 liegt bei Offset 0x10. (a) Welche absolute Adresse hat PMC_PCER0? (b) Wie greift man in C darauf zu?

Lösung

(a) 0x400E0600 + 0x10 = 0x400E0610. (b) Direkt per Zeiger-Cast oder über eine Register-Struct:

*(volatile uint32_t *)(0x400E0600 + 0x10) = (1u << ID_PIOA);  // direkt
// oder sauberer:
PMC->PMC_PCER0 = (1u << ID_PIOA);   // Struct auf Basisadresse gemappt

W8 - Kaskadierung: Uhr bauen Medium

Aufgabe: Aus einem Systemtakt soll eine Uhr (Sekunden/Minuten/Stunden) entstehen. (a) Erklären Sie die gezeigte Kaskade. (b) Warum kaskadiert man überhaupt?

flowchart LR
  CLK["Systemtakt"] --> T1["Timer 1<br>Periode = 1 s"]
  T1 -->|"Ueberlauf"| T2["Timer 2<br>zaehlt 0..59 (Minuten)"]
  T2 -->|"Ueberlauf"| T3["Timer 3<br>zaehlt Stunden"]
Lösung

(a) Timer 1 erzeugt eine 1-s-Periode (RC/Prescaler passend). Sein Überlauf liefert je einen Zählimpuls an Timer 2, der bis 60 zählt (Minuten); dessen Überlauf taktet Timer 3 (Stunden). (b) Die durch die Bitbreite eines einzelnen Zählers begrenzte Zeitdauer wird durch Hintereinanderschalten erweitert - so lassen sich sehr lange Zeiten (Stunden) messen/erzeugen, die ein einzelner 16-Bit-Zähler nicht schafft.

W9 - Aufrufkonvention (APCS) Medium

Aufgabe: Wie übergibt der ARM Procedure Call Standard (APCS) Parameter und Rückgabewerte?

Lösung

Die ersten vier Argumente werden in den Registern R0-R3 übergeben, weitere über den Stack. Der Rückgabewert steht in R0. Die Rücksprungadresse liegt im Link Register (R14/LR). C unterscheidet call by value (Wert) und call by reference (Zeiger/Adresse).


Zusatzaufgaben nach Aufgabentyp

Die folgenden Aufgaben decken die freien Aufgabenformen der Altklausuren ab (Code schreiben/ändern, Zeichnen, Herleiten, Register konfigurieren, Anwendung). Skizzen sind als ASCII-Zeitdiagramme + Beschreibung gelöst. Die verwendeten Registernamen entsprechen der Vorlesungs-Notation (AT91/SAM3X).


Aufgabentyp: Code schreiben

Reines Schreiben von C-Code für die Peripherie.

CS1 - LED-Ausgang initialisieren (PIOA, high-aktiv) Medium

Aufgabe: Schreiben Sie C-Code, der die LED an PA19 (high-aktiv) initialisiert und einschaltet.

Lösung
PMC->PMC_PCER0 = (1u << ID_PIOA);   // 1) Peripherie-Takt für PIOA
PIOA->PIO_PER  = (1u << 19);        // 2) Pin vom PIO-Controller steuern
PIOA->PIO_OER  = (1u << 19);        // 3) als Ausgang
PIOA->PIO_SODR = (1u << 19);        // 4) High -> LED an (high-aktiv)

Reihenfolge merken: Takt -> PER -> OER -> Pegel. Ohne Schritt 1 ist der PIO "tot".

CS2 - Taster einlesen (active low, Pull-Up) Medium

Aufgabe: Ein Taster zieht PA11 bei Betätigung auf Masse. Schreiben Sie die Initialisierung als Eingang mit Pull-Up und eine Abfrage, die 1 liefert, wenn gedrückt.

Lösung
PMC->PMC_PCER0 = (1u << ID_PIOA);
PIOA->PIO_PER  = (1u << 11);        // PIO steuert den Pin
PIOA->PIO_ODR  = (1u << 11);        // Output Disable -> Eingang
PIOA->PIO_PUER = (1u << 11);        // Pull-Up an (Ruhe = High)

// gedrückt = Pin Low (active low):
int gedrueckt = !(PIOA->PIO_PDSR & (1u << 11));

PIO_PDSR liest den tatsächlichen Pin-Pegel. Ohne Pull-Up floatet der offene Eingang.

CS3 - Peripherie-Takte einschalten Easy

Aufgabe: Schreiben Sie eine Zeile, die die Takte für USART1 (PID 18) und TC0 (PID 27) aktiviert.

Lösung
PMC->PMC_PCER0 = (1u << 18) | (1u << 27);   // beide PIDs < 32 -> PCER0

Beide IDs liegen unter 32, also dasselbe Register. Für PID ≥ 32 wäre es PMC_PCER1 mit Bit PID-32.

CS4 - Zeichen per USART senden (Polling) Medium

Aufgabe: Schreiben Sie eine Funktion putc, die ein Byte per USART1 im Polling-Betrieb sendet.

Lösung
void putc(char c) {
    while (!(USART1->US_CSR & US_CSR_TXRDY)) ;  // warten bis Sender frei
    USART1->US_THR = c;                          // Byte ins Holding Register
}

TXRDY im US_CSR zeigt an, dass US_THR beschrieben werden darf. Das Shift-Register (TSR) serialisiert dann.

CS5 - Bit-Makros Easy

Aufgabe: Definieren Sie Makros zum Setzen, Löschen, Toggeln und Testen von Bit n in einem Register r.

Lösung
#define SET_BIT(r,n)    ((r) |=  (1u << (n)))
#define CLR_BIT(r,n)    ((r) &= ~(1u << (n)))   // Maske invertieren!
#define TGL_BIT(r,n)    ((r) ^=  (1u << (n)))
#define TST_BIT(r,n)    (((r) >> (n)) & 1u)

CS6 - Timer-Interrupt aktivieren (CMSIS) Medium

Aufgabe: Aktivieren Sie den Interrupt des Timers TC0 mit Priorität 2 (Cortex-M/NVIC) und geben Sie das Grundgerüst der ISR an.

Lösung
NVIC_SetPriority(TC0_IRQn, 2);   // 0 = höchste Priorität beim NVIC
NVIC_EnableIRQ(TC0_IRQn);

void TC0_Handler(void) {
    uint32_t status = TC0->TC_CHANNEL[0].TC_SR;  // Lesen von TC_SR löscht die Flags
    if (status & TC_SR_CPCS) {
        // RC-Compare aufgetreten -> hier reagieren
    }
}

Wichtig: im Handler TC_SR lesen, sonst bleibt das Interrupt-Flag gesetzt (Dauer-Interrupt).


Aufgabentyp: Code ändern

Gegebenen Init-Code an eine neue Vorgabe anpassen (Klassiker der Altklausuren).

CÄ1 - Symmetrisches 1-kHz-Rechteck Hard

Aufgabe [Q: ALT 2009]: Gegeben (fCLK = 16 MHz): TC_CLKS_MCK32, TC_WAVE, TC_CPCTRG, TC_ACPA_SET_OUTPUT, TC_ACPC_CLEAR_OUTPUT, TC_RA = 100, TC_RC = 1000 (erzeugt 500 Hz, 90 %). Ändern Sie auf ein symmetrisches 1-kHz-Rechteck.

Lösung

T_step = 32/16 MHz = 2 µs. Für 1 kHz: T = 1 ms -> RC = 1 ms / 2 µs = 500. Symmetrie 50 %: RA = RC/2 = 250.

timerbase->TC_RA = 250;   // war 100
timerbase->TC_RC = 500;   // war 1000

Modus/ACPA/ACPC bleiben unverändert (Set@RA, Clear@RC). (Alternativ: TIOA per Toggle an RC und RC = 500 bei halbierter Periodenlogik - siehe RK2.)

CÄ2 - Tastverhältnis ändern Easy

Aufgabe: PWM mit RC = 10000, RA = 2500 (High-Anteil = RA/RC = 25 %). Ändern Sie auf 60 %.

Lösung
timerbase->TC_RA = 6000;   // 0,60 * 10000

RC bleibt (Frequenz unverändert), nur RA steuert das Tastverhältnis.

CÄ3 - Frequenz ändern, Tastverhältnis halten Medium

Aufgabe: Gegeben (fCLK = 16 MHz, Prescaler 8): RC = 40000 (50 Hz), RA = 3000 (7,5 %). Stellen Sie auf 100 Hz um, gleiches Tastverhältnis.

Lösung

RC = fCLK/(Prescaler·f) = 16e6/(8·100) = 20000. Tastverhältnis 7,5 % beibehalten: RA = 0,075·20000 = 1500.

timerbase->TC_RC = 20000;   // war 40000
timerbase->TC_RA = 1500;    // war 3000

Beide halbieren sich (doppelte Frequenz = halbe Periode); das Verhältnis RA/RC bleibt 7,5 %.

CÄ4 - Periode vervierfachen über den Prescaler Medium

Aufgabe: Ein Signal ist mit TC_CLKS_MCK8 zu schnell. Die Periode soll 4× länger werden, ohne RA/RC zu ändern. Was tun?

Lösung

Prescaler von 8 auf 32 (Faktor 4) erhöhen:

// TC_CLKS_MCK8  ->  TC_CLKS_MCK32

T_A = RC·Prescaler/fCLK ist proportional zum Prescaler -> ×4. RA/RC (und damit das Tastverhältnis) bleiben unverändert. (Ein Faktor 2 wäre nicht möglich, da nur 2, 8, 32, 128, 1024 verfügbar sind.)

CÄ5 - Zweiten PWM-Ausgang ergänzen Medium

Aufgabe: Eine PWM läuft auf TIOA (über RA). Ergänzen Sie TIOB mit 50 % aus demselben Zähler.

Lösung
timerbase->TC_RB = timerbase->TC_RC / 2;   // 50 % für TIOB
// im TC_CMR zusätzlich die TIOB-Aktionen setzen:
//   TC_BCPB_CLEAR_OUTPUT | TC_BCPC_SET_OUTPUT

TIOB nutzt die Register RB (Compare) und BCPB/BCPC (Aktionen), analog zu RA/ACPA/ACPC bei TIOA. Frequenz ist für beide gleich (gemeinsamer Zähler, gemeinsames RC).

CÄ6 - High-aktive auf low-aktive 7-Segment-Anzeige Medium

Aufgabe: Code für eine high-aktive Anzeige benutzt SODR zum Einschalten von Segmenten. Passen Sie ihn für eine low-aktive Anzeige an.

Lösung

Bei low-aktiv leuchtet ein Segment, wenn der Pin Low ist. Also SODR und CODR vertauschen:

// high-aktiv:  einschalten = SODR,  ausschalten = CODR
// low-aktiv :  einschalten = CODR,  ausschalten = SODR
PIOA->PIO_CODR = segmentmaske;   // Segmente AN (Pin low)
PIOA->PIO_SODR = ~segmentmaske & alle_segmente;  // Rest AUS (Pin high)

Logik invertiert sich; die Pin-Zuordnung (a…g) bleibt gleich.


Aufgabentyp: Zeichnen / Skizzieren

Signale und Kennlinien skizzieren. Lösungen als ASCII-Zeitdiagramm + Beschreibung.

Z1 - PWM-Signal skizzieren Medium

Aufgabe: Wave-Mode, Set@RC (+Reset), Clear@RA, RC = 1000, RA = 250. Skizzieren Sie TIOA über eine Periode.

Lösung

Nach dem Reset (Counter = 0) ist TIOA High; bei Counter = RA = 250 wird Clear (Low); bei Counter = RC = 1000 wieder Set + Reset. -> 25 % High am Periodenanfang.

        0      250                     1000
TIOA  ┌──────┐                        ┌──────
      │ high │        low             │
   ───┘      └────────────────────────┘
      |<25%>|<-------- 75% ---------->|

Periode = 1000 Schritte; High-Anteil = RA/RC = 25 %.

Z2 - NRZ und Manchester zeichnen Medium

Aufgabe: Zeichnen Sie die Bitfolge 1 0 1 1 0 in NRZ und Manchester (IEEE 802.3).

Lösung

NRZ (Pegel = Bit): H L H H L

      1   0   1   1   0
NRZ ─┐   ┌───┐       ┌
     │ H │ L │ H   H │ L
     └───┘   └───────┘

Manchester 802.3 (Mittenflanke: 1 = steigend, 0 = fallend) - jedes Bit hat zwei Halbschritte:

Bit10110
1. HälfteLHLLH
2. HälfteHLHHL
Mittenflanke

Nur Manchester ist selbsttaktend (Flanke in jedem Bit).

Z3 - Capture-Messung skizzieren Medium

Aufgabe: Skizzieren Sie, wie im Capture-Mode die Periodendauer eines Eingangssignals über RA/RB erfasst wird.

Lösung

Zähler läuft als Sägezahn. Bei der 1. steigenden Flanke wird der Zählerstand in RA geladen, bei der 2. steigenden Flanke in RB.

Eingang ┌────┐    ┌────┐
     ───┘    └────┘    └───
        ^RA        ^RB          (Flanken laden RA, RB)
Zähler   /|   /|   /|
        / |  / |  / |          (Sägezahn)

Periodendauer T = (RB − RA)·Prescaler/fCLK. Mindestmessdauer ≥ 2·T (Worst Case).

Z4 - ADC-Kennlinie (3 Bit) skizzieren Easy

Aufgabe: Skizzieren Sie die Übertragungskennlinie eines 3-Bit-ADC (Eingang 0…U).

Lösung

Treppenfunktion mit 2³ = 8 Stufen, Stufenbreite U/8:

Code
111                        ┌──
110                    ┌───┘
101                ┌───┘
100            ┌───┘
011        ┌───┘
010    ┌───┘
001 ┌──┘
000─┘
    0    U/8  ...        U   -> Eingangsspannung

Jede Stufe entspricht 1 LSB = U/8; der Quantisierungsfehler ist max. ½ LSB.

Z5 - Aliasing skizzieren Medium

Aufgabe: Ein 10-Hz-Sinus wird mit 12 Hz abgetastet. Skizzieren Sie qualitativ, welche scheinbare Schwingung entsteht.

Lösung

Es entsteht ein Alias von 2 Hz (|12 − 10| = 2 Hz). Die Abtastpunkte liegen jeweils etwas später in der 10-Hz-Schwingung und bilden eingehüllt eine langsame 2-Hz-Welle nach.

echte 10 Hz:  ∿∿∿∿∿∿∿∿∿∿   (viele schnelle Perioden)
Abtastpunkte:                      (12 Hz)
scheinbar:    \___/‾‾‾\___/          (langsame 2-Hz-Hüllkurve)

Ursache: Nyquist verletzt (fs = 12 < 2·10 = 20 Hz).

Z6 - Zwei PWM-Ausgänge skizzieren Medium

Aufgabe: Ein Zähler (RC = 1000, Set@RC) steuert TIOA (Clear@RA, RA = 300) und TIOB (Clear@RB, RB = 700). Skizzieren Sie beide.

Lösung

Beide starten bei Counter = 0 High; TIOA fällt bei 300 (30 %), TIOB bei 700 (70 %):

        0    300        700   1000
TIOA  ┌────┐                  ┌───
   ───┘    └──────────────────┘      (30 % High)
TIOB  ┌──────────────┐        ┌───
   ───┘              └────────┘      (70 % High)

Gleiche Frequenz (f = fCLK/(Prescaler·RC)), zwei unabhängige Tastverhältnisse.


Aufgabentyp: Herleitungen

Formeln herleiten / begründen (kein Auswendiglernen).

H1 - Periodendauer T_A herleiten Medium

Aufgabe: Leiten Sie T_A = RC·Prescaler/fCLK her.

Lösung

Der Zähltakt ist fCLK/Prescaler, also dauert ein Zählschritt T_step = Prescaler/fCLK. Der Zähler läuft von 0 bis RC (RC Schritte pro Periode), daher T_A = RC·T_step = RC·Prescaler/fCLK. Umgestellt: f_A = 1/T_A = fCLK/(Prescaler·RC).

H2 - Mindest-Messdauer 2·T_A begründen Hard

Aufgabe: Warum muss die Messdauer im Capture-Mode mindestens 2·T_A betragen, um eine Periode sicher zu erfassen?

Lösung

Die Messung kann zu einem beliebigen Zeitpunkt starten. Im Worst Case beginnt sie direkt nach einer steigenden Flanke - dann liegt die nächste Flanke fast eine ganze Periode entfernt, und die übernächste nochmal eine Periode später. Um zwei Flanken (= eine volle Periode) garantiert einzufangen, muss das Messfenster daher fast zwei Periodendauern breit sein -> Messdauer ≥ 2·T_A.

H3 - ADC-Auflösung und Quantisierungsfehler Medium

Aufgabe: Leiten Sie Auflösung und maximalen Quantisierungsfehler eines n-Bit-ADC (Bereich U) her.

Lösung

n Bit -> 2^n gleich große Stufen über den Bereich U -> 1 LSB = ΔU = U/2^n. Ein analoger Wert wird auf die nächste Stufe gerundet; der Abstand zur Stufenmitte ist höchstens eine halbe Stufe -> max. Fehler = ½·LSB = U/2^(n+1).

H4 - Oversampling: +1 Bit pro Faktor 4 Hard

Aufgabe: Begründen Sie, warum 4-faches Oversampling mit Mittelung 1 zusätzliches Bit Auflösung bringt.

Lösung

Mittelt man N unabhängige Messwerte, sinkt das (unkorrelierte) Rauschen um den Faktor √N in der Amplitude. Für N = 4: √4 = 2, also halbes Rauschen = eine Stufe feiner = +1 Bit effektive Auflösung. Für b zusätzliche Bits braucht man √N = 2^b, also N = 4^b (2 Bit -> 16×). Voraussetzung: genügend Rauschen und unkorrelierte Fehler.

H5 - Nyquist-Kriterium begründen Medium

Aufgabe: Warum muss fs > 2·fmax gelten?

Lösung

Eine Sinusschwingung ist erst dann eindeutig bestimmt, wenn pro Periode mehr als zwei Abtastwerte vorliegen (ein Maximum und ein Minimum reichen gerade nicht, da Phase/Amplitude mehrdeutig werden). Für die höchste Frequenz fmax bedeutet das fs > 2·fmax. Bei fs ≤ 2·fmax fallen höhere Frequenzen als Aliase in den Basisbereich zurück.

H6 - Manchester: Baudrate = 2 × Bitrate Easy

Aufgabe: Zeigen Sie, warum die Baudrate beim Manchester-Code doppelt so hoch ist wie die Bitrate.

Lösung

Manchester codiert jedes Bit durch zwei Halbschritte (zwei Pegelzustände mit Flanke in der Mitte). Ein Symbol = ein Halbschritt -> pro Bit zwei Symbole -> Symbolrate (Baud) = 2 × Bitrate. Preis: doppelte Bandbreite; Vorteil: selbsttaktend, gleichspannungsfrei.


Aufgabentyp: Register-Konfiguration

Welche TC_CMR-Felder für ein gewünschtes Verhalten? (Vorlesungs-Notation)

RK1 - PWM auf TIOA konfigurieren Medium

Aufgabe: PWM auf TIOA, High-Anteil = RA/RC, Takt MCK/8, Reset bei RC. Welche TC_CMR-Felder?

Lösung
timer->TC_CMR = TC_WAVE               // Waveform-Modus
              | TC_CPCTRG             // Counter == RC setzt Zähler zurück
              | TC_CLKS_MCK8          // Prescaler = 8
              | TC_ACPC_SET_OUTPUT    // bei RC: TIOA = High (Set)
              | TC_ACPA_CLEAR_OUTPUT; // bei RA: TIOA = Low  (Clear)

Damit ist TIOA von 0…RA High -> High-Anteil = RA/RC. ACPA/ACPC-Code: 00 = keine, 01 = Set, 10 = Clear, 11 = Toggle.

RK2 - Symmetrisches Rechteck per Toggle Medium

Aufgabe: Wie erzeugt man ein symmetrisches Rechteck ohne RA, nur mit Toggle bei RC? Welche Frequenz ergibt sich?

Lösung
timer->TC_CMR = TC_WAVE | TC_CPCTRG | TC_CLKS_MCKx
              | TC_ACPC_TOGGLE_OUTPUT;   // bei RC: TIOA toggeln

TIOA wechselt bei jedem RC-Ereignis den Pegel -> eine volle Periode dauert 2·RC-Schritte. Daher f = fCLK/(2·Prescaler·RC), Tastverhältnis automatisch 50 %.

RK3 - Capture (Periodenmessung) konfigurieren Hard

Aufgabe: Konfigurieren Sie den Capture-Mode, um die Periodendauer über RA/RB (steigende und fallende Flanke) zu messen und den Zähler beim RB-Laden zu stoppen.

Lösung
timer->TC_CMR = TC_CLKS_MCKx        // (kein TC_WAVE -> Capture-Modus)
              | TC_ABETRG           // externer Trigger über TIOA
              | TC_ETRGEDG_RISING   // Triggerflanke = steigend (Reset)
              | TC_LDRA_RISING      // RA laden bei steigender Flanke
              | TC_LDRB_FALLING     // RB laden bei fallender Flanke
              | TC_LDBSTOP;         // Zähler stoppt, wenn RB geladen -> Messwert sicher

Fehlt TC_WAVE, ist es Capture. Impulsdauer = (RB − RA)·Prescaler/fCLK. Für die Periode (Flanke-zu-Flanke) lädt man RB bei der nächsten steigenden Flanke.

RK4 - Taktquelle wählen (SAM3X) Easy

Aufgabe: Welches TC_CMR-Feld wählt den Prescaler, und welche Teiler gehören zu TIMER_CLOCK1…4 (SAM3X)?

Lösung

Das Feld TCCLKS (TC_CLKS_...): CLOCK1 = MCK/2, CLOCK2 = MCK/8, CLOCK3 = MCK/32, CLOCK4 = MCK/128 (CLOCK5 = SLCK). Beispiel TC_CLKS_MCK8 = TIMER_CLOCK2 = Prescaler 8.

RK5 - Pin an USART-Peripherie übergeben Medium

Aufgabe: Welche PIO-Register braucht es, damit ein Pin die USART-Funktion (Peripherie A) statt normaler I/O übernimmt?

Lösung
PMC->PMC_PCER0 = (1u << ID_USART1);   // Takt fürs USART-Modul
PIOA->PIO_PDR  = pinmaske;            // PIO abschalten -> Peripherie steuert Pin
PIOA->PIO_ABSR &= ~pinmaske;          // Peripherie A wählen ( |= für Peripherie B )

Merke: PIO_PER = PIO steuert, PIO_PDR = Peripherie steuert. ABSR wählt A/B.

RK6 - RC-Compare-Interrupt aktivieren Medium

Aufgabe: Wie aktiviert man den Interrupt bei RC-Compare, und was ist im Handler zwingend zu tun?

Lösung
timer->TC_IER = TC_IER_CPCS;   // Interrupt bei RC-Compare freigeben
NVIC_EnableIRQ(TCx_IRQn);       // im NVIC freischalten

void TCx_Handler(void){
    (void) timer->TC_SR;        // TC_SR LESEN -> löscht das Interrupt-Flag!
    // ... Reaktion ...
}

Ohne das Lesen von TC_SR bleibt das Flag stehen und der Interrupt feuert endlos.


Aufgabentyp: Anwendung / Design

Integrative Aufgaben, die mehrere Konzepte verbinden (wie das Praktikum).

AW1 - Ultraschall-Distanzassistent Hard

Aufgabe: Skizzieren Sie die Mess-Kette eines HC-SR04 (Trigger + Echo) und berechnen Sie die Entfernung bei einer Echodauer von 1,5 ms (340 m/s).

Lösung
  • Trigger: kurzer Impuls (max. 10 µs) -> Timer im Wave-Mode.
  • Echo: Echodauer proportional zur Distanz -> Timer im Capture-Mode (RA/RB an den Flanken des Echo-Pins).
  • Berechnung: s = v·t/2 = 340·1,5·10⁻³ / 2 = 0,510/2 = 0,255 m = 25,5 cm (Faktor ½ wegen hin und zurück).
  • Messperiode typ. 20 ms; Ergebnis als Regelgröße an den PD/PID-Regler.

AW2 - Betriebssystem-Tick (1 ms) + Sekundenzähler Medium

Aufgabe: Erzeugen Sie einen 1-ms-Interrupt (fCLK = 8 MHz, Prescaler 8) und zählen Sie daraus volle Sekunden.

Lösung

T_step = 8/8 MHz = 1 µs -> RC = 1 ms/1 µs = 1000, Compare-Mode (RC-Compare -> Interrupt + Reset).

volatile uint32_t ms = 0, sek = 0;
void TCx_Handler(void){
    (void) timer->TC_SR;      // Flag löschen
    if (++ms >= 1000) { ms = 0; sek++; }   // 1000 Ticks = 1 s
}

AW3 - Drehzahl aus Tacho-Impulsen Medium

Aufgabe: Ein Motor liefert 1 Impuls pro Umdrehung. Der Timer misst (Capture) eine Impuls-Periode von 20 ms. Wie hoch ist die Drehzahl in U/min?

Lösung

f = 1/20 ms = 50 Umdrehungen/s -> 50·60 = 3000 U/min. (Bei k Impulsen/Umdrehung: Drehzahl = f/k.)

AW4 - DC-Motor: Drehmoment & Richtung Medium

Aufgabe: Wie stellt man mit einem Timer Drehmoment und Drehrichtung eines DC-Motors ein?

Lösung
  • Drehmoment: über das Tastverhältnis eines PWM-Signals (Wave-Mode, RA/RC). Höherer High-Anteil -> mehr mittlere Spannung -> mehr Drehmoment (idealerweise linear).
  • Drehrichtung: separater Digitalausgang (Vor/Zurück) -> Umpolung über eine H-Brücke/Relais.
  • Die PWM-Frequenz nicht zu niedrig (Stottern) und nicht zu hoch (mechanische/Schaltgrenzen) wählen.

Aufgabe: Bei 115200 Baud, 8N1: (a) wie viele Zeichen/s maximal? (b) Wie lange dauert 1 KiB (1024 Byte)?

Lösung

Rahmen = 10 Bit/Zeichen. (a) 115200/10 = 11520 Zeichen/s. (b) 1024·10 / 115200 = 10240/115200 ≈ 0,0889 s ≈ 89 ms.

AW6 - LED-Matrix per I²C ansteuern Medium

Aufgabe: Skizzieren Sie die I²C-Sequenz (Master Transmitter), um eine 8×8-LED-Matrix zeilenweise zu beschreiben.

Lösung
  1. Start -> Slave-Adresse (7 Bit) + R/W = 0 (Write) -> auf ACK warten.
  2. Ggf. Registeradresse/Kommando-Byte senden (ACK).
  3. 8 Datenbytes (je 1 Zeile der Matrix) nacheinander, jeweils MSB zuerst, nach jedem Byte ACK.
  4. Stop.

Am SAM3X (TWI): Slave-Adresse in TWI_MMR (MREAD = 0), je Byte auf TXRDY warten, in THR schreiben, beim letzten Byte STOP im TWI_CR, am Ende auf TXCOMP warten. Pull-Ups an SDA/SCL nicht vergessen.


Startseite · → Probeklausur 1 · → Formelsammlung