Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Timer, Counter/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: AVR Embedded Tutorial - Timer, Counter/de

OldNewLine
1+# Timer / Counter
2+
3+## Titel
4+
5+Hier geht es nicht darum, alle Register zu verstehen. Dies sollte nur ein praktisches Beispiel sein, wie man es in FPC/Lazarus umsetzt.
6+
7+Genauere Details gibt es hier:
8+
9+- <https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR>
10+
11+## Beispiel, LEDs über Timer steuern
12+
13+Dieses Beispiel zeigt, wie man die beiden Timer eines ATtiny2313 verwenden kann. Jeder Timer steuert eine LED an, welche an Bit 0 und 1 des PortD sind. Dabei sollte die LED an PD0 etwas schneller blinken.
14+
15+### Beispiel Code
16+
17+``` pascal
18+program Project1;
19+```
20+
21+#### Timer 0 Interrupt
22+
23+``` pascal
24+procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
25+ const
26+ t = 10; // LED sollte nur bei jedem 10. Durchlauf umschalten.
27+ z: integer = 0; // Zähler für Leerdurchläufe.
28+ begin
29+ TCNT0 := 128; // Speed halbieren 0 = langsam (default)
30+ Inc(z);
31+ if (z = t) then begin
32+ PORTD := PORTD or (1 shl 0); // LED Pin0 ein
33+ end;
34+ if (z = t shl 1) then begin
35+ PORTD := PORTD and not (1 shl 0); // LED Pin0 aus
36+ z := 0;
37+ end;
38+ end;
39+```
40+
41+#### Timer 1 Interrupt
42+
43+``` pascal
44+procedure Timer1_Interrupt; public Name 'TIMER1_COMPA_ISR'; interrupt;
45+ const
46+ t = 500; // LED sollte nur bei jedem 500. Durchlauf umschalten.
47+ z: integer = 0; // Zähler für Leerdurchläufe.
48+ begin
49+ Inc(z);
50+ if (z = t) then begin
51+ PORTD := PORTD or (1 shl 1); // LED Pin1 ein
52+ end;
53+ if (z = t shl 1) then begin
54+ PORTD := PORTD and not (1 shl 1); // LED Pin1 aus
55+ z := 0;
56+ end;
57+ end;
58+```
59+
60+#### Timer initialisieren
61+
62+``` pascal
63+begin
64+ // -- Interrupt unterbinden.
65+ asm cli end;
66+
67+ // -- PD0 und PD1 auf Ausgabe stellen.
68+ DDRD := %00000011;
69+
70+ // -- Timer0 initialisieren.
71+ TCCR0A := 0;
72+ TCCR0B := %101; // CPU-Takt / 1024
73+ TIMSK := TIMSK or (1 shl OCIE0A); // Timer0 soll Interrupt auslösen.
74+
75+ // -- Timer1 initialisieren.
76+ TCCR1A := 1; // CTC-Modus
77+ TCCR1B := %010; // CPU-Takt / 8
78+ TIMSK := TIMSK or (1 shl OCIE1A); // Timer1 soll Interrupt auslösen.
79+
80+ // -- Interrupt aktivieren.
81+ asm sei end;
82+
83+ // -- Hauptschleife
84+ repeat
85+ // Mache Irgendwas.
86+ until 1 = 2;
87+end.
88+```
89+
90+## Timer extern getaktet
91+
92+Einen Timer kann man auch extern getaktet werden. Folgendes Beispiel demonstriert dies mit einem Atmega328. Zum extern takten gibt es folgende Pins am AVR:
93+
94+- **T0** taktet Timer 0
95+- **T1** taktet Timer 1
96+
97+Der Timer 2 kann **nicht** extern getaktet werden.
98+
99+### Beispiel einer Uhr
100+
101+Für eine exakte Uhr ist ein Quarz/Oszilator mit 4.194304MHz geeignet. Dieser lässt sich gut in einer 2er Potenz teilen, so das man auf einen Sekunden-Takt kommt. Hier wird der Timer 0 extern getaktet, dazu muss man den Oszilator an **T0** (PD4) anschliessen.
102+
103+#### Timer Interrupt
104+
105+Jeder 16384 Aufruf des Interupts ist eine Sekunde.
106+
107+``` pascal
108+procedure Timer0_Interrupt; public Name 'TIMER0_OVF_ISR'; interrupt;
109+ const
110+ cl = 16384 shr 1; // 4194304 / 256 / 2;
111+ zaehler: UInt16 = 0; // Zählt bis cl erreicht ist.
112+
113+ begin
114+ Inc(zaehler);
115+
116+ // Nach einer halben Sekunde LED ausschalten.
117+ if zaehler = cl then begin
118+ PORTB := PORTB and not (1 shl 5);
119+ end;
120+
121+ // Sekunde ist erreicht.
122+ if zaehler >= cl shl 1 then begin
123+ PORTB := PORTB or (1 shl 5);
124+ zaehler := 0; // Zähler zurücksetzen.
125+ end;
126+ end;
127+```
128+
129+#### Timer inizialisieren
130+
131+Der springende Punkt ist der Wert bei **TCCR0B**, dieser sagt, das der Timer extern getaktet wird.
132+
133+``` pascal
134+begin
135+ DDRB := 1 shl 5; // Pin PD5 auf Ausgabe
136+
137+ TCCR0A := %00; // Normaler Timer
138+ TCCR0B := %111; // Clock / Externer Pin TO, steigende Flanke.
139+ TIMSK0 := (1 shl TOIE0); // Timer 0 Interrupt aktivieren.
140+
141+ asm sei end; // Interrupts einschalten.
142+
143+ repeat
144+ // Hier kann die Zeit auf ein Display ausgegeben werden.
145+ until 1 = 2;
146+end.
147+```
148+
149+## Stolperfalle
150+
151+Die Namen der Proceduren können abweichen, ein Beispiel:
152+
153+``` pascal
154+// ATtiny2313
155+procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
156+// ATtiny44
157+procedure Timer0_Interrupt; public Name 'TIM0_COMPA_ISR'; interrupt;
158+```
159+
160+# Siehe auch
161+
162+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
163+
164+Autor: Mathias
165+
166+---
167+*From the Free Pascal wiki, page "AVR Embedded Tutorial - Timer, Counter/de", as it stood on 2020-01-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
168+Category: AVR/de
169+Category: Arduino/de
170+Category: Deutsch
171+Category: Embedded/de
172+Category: Tutorials/de

Back to history