Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:skript [2024/10/20 23:39] – mexleadmin | microcontrollertechnik:skript [2024/10/28 05:04] (aktuell) – mexleadmin | ||
---|---|---|---|
Zeile 177: | Zeile 177: | ||
===== Einschub - Debugging ===== | ===== Einschub - Debugging ===== | ||
- | | + | Debugging Beispiel: DisplayAndTimer_v02 in ILIAS |
- | - Logic Analyzer | + | |
- | - Scripted Modules | + | kleine Änderungen: |
+ | * Variable '' | ||
+ | * Umbenennen der Variablen über '' | ||
+ | * Beispielhaft: | ||
+ | * Kompilieren und am Bildschirm den Output ansehen | ||
+ | * Problem: Zähler scheint nur zwischen 48 und 57 zu zählen! | ||
+ | |||
+ | Tipps | ||
+ | - **Tipp 1**: Verwenden von nicht genutzten Registern | ||
+ | - nach erstem '' | ||
+ | - nach zweiten'' | ||
+ | - In Simulide: MCU Monitor >> Blick auf die beiden Register | ||
+ | - Komisch: OutputStr verändert sich zwischen beiden! | ||
+ | - **Tipp 2**: Nur absolut notwendigen Code betrachten | ||
+ | - Code soweit auskommentieren wie es nur geht. | ||
+ | - **Tipp 3**: Im Fall von Deklarationen: | ||
+ | - Nach '' | ||
+ | - RAM Table über '' | ||
+ | - auf Byte PC umschalten | ||
+ | - Suchen der Speicherzelle | ||
+ | - Geschwindigkeit reduzieren | ||
+ | - **Tipp 4**: Logic Analyzer | ||
+ | - '' | ||
+ | - '' | ||
+ | - Logic analyzer beschreiben: | ||
+ | - Trigger in Logic Analyzer | ||
+ | - **Tipp 5**: Hyper-V | ||
+ | - Windows Eingabe: '' | ||
+ | - siehe: https:// | ||
+ | - Installation dauert einige Minuten | ||
+ | - Simulide in VM ist stabiler | ||
+ | - **Tipp 6**: Scope | ||
+ | - Tracks: Aufteilen des Bildschirms | ||
+ | - Trigger | ||
+ | - Auto | ||
+ | - **Tipp 7**: Scripted Modules | ||
+ | - Beispiel DAC | ||
+ | - im Komponentenexplorer: | ||
+ | - im Dateiexplorer: | ||
+ | - Alle Dateien anklicken --> nix passiert | ||
+ | - rechten Editorbereich in Simulide öffnen (" | ||
+ | - | ||
- Known Problems | - Known Problems | ||
- Ampmeter only for DC! (about 10 Hz) | - Ampmeter only for DC! (about 10 Hz) | ||
Zeile 188: | Zeile 229: | ||
- IOn 100 mA | - IOn 100 mA | ||
- IOff 50 mA | - IOff 50 mA | ||
+ | - Beispiel: Halbbrücke (auch als FET Variante ok) | ||
+ | - Alternative mit Relays | ||
+ | - Hier besser als Umschalter umzusetzen, da Kurzschluss im Zwischenstadium {{drawio> | ||
+ | |||
+ | ===== Interrupts und Zeitslots ===== | ||
+ | Wdh: | ||
+ | - Bisher: | ||
+ | - Ausgabe auf dem Display in while-Schleife "so schnell wie's geht" | ||
+ | - Counter TC1 läuft autonom und unabhängig vom Programmcode (nach Config) | ||
+ | - Counter kann unterschiedlich schnell laufen (prescaler) | ||
+ | - Counter kann auch Ausgabe antriggern | ||
+ | - Nun: | ||
+ | - welche Modi gibts? Was kann man noch mit dem Timer/ | ||
+ | - Anschauen der verschiedenen Modi: | ||
+ | - Normal: 0 ... 65535, und dann wieder Sprung auf 0 --> OC1A ändert sich nur bei max Wert | ||
+ | - Fast PWM: | ||
+ | - 0 ... max Wert, und dann wieder Sprung auf 0 --> OC1A bei TCNT>= OCR1A gleich 0, sonst 1 | ||
+ | - Fast PWM kann verschiedene max Werte haben: 255, 511, 1023, ICR1 und sogar OCR1A selbst | ||
+ | - Ansteigende Flanke immer bei 0 --> links bündig! | ||
+ | - PWM, phase correct | ||
+ | - 0 ... max Wert, und dann: max Wert ... 0 --> OC1A bei TCNT>= OCR1A gleich 0, sonst 1 | ||
+ | - halb so schnell weil doppelte Rampe | ||
+ | - mitten zentriert | ||
+ | - weitere Register des TC anschauen | ||
+ | - TCNT1H/ | ||
+ | - OCR1AH/ | ||
+ | - OCR1BH/ | ||
+ | - ICR1H/ | ||
+ | - erst TIFR1: | ||
+ | - zeigt Ereignisse an (über Flags): z.B. Vergleichswert ist erreicht, oder Maximalwert ist erreicht | ||
+ | - wenn ein Ereignis eintritt, dann kann ein Interrupt ausgelöst werden | ||
+ | - TIMSK1 : Ist eine Maske, die angibt, welcher Interrupt aktiv ist | ||
+ | - Mal Overflow Interrupt testen: | ||
+ | - bei Initialisierung: | ||
+ | - außerhalb von main: | ||
+ | - '' | ||
+ | - wir brauchen zumindest einen " | ||
+ | - woher bekommen? | ||
+ | - am besten da nachschauen, | ||
+ | - suchen nach vector | ||
+ | - '' | ||
+ | - Eingeben von '' | ||
+ | - '' | ||
+ | - was machen wir da drin? am besten z.B. Port B3 toggeln | ||
+ | - '' | ||
+ | - testen --> toggelt! | ||
+ | - Wie könnte man nun die Ausgabe nur alle paar Zentelsekunden ausführen lassen? | ||
+ | - Alle Zeilen in den Interrupt? --> bloß nicht! | ||
+ | - SW_Flag in ISR setzen und in main auswerten | ||
+ | - '' | ||
+ | - '' | ||
+ | - '' | ||
+ | - Geschwindigkeit zu langsam? | ||
+ | - statt '' | ||
+ | - Aber wie kommt man z.b. genau auf eine Millisekunde? | ||
+ | - Man nehme: | ||
+ | - Takt: 18.432 MHz | ||
+ | - 8-Bit Counter: zählt bis 256 (16 Bit geht nicht genau auf...) | ||
+ | - --> zählt 72' | ||
+ | - Prescaler von 8: zählt 8x so langsam, also nur 9'000 pro Sekunde und löst interrupt aus | ||
+ | - Im Interrupt von 9 herunterzählen: | ||
+ | - up-Down-Counter ansehen |