Skip to content

Commit 75efdee

Browse files
committed
Revise L15
1 parent 7747c9c commit 75efdee

1 file changed

Lines changed: 92 additions & 18 deletions

File tree

15_TimerUndInterrupts.md

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ narrator: Deutsch Female
88
99
import: https://raw.githubusercontent.com/liascript-templates/plantUML/master/README.md
1010
https://github.com/LiaTemplates/Pyodide
11+
https://raw.githubusercontent.com/liaTemplates/AVR8js/main/README.md
1112
https://fjangfaragesh.github.io/AVR8js-mem/INCLUDE.md
1213
13-
script: https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js
14+
script: https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js
1415
link: https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css
1516
link: https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css
1617
@@ -577,9 +578,7 @@ Der AtMega328 bringt 4 unabhängige Timersysteme mit:
577578

578579
Dabei soll die Aufmerksamkeit zunächst auf dem 16-bit Timer/Zähler liegen.
579580

580-
![Bild](./images/15_Timer/16BitTimerAVR.png)<!-- style="width: 75%; max-width: 1000px" -->[^1]
581-
582-
[^1]: Firma Microchip, megaAVR® Data Sheet, Seite 250, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
581+
![Bild](./images/15_Timer/16BitTimerAVR.png "Timer Baustein im AVR Controller, Seite 250 [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
583582

584583
Folgende Fragen müssen wir die Nutzung des Timers beantwortet werden:
585584

@@ -588,13 +587,15 @@ Folgende Fragen müssen wir die Nutzung des Timers beantwortet werden:
588587
+ Welche maximalen und die minimalen Schranken des Zähler werden definiert?
589588
+ Wird ein Ausgang geschaltet?
590589

590+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
591+
591592
#### Timer Modi
592593

593594
Timer-Modi bestimmen das Verhalten des Zählers und der angeschlossenen Ausgänge / Interrupts. Neben dem als Normal-Mode bezeichneten Mechanismus existieren weitere Konfigurationen, die unterschiedliche Anwendungsfelder bedienen.
594595

595596
**Clear to Compare Mode (CTC)**
596597

597-
![Bild](./images/15_Timer/CTC_mode.png)<!-- style="width: 75%; max-width: 1000px" -->[^4]
598+
![Bild](./images/15_Timer/CTC_mode.png "CTC mode, Seite 141 [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
598599

599600
Die Periode über eine `OCnA` Ausgang ergibt sich entsprechend zu
600601

@@ -606,7 +607,7 @@ Der Counter läuft zwei mal durch die Werte bis zum Vergleichsregister `OCRnA`.
606607

607608
**Fast PWM**
608609

609-
![Bild](./images/15_Timer/FastPWM.png)<!-- style="width: 75%; max-width: 1000px" -->[^4]
610+
![Bild](./images/15_Timer/FastPWM.png "Fast PWM generation, Seite 141 [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
610611

611612
Die Periode des Signals an `OCRnA` wechselt während eines Hochzählens des Counters. Damit kann eine größere Frequenz bei gleicher Auflösung des Timers verglichen mit CTC erreicht werden.
612613

@@ -616,23 +617,22 @@ $$
616617

617618
**Phase Correct PWM**
618619

619-
![Bild](./images/15_Timer/PhaseCorrectPWM.png)<!-- style="width: 75%; max-width: 1000px" -->[^4]
620-
621-
[^4]: Firma Microchip, megaAVR® Data Sheet, Seite 141, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
620+
![Bild](./images/15_Timer/PhaseCorrectPWM.png "Phase correct PWM generation, Seite 141 [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
622621

623622
$$
624623
f_{OCnA} = \frac{f_{clk_i/o}}{2 \cdot N \ cdot TOP)}
625624
$$
626625

626+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
627+
627628
#### Timer-Funktionalität (Normal-Mode)
628629

629630
Für die Umsetzung eines einfachen Timers, der wie im nachfolgenden Beispiel jede
630631
Sekunde aktiv wird, genügt es einen entsprechenden Vergleichswert zu bestimmen,
631632
den der Zähler erreicht haben muss.
632633

633-
![Bild](./images/15_Timer/AVRSimpleCounter.png)<!-- style="width: 75%; max-width: 1000px" -->[^2]
634+
![Bild](./images/15_Timer/AVRSimpleCounter.png "Counter implementation, Seite 126 [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
634635

635-
[^2]: Firma Microchip, megaAVR® Data Sheet, Seite 126, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
636636

637637
<div>
638638
<wokwi-led color="red" pin="13" port="B" label="13"></wokwi-led>
@@ -672,13 +672,13 @@ int main(void)
672672
673673
Wir lassen den Controller den Vergleichswert kontinuierlich auslesen. Damit haben wir noch nichts gewonnen, weil der Einsatz der Hardware unser eigentliches System nicht entlastet. Günstiger wäre es, wenn wir ausgehend von unseren Zählerzuständen gleich eine Schaltung des Ausganges vornehmen würden.
674674
675+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
676+
675677
#### Compare Mode
676678
677679
Wir verknüpfen unseren Timer im Comparemodus mit einem entsprechenden Ausgang und stellen damit sicher, dass wir die Ausgabe ohne entsprechende Ansteuerung im Hauptprogramm aktivieren.
678680
679-
![Bild](./images/15_Timer/AVR_CompareOutput.png)<!-- style="width: 75%; max-width: 1000px" -->[^2]
680-
681-
[^2]: Firma Microchip, megaAVR® Data Sheet, Seite 126, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
681+
![Bild](./images/15_Timer/AVR_CompareOutput.png "Outputmode des Timerbausteins, Seite 126, [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
682682
683683
> **Frage:** Welchen physischen Pin des Controllers können wir mit unserem Timer 1 ansteuern?
684684
@@ -761,11 +761,12 @@ int main(void){
761761
}
762762
```
763763
764+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
765+
764766
#### Capture Mode
765767
766-
![Bild](./images/15_Timer/AVR_Capture_Unit.png)<!-- style="width: 75%; max-width: 1000px" -->[^2]
768+
![Bild](./images/15_Timer/AVR_Capture_Unit.png "Capture Mode, Seite, 126, [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
767769
768-
[^2]: Firma Microchip, megaAVR® Data Sheet, Seite 126, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
769770
770771
```cpp avrlibc.cpp
771772
#include <avr/io.h>
@@ -820,11 +821,16 @@ Zähler | + +
820821
821822
> **Problem:** Wie große ist das maximal Darstellbare Zahlenintervall?
822823
824+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
825+
823826
### Anwendungen
824827

825-
![Bild](./images/15_Timer/16BitTimerAVR.png)<!-- style="width: 75%; max-width: 1000px" -->[^1]
828+
{{0-1}}
829+
********************************************************************************
830+
831+
**Eingangszähler**
826832

827-
[^1]: Firma Microchip, megaAVR® Data Sheet, Seite 250, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
833+
![Bild](./images/15_Timer/16BitTimerAVR.png "Übersicht Timermodul Seite 250, [^megaAVR]")<!-- style="width: 75%; max-width: 1000px" -->
828834

829835
Wir wollen einen Eingangszähler entwerfen, der die Ereignisse als Zählerimpulse betrachtet und zusätzlich mit einem Schwellwert vergleicht.
830836

@@ -857,3 +863,71 @@ int main(void)
857863
return 0;
858864
}
859865
```
866+
867+
********************************************************************************
868+
869+
{{1-2}}
870+
********************************************************************************
871+
872+
**Glimmeffekt einer LED**
873+
874+
<lia-keep>
875+
<div id="example4_div_id">
876+
<span id="simulation-time"></span><br>
877+
<wokwi-led color="green" pin="9" label="B1"></wokwi-led><br>
878+
<!-- memout web komponenten -->
879+
<!-- Textausgaben -->
880+
<b>PORTB: </b> <memout-element type="bin" address="0x25"></memout-element>
881+
<b>DDRB: </b> <memout-element type="bin" address="0x24"></memout-element>
882+
<b>PINB: </b> <memout-element type="bin" address="0x23"></memout-element><br>
883+
<b>TCCR1: </b> <memout-element type="bin" address="0x80" bytes="2" endian="little"></memout-element><br>
884+
<b>TCNT1: </b> <memout-element type="bin" address="0x84" bytes="2" endian="little"></memout-element><br>
885+
<b>OCR1A: </b> <memout-element type="bin" address="0x88" bytes="2" endian="little"></memout-element><br>
886+
<!-- Diagramm -->
887+
<memout-element
888+
type="diagram2"
889+
outputs="[bytesToInt(data[0x84],data[0x85]), bytesToInt(data[0x88],data[0x89]), extractBit(data[0x23],1)*35 + 260]"
890+
color="blue"
891+
min="0"
892+
max="300"
893+
width="800"
894+
height="600"
895+
interval="1000000"
896+
title="TCNT1 und OCR1A"
897+
colors='["red","blue","green"]'
898+
labels='["TCNT1","OCR1A","LED"]'
899+
></memout-element><br>
900+
</div>
901+
</lia-keep>
902+
903+
``` cpp
904+
#ifndef F_CPU
905+
#define F_CPU 16000000UL // 16 MHz clock speed
906+
#endif
907+
908+
int main(void){
909+
DDRB |= (1 << PORTB1); //Define OCR1A as Output
910+
TCCR1A |= (1 << COM1A1) | (1 << WGM10); //Set Timer Register
911+
TCCR1B |= (1 << CS12) | (1 << CS10) | (1 << WGM12);
912+
OCR1A = 0;
913+
int timerCompareValue = 0;
914+
while(1) {
915+
while(timerCompareValue < 255){ //Fade from low to high
916+
timerCompareValue++;
917+
OCR1A = timerCompareValue;
918+
_delay_ms(4);
919+
920+
}
921+
while(timerCompareValue > 0){ //Fade from high to low
922+
timerCompareValue--;
923+
OCR1A = timerCompareValue;
924+
_delay_ms(4);
925+
}
926+
}
927+
}
928+
```
929+
@AVR8jsMem.sketch(example4_div_id,3000,1)
930+
931+
********************************************************************************
932+
933+
[^megaAVR]: Firma Microchip, megaAVR® Data Sheet, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)

0 commit comments

Comments
 (0)