|
| 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 | +<!-- style="width: 75%; max-width: 1000px" --> |
| 224 | + |
| 225 | +<!-- 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 | +<!-- 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 | +<!-- 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 |
0 commit comments