Ü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
Nach Aufgabentyp: Code schreiben · Code ändern · Zeichnen/Skizzieren · Herleitungen · Register-Konfiguration · Anwendung/Design
Thema: Grundlagen & C
Ü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
Ü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
Ü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 (). 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
Ü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
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
- 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 in den Pin (Sink) → der Prozessor muss den Strom nicht selbst liefern.
Thema: Seriell / I²C
Ü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 0 → A 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.
Thema: Timer
Ü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,77 → Prescaler 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,88 → Prescaler 8. RC = 16·10⁶/(8·50) = 40 000. T_step = 8/16 MHz = 0,5 µs → RA = 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 ms → 500 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ück → s = 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 ms → f = 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 µs → RC = 1000.
Thema: Signalverarbeitung
Ü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 mV → 2^n ≥ 100/0,25 = 400 → n = 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 = 7m₄ = (8+6+10+12)/4 = 9m₅ = (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 = 192 → U = 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 Hz → Gleichanteil. 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
Ü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
Ü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 ÷ 10011 → Rest 0000 → gü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 = 01101 → 3 Einsen → d = 3.
(b) Erkennen d ≥ e+1 → 2 Fehler erkennbar; Korrigieren d ≥ 2e+1 → 1 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
Ü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
| Bit | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
|---|---|---|---|---|---|---|---|
| Aktion | - | toggle | - | - | toggle | toggle | - |
| Pegel | L | H | H | H | L | H | H |
→ 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
Ü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.
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:
| Bit | 1 | 0 | 1 | 1 | 0 |
|---|---|---|---|---|---|
| 1. Hälfte | L | H | L | L | H |
| 2. Hälfte | H | L | H | H | L |
| 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.
AW5 - Serielle Übertragungszeit (Link-Budget) Medium
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
- Start -> Slave-Adresse (7 Bit) + R/W = 0 (Write) -> auf ACK warten.
- Ggf. Registeradresse/Kommando-Byte senden (ACK).
- 8 Datenbytes (je 1 Zeile der Matrix) nacheinander, jeweils MSB zuerst, nach jedem Byte ACK.
- 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.