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/14 00:02] – [SW2 Hello Display World - fast Counter] mexleadmin | microcontrollertechnik:skript [2024/10/28 05:04] (aktuell) – mexleadmin | ||
|---|---|---|---|
| Zeile 12: | Zeile 12: | ||
| - " | - " | ||
| - Frage an Studis "Wer weiß nicht was PWM ist?" | - Frage an Studis "Wer weiß nicht was PWM ist?" | ||
| - | |||
| In MC Studio | In MC Studio | ||
| Zeile 100: | Zeile 99: | ||
| - wichtig sind immer die Register | - wichtig sind immer die Register | ||
| - '' | - '' | ||
| - | - --> timer Counter ; für was steht '' | + | - --> timer Counter ; für was steht '' |
| - das ist der eigentliche aufsteigende Zählwert | - das ist der eigentliche aufsteigende Zählwert | ||
| + | - kann auch beschrieben werden | ||
| - '' | - '' | ||
| - '' | - '' | ||
| Zeile 110: | Zeile 110: | ||
| - TC zählt noch nicht! | - TC zählt noch nicht! | ||
| - siehe Blockdiagramm: | - siehe Blockdiagramm: | ||
| - | - Blick in die Tabellen, was bei Initialisierung des uC mit 0 passiert \\**Speziell die Register description!** | + | - Blick in die Tabellen, was bei Initialisierung des uC mit 0 passiert \\ **Speziell die __Register description__!** |
| - bei vielen ergibt '' | - bei vielen ergibt '' | ||
| - aber bei CS (clock select) bedeutet '' | - aber bei CS (clock select) bedeutet '' | ||
| - | - also '' | + | - mit CS kann der Vorteiler (prescaler) gesetzt werden, welcher für die CPU Clk zum zählen herunterteilt |
| - | - '' | + | - gut wäre '' |
| - | - jetzt zählt der Zähle echt schnell. Schneller als die Anzeige! | + | - Wo ist '' |
| + | - Eingabe von '' | ||
| + | - jetzt zählt der Zähle echt schnell. Schneller als die Anzeige! | ||
| + | - Neue Challenge: Blinken ohne '' | ||
| + | - Mit Zähler möglich! Wie? mal selbst überlegen! | ||
| + | - z.B. '' | ||
| + | - geht auch besser! Denn der Knecht kann noch mehr: | ||
| + | - Blick ins Datenblatt --> viele Seiten! | ||
| + | - Blick auf Block Diagramm des TC: | ||
| + | - '' | ||
| + | - wo geht das Vergleichsergebnis hin? | ||
| + | - zu " | ||
| + | - leider etwas irreführend, | ||
| + | - jetzt erstmal Datenblatt nach '' | ||
| + | - Oh! Kommt als Pin am Chip vor. | ||
| + | - Warum wohl? | ||
| + | - was könnte das " | ||
| + | - suchen im Datenblatt nach **__Waveform generat__** (ohne **__ion__**!) | ||
| + | - (zunächst im 8-Bit Timer gefunden) Output compare unit, block diagram | ||
| + | - hier als " | ||
| + | - Der Generator wird über die Register bits WGM und COM geändert | ||
| + | - (besser im 16-bit TC1 das Block diagramm nachsehen) | ||
| + | - wieder Register description ansehen | ||
| + | - erste Bits im TCCR1A sind COM.. | ||
| + | - Blick in die Tabelle: was muss eingestellt werden, um eine Ausgabe für die blinkende LED zu bekommen? | ||
| + | - '' | ||
| + | - wir brauchen '' | ||
| + | - '' | ||
| + | - UND: '' | ||
| + | - Output-Pin togglt! Yeah :-) | ||
| + | - Problem: wir können die Geschwnindigkeit nich richtig einstellen :-( | ||
| + | - Also Challenge: zeitlich einstellbares toggeln | ||
| + | - Bisher: timer zählt stur von 0 ... 65535, also er verwendet OCR1A gar nicht! | ||
| + | - Wäre gut den MaxWert einstellen zu können, also nach erreichen von OCR1A wieder zurück auf 0. | ||
| + | - Lösung über "Clear Timer on Compare": | ||
| + | - timing diagramm erklären | ||
| + | - Mal alle Wave Generation Modes ansehen: | ||
| + | - 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 | ||
| + | - Für uns wichtig Mode 4: da denn OCR1A der Maxwert, also die Dauer für Ein (und Dauer für Aus) beim PWM | ||
| + | - Wir müssen '' | ||
| + | - '' | ||
| + | - Und OCR1A setzen: '' | ||
| + | - Wichtig immer LED an Port bei Simulide! nicht nur auf die Animation vertrauen! | ||
| + | - Mit CS Clock select: kann es auch langsamer ausgegeben werden | ||
| + | - Ggf. auch Sound Code ansehen. | ||
| + | |||
| + | |||
| + | --> Ergebnisse: | ||
| + | - bitte immer eindeutige und konistente Namen in Ihrer Doku nutzen! | ||
| + | - Sonst werden nachfolgende Leser Probleme beim verstehen bekommen.. | ||
| + | |||
| + | |||
| + | ===== Einschub - Debugging ===== | ||
| + | |||
| + | Debugging Beispiel: DisplayAndTimer_v02 in ILIAS | ||
| + | |||
| + | 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 | ||
| + | - Ampmeter only for DC! (about 10 Hz) | ||
| + | - FETs | ||
| + | - use Relays instead \\ Change | ||
| + | - Inductance: 1 nH | ||
| + | - Resistance to 1 mOhm | ||
| + | - IOn 100 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 | ||