Ü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
Ü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.
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
IADRSZimTWI_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 High → idle 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 Bytes → 4 × 9 = 36 Taktimpulse. Bei 100 kBit/s ist 1 Bit = 10 µs → 36 × 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 = 0 → Schreibzugriff (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?
- Start = fallende SDA-Flanke bei SCL = High.
- ACK ist ein High-Pegel (1).
- I²C überträgt Datenbits mit dem LSB zuerst.
- Im Ruhezustand liegen SDA und SCL auf Low.
- R/W-Bit = 1 bedeutet Lesen (Slave → Master).
- Ein Master, der
1sendet, aber0auf SDA liest, hat die Arbitrierung verloren. - I²C ist eine asynchrone Schnittstelle.
- Außerhalb von Start/Stop darf SDA sich nur ändern, während SCL Low ist.
Lösung
| Nr | Antwort | Begründung |
|---|---|---|
| 1 | Wahr | Start = fallende SDA-Flanke bei SCL = High. |
| 2 | Falsch | ACK = Low (0), NACK = High. |
| 3 | Falsch | I²C überträgt MSB zuerst (nur UART-Daten sind LSB zuerst). |
| 4 | Falsch | Ruhezustand = beide High (idle high durch Pull-Ups). |
| 5 | Wahr | R/W = 1 = Read (Slave sendet), 0 = Write. |
| 6 | Wahr | Genau das ist die Verlustbedingung der Arbitrierung. |
| 7 | Falsch | I²C ist synchron (Taktleitung SCL). |
| 8 | Wahr | Gü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
Ü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.
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.
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.
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?
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.
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.
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).
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:
| 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.