Skip to content

Commit 918d354

Browse files
committed
First version of L15
1 parent 02074da commit 918d354

4 files changed

Lines changed: 308 additions & 0 deletions

File tree

15_TimerUndInterrupts.md

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
<!--
2+
3+
author: Sebastian Zug & André Dietrich & Fabian Bär
4+
email: sebastian.zug@informatik.tu-freiberg.de & andre.dietrich@informatik.tu-freiberg.de & fabian.baer@student.tu-freiberg.de
5+
version: 0.0.4
6+
language: de
7+
narrator: Deutsch Female
8+
9+
import: https://raw.githubusercontent.com/liascript-templates/plantUML/master/README.md
10+
https://github.com/LiaTemplates/Pyodide
11+
12+
mark: <span style="background-color: @0;
13+
display: flex;
14+
width: calc(100% + 32px);
15+
margin: -16px;
16+
padding: 6px 16px 6px 16px;
17+
">@1</span>
18+
red: @mark(#FF888888,@0)
19+
blue: @mark(#898AE3,@0)
20+
gray: @mark(gray,@0)
21+
-->
22+
23+
# Programmierung CPU
24+
25+
**TU Bergakademie Freiberg - Wintersemester 2020 / 21**
26+
27+
Link auf die aktuelle Vorlesung im Versionsmanagementsystem GitHub
28+
29+
[https://github.com/TUBAF-IfI-LiaScript/VL_EingebetteteSysteme/blob/12_RISC_CISC.md](https://github.com/TUBAF-IfI-LiaScript/VL_EingebetteteSysteme/blob/master/12_RISC_CISC.md)
30+
31+
Die interaktive Form ist unter [diesem Link](https://liascript.github.io/course/?https://raw.githubusercontent.com/TUBAF-IfI-LiaScript/VL_EingebetteteSysteme/master/12_RISC_CISC.md#1) zu finden
32+
33+
34+
---------------------------------------------------------------------
35+
36+
** Fragen an die Veranstaltung**
37+
38+
+ Für welche Aufgaben werden die Timerfunktionen des Mikrocontrollers herangezogen?
39+
+ Wie sind ein Timer grundlegend aufgebaut (Capture&Compare)?
40+
+ Was ist PWM? Welche Arten der PWM Generierung gibt es?
41+
+ Welche Schritte werden bei der Abarbeitung von Interrupts durchlaufen?
42+
+ Welche Folgen können verpasste Interrupts haben? Beziehen Sie sich dabei insbesondere auf verschiedene Sensortypen, mit denen Sie in der Übung gearbeitet haben.
43+
+ Woraus ergibt sich die Prioritätenfolge der Interrupts beim AVR?
44+
+ Nennen Sie Interruptquellen beim AVR?
45+
+ Wie viele Interrupts können sich beim Atmega stauen, ohne dass einer verloren geht?
46+
47+
<!--
48+
style="width: 80%; min-width: 420px; max-width: 720px;"
49+
-->
50+
```ascii
51+
52+
Abstraktionsebenen
53+
54+
+----------------------------+ -.
55+
Ebene 6 | Problemorientierte Sprache | | ╔═══════════════╗
56+
+----------------------------+ | ◀══║ HIER SIND WIR!║
57+
⎬ ╚═══════════════╝
58+
+----------------------------+ | Anwendungssoftware
59+
Ebene 5 | Assemblersprache | |
60+
+----------------------------+ -.
61+
62+
+----------------------------+
63+
Ebene 4 | Betriebssystem | Systemsoftware
64+
+----------------------------+
65+
66+
+----------------------------+
67+
Ebene 3 | Istruktionsset | Maschinensprache
68+
+----------------------------+
69+
70+
+----------------------------+ -.
71+
Ebene 2 | Mikroarchitektur | |
72+
+----------------------------+ |
73+
⎬ Automaten, Speicher, Logik
74+
+----------------------------+ |
75+
Ebene 1 | Digitale Logik | |
76+
+----------------------------+ -.
77+
78+
+----------------------------+
79+
Ebene 0 | E-Technik, Physik | Analoge Phänomene
80+
+----------------------------+ .
81+
```
82+
83+
---------------------------------------------------------------------
84+
85+
## Exkurs: Interrupts
86+
87+
Ein Interrupt beschreibt die kurzfristige Unterbrechung der normalen Programmausführung, um einen, in der Regel kurzen, aber zeitlich kritischen, Vorgang abzuarbeiten.
88+
89+
```text @plantUML.png
90+
@startuml
91+
ditaa
92+
Hauptprogramm Interrupt-Routine
93+
94+
+---------------+
95+
: ... |
96+
+---------------+
97+
: Instruktion 1 | +-------------+
98+
+---------------+ | |
99+
Interrupt tritt auf -> : Instruktion 2 | | v
100+
+---------------+ | +---------------+
101+
| | : Instruktion A |
102+
+--------------+ +---------------+
103+
: Instruktion B |
104+
+--------------+ +---------------+
105+
| | : Instruktion C |
106+
+---------------+ | +---------------+
107+
: Instruktion 3 | | |
108+
+---------------+ +-------------+
109+
: Instruktion 4 |
110+
+---------------+
111+
: ... |
112+
+---------------+
113+
114+
@enduml
115+
```
116+
117+
Interrupt-Quellen können unter anderem die im folgenden Abschnitt beschriebenen Timerkomponenten sein. Im nächsten Kapitel wird dann detailliert auf das Interruptsystem des Controllers eingegangen.
118+
119+
## Motivation
120+
121+
Aufgaben von Timer/Counter Lösungen in einem Mikrocontroller:
122+
123+
+ Zählen von Ereignissen
124+
+ Messen von Zeiten, Frequenzen, Phasen, Perioden
125+
+ Erzeugen von Intervallen, Pulsfolgen, Interrupts
126+
+ Überwachen von Ereignissen und Definition von Zeitstempeln
127+
128+
Die Grundstruktur eines Zählerbaustein ergibt sich aus folgenden Komponenten:
129+
130+
```text @plantUML.png
131+
@startuml
132+
ditaa
133+
+------------+
134+
| |
135+
| v
136+
| +-------------------+ interner Interrupt
137+
| : Startwertregister | Takt
138+
| +-------------------+ | ^
139+
| | v |
140+
| v +-----------------+
141+
| +-------------------+ | | <---- Externer Takt
142+
| | Zählereinheit |<------->| Steuerung |
143+
| | vorwärts/rückwärts| | (Taktauswahl | <---- Aktivierung
144+
| +-------------------+ | Ausgabe) |
145+
| | | | ----> Ausgabe
146+
| v +++++++++++++++++++
147+
| +-------------------+
148+
| : Zählerregister |
149+
| +-------------------+
150+
| |
151+
+------------+
152+
@enduml
153+
```
154+
155+
Capture/Compare-Einheiten Nutzen die Basis-Timerimplementierung. Sie können externe Signale aufnehmen und vergleichen, aber beispielsweise auch Pulsmuster erzeugen.
156+
157+
Sie besitzt meist mehrere Betriebsmodi:
158+
159+
+ Timer/Zähler-Modus: Aufwärtszählen mit verschiedenen Quellen als Taktgeber. Bei Zählerüberlauf kann ein Interrupt ausgelöst werden.
160+
161+
+ Capture-Modus: Beim Auftreten eines externen Signals wird der Inhalt des zugeordneten (laufenden) Timers gespeichert. Auch hier kann ein Interrupt ausgelöst werden.
162+
163+
```text @plantUML.png
164+
@startuml
165+
ditaa
166+
+------------+
167+
| |
168+
| v +-------------------+
169+
| +-------------------+ interner | Interrupt cFF4 |
170+
| : Startwertregister | Takt +-------------------+
171+
| +-------------------+ | ^
172+
| | v |
173+
| v +-----------------+
174+
| +-------------------+ | | <---- Externer Takt
175+
| | Zählereinheit |<------->| Steuerung | +-------------------------+
176+
| | vorwärts/rückwärts| | (Taktauswahl | <---- |Aktivierung über Pin cFF4|
177+
| +-------------------+ | Ausgabe) | +-------------------------+
178+
| | | | ----> Ausgabe
179+
| v +++++++++++++++++++
180+
| +-------------------+
181+
| : Zählerregister |
182+
| +-------------------+
183+
| | |
184+
+------------+ v
185+
+--------------------+
186+
|Captureregister cFF4|
187+
+--------------------+
188+
@enduml
189+
```
190+
191+
+ Compare-Modus: Der Zählerstand des zugeordneten Timers wird mit dem eines Registers verglichen. Bei Übereinstimmung kann ein Interrupt ausgelöst werden.
192+
193+
```text @plantUML.png
194+
@startuml
195+
ditaa
196+
+------------+
197+
| |
198+
| v +-------------------+
199+
| +-------------------+ interner | Interrupt cFF4 |
200+
| : Startwertregister | Takt +-------------------+
201+
| +-------------------+ | ^
202+
| | v |
203+
| v +-----------------+
204+
| +-------------------+ | | <---- Externer Takt
205+
| | Zählereinheit |<------->| Steuerung |
206+
| | vorwärts/rückwärts| | (Taktauswahl | <---- Aktivierung über Pin
207+
| +-------------------+ +---->| Ausgabe, | +-------------------------+
208+
| | | | Vergleich) | ----> | Ausgabe cFF4|
209+
| v | +++++++++++++++++++ +-------------------------+
210+
| +-------------------+ | ^
211+
| : Zählerregister |---+ |
212+
| +-------------------+ v
213+
| | +--------------------+
214+
+------------+ |Compareregister cFF4|
215+
+--------------------+
216+
@enduml
217+
```
218+
219+
> **Merke:** Diese Vorgänge laufen ausschließlich in der Peripherie-Hardware ab, beanspruchen also, abgesehen von eventuellen Interrupts, keine Rechenzeit.
220+
221+
Entsprechend ergibt sich für den Compare-Modus verschiedene Anwendungen und ein zeitliches Verhalten entsprechend den nachfolgenden Grafiken.
222+
223+
![Bild](./images/15_Timer/TimerMode.png)<!-- style="width: 75%; max-width: 1000px" -->
224+
225+
![Bild](./images/15_Timer/PWMGeneration.png)<!-- style="width: 75%; max-width: 1000px" -->
226+
227+
## Umsetzung im AVR
228+
229+
Der AtMega328 bringt 4 unabhängige Timersysteme mit:
230+
231+
+ _Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode_
232+
+ _One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode_
233+
+ _Real Time Counter with Separate Oscillator_
234+
+ _Six PWM Channels_
235+
236+
Dabei soll die Aufmerksamkeit zunächst auf dem 16-bit Timer/Zähler liegen.
237+
238+
![Bild](./images/15_Timer/16BitTimerAVR.png)<!-- style="width: 75%; max-width: 1000px" -->[^1]
239+
240+
[^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)
241+
242+
243+
### Timer-Funktionalität
244+
245+
Für die Umsetzung eines einfachen Timers, der wie im Nachfolgenden Beispiel jede
246+
Sekunde aktiv wird, genügt es einen entsprechenden Vergleichswert zu bestimmen,
247+
den der Zähler erreicht haben muss.
248+
249+
![Bild](./images/15_Timer/AVRSimpleCounter.png)<!-- style="width: 75%; max-width: 1000px" -->[^2]
250+
251+
[^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)
252+
253+
```c /15_Timer/pollingTimer.ino
254+
#ifndef F_CPU
255+
#define F_CPU 16000000UL // 16 MHz clock speed
256+
#endif
257+
258+
//16.000.000 Hz / 1024 = 15.625
259+
260+
int main(void)
261+
{
262+
DDRB |= (1 << PB5); // Ausgabe LED festlegen
263+
// Timer 1 Konfiguration
264+
// keine Pins verbunden
265+
TCCR1A = 0;
266+
TCCR1B = 0;
267+
// Timerwert
268+
TCNT1 = 0;
269+
TCCR1B |= (1 << CS12) | (1 <<CS10); // 1024 als Prescale-Wert
270+
271+
while (1) //infinite loop
272+
{
273+
if (TCNT1>15625){
274+
TCNT1 = 0;
275+
PINB = (1 << PB5); // LED ein und aus
276+
}
277+
}
278+
}
279+
```
280+
281+
> Was stört Sie an dieser Umsetzung?
282+
283+
### PWM Generierung
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef F_CPU
2+
#define F_CPU 16000000UL // 16 MHz clock speed
3+
#endif
4+
5+
//16.000.000 Hz / 1024 = 15.625
6+
7+
int main(void)
8+
{
9+
DDRB |= (1 << PB5); // Ausgabe LED festlegen
10+
// Timer 1 Konfiguration
11+
// keine Pins verbunden
12+
TCCR1A = 0;
13+
TCCR1B = 0;
14+
// Timerwert
15+
TCNT1 = 0;
16+
TCCR1B |= (1 << CS12) | (1 <<CS10); // 1024 als Prescale-Wert
17+
18+
while (1) //infinite loop
19+
{
20+
if (TCNT1>15625){
21+
TCNT1 = 0;
22+
PINB = (1 << PB5); // LED ein und aus
23+
}
24+
}
25+
}

images/15_Timer/PWMGeneration.png

56 KB
Loading

images/15_Timer/TimerMode.png

43.6 KB
Loading

0 commit comments

Comments
 (0)