Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
microcontrollertechnik:2_sound_und_timer [2022/09/19 04:28]
tfischer ============== geändert in atmega88 !!
microcontrollertechnik:2_sound_und_timer [2024/03/10 23:53] (aktuell)
mexleadmin
Zeile 1: Zeile 1:
-====== 2Sound und Timer ======+====== 2 Sound und Timer ======
  
 Details dazu sind auch unter [[https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR|Die Timer und Zähler des AVR]] bei mikrocontroller.net zu finden. Details dazu sind auch unter [[https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR|Die Timer und Zähler des AVR]] bei mikrocontroller.net zu finden.
Zeile 12: Zeile 12:
 Nach dieser Lektion sollten Sie: Nach dieser Lektion sollten Sie:
  
-  - wissen, wie man im Atmel Studio eine Puls-Signal ausgibt+  - wissen, wie man im Microchip Studio eine Puls-Signal ausgibt
  
  
Zeile 18: Zeile 18:
 ==== Video ==== ==== Video ====
    
-{{youtube>6PWEpY6SlSc?size=700x400}}+{{youtube>_cRsC6pk_oc?size=700x400}}
  
 </WRAP> </WRAP> </WRAP> </WRAP>
  
 +<WRAP hide>
 ===== LCD Display ansteuern - wie kommt Test auf eine Anzeige? ===== ===== LCD Display ansteuern - wie kommt Test auf eine Anzeige? =====
 <WRAP group>  <WRAP group> 
Zeile 39: Zeile 40:
  
 </WRAP> </WRAP> </WRAP> </WRAP>
 +</WRAP>
  
 ==== Übung ==== ==== Übung ====
Zeile 44: Zeile 46:
 --> I. Vorarbeiten # --> I. Vorarbeiten #
   - Laden Sie folgende Datei herunter:    - Laden Sie folgende Datei herunter: 
-    - {{microcontrollertechnik:2_sound_und_timer.sim1}} +    - {{microcontrollertechnik:2._sound_und_timer.sim1}} 
-    - {{microcontrollertechnik:2_sound_und_timer.hex}}+    - {{microcontrollertechnik:2._sound_und_timer.hex}}
     - {{microcontrollertechnik:lcd_lib_de.h}}     - {{microcontrollertechnik:lcd_lib_de.h}}
  
Zeile 61: Zeile 63:
     - Starten Sie die Simulation      - Starten Sie die Simulation 
       - Wenn Sie die Lautsprecher des PCs aktiv haben, werden Sie ein Knacken (und ggf. Brummen) vernehmen. Dies rührt von der unvollständigen Simulation her. Wenn Sie den den Schalter vor dem Lautsprecher schließen, so sollten Sie - zusätzlich zum Knacken - einen aufsteigenden und abfallenden Ton hören. Es ist möglich, dass dieser nach wenigen Sekunden aufhört, auch das ist eine Eigenschaft der unvollständigen Simulation.       - Wenn Sie die Lautsprecher des PCs aktiv haben, werden Sie ein Knacken (und ggf. Brummen) vernehmen. Dies rührt von der unvollständigen Simulation her. Wenn Sie den den Schalter vor dem Lautsprecher schließen, so sollten Sie - zusätzlich zum Knacken - einen aufsteigenden und abfallenden Ton hören. Es ist möglich, dass dieser nach wenigen Sekunden aufhört, auch das ist eine Eigenschaft der unvollständigen Simulation.
-      - Am Frequenzmesser ist dennoch zu sehen, dass ein Signal mit Frequenzen zwischen $500...1000Hz$ ausgegeben wird.+      - Am Frequenzmesser ist dennoch zu sehen, dass ein Signal mit Frequenzen zwischen $500...1000~\rm Hz$ ausgegeben wird.
       - Das Oszilloskopbild zeigt den Signal-Zeit-Verlauf, in welchem die länger und kürzer werdenden Wechsel von HIGH nach LOW sichtbar sind.       - Das Oszilloskopbild zeigt den Signal-Zeit-Verlauf, in welchem die länger und kürzer werdenden Wechsel von HIGH nach LOW sichtbar sind.
       - Die LED zeigt nun an, ob es sich um einen aufsteigenden oder abfallenden Ton handelt       - Die LED zeigt nun an, ob es sich um einen aufsteigenden oder abfallenden Ton handelt
Zeile 68: Zeile 70:
  
 <-- <--
---> III. Eingabe in Atmel Studio # +--> III. Eingabe in Microchip Studio # 
-  - öffnen Sie Atmel Studio+  - öffnen Sie Microchip Studio
   - legen Sie ein neues "GCC C Executable Project" mit dem Namen ''2_sound_und_timer'' für einen ATmega88 an   - legen Sie ein neues "GCC C Executable Project" mit dem Namen ''2_sound_und_timer'' für einen ATmega88 an
   - Bevor das eigentliche Coding beginnt sollte immer eine Beschreibung dem Code vorangestellt werden. Hierzu kann folgende Vorlage verwendet werden: <sxh c; first-line: 1>   - Bevor das eigentliche Coding beginnt sollte immer eine Beschreibung dem Code vorangestellt werden. Hierzu kann folgende Vorlage verwendet werden: <sxh c; first-line: 1>
Zeile 77: Zeile 79:
 ============= =============== ============= ===============
  
-Dateiname: 2_Sound.c+Dateiname: 2_sound_und_timer.c
  
 Autoren : Peter Blinzinger Autoren : Peter Blinzinger
Zeile 128: Zeile 130:
 // Festlegung der Quarzfrequenz // Festlegung der Quarzfrequenz
 #ifndef F_CPU                   // optional definieren #ifndef F_CPU                   // optional definieren
-#define F_CPU 8000000UL        // ATmega 328 mit MHz Quarz+#define F_CPU 18432000UL        // MiniMEXLE nutzt einen ATmega88 mit 18,432 MHz Quarz
 #endif #endif
  
Zeile 137: Zeile 139:
  
 // Konstanten // Konstanten
-#define MIN_PER     124          // minimale Periodendauer in "Timerticks" +#define MIN_PER     143          // minimale Periodendauer in "Timerticks" 
-#define MAX_PER     249         // maximale Periodendauer in "Timerticks"+#define MAX_PER     239         // maximale Periodendauer in "Timerticks"
 #define WAIT_TIME   2000        // Wartezeit zwischen Flanken in ms #define WAIT_TIME   2000        // Wartezeit zwischen Flanken in ms
  
Zeile 155: Zeile 157:
     - ''Quarzfrequenz'': Die Taktfrequenz des Microcontrollers kann entweder intern oder extern definiert werden. Diese Frequenz sollte immer angegeben werden. Wird dies nicht vorgenommen, kann es Probleme bei der Handhabung von Wartezeiten ("Delays") geben. In Simulide kann die Frequenz des externen Quarz eingegeben werden - diese sollte zum in der Software angegebenen Frequenz passen. Die Angabe ''#ifndef'' ist hier eine Compiler-Direktive und keine C-Code. Wie alle anderen Deklarationen sind alle Zeilen nach der einem ''#'' __vor__ der Ausführung des Codes im Controller zur Zeit der hexfile-Erstellung im Compiler wichtig. ''#ifndef'' prüft hierbei, ob ein Symbol bereits in einem anderen File definiert wurde.     - ''Quarzfrequenz'': Die Taktfrequenz des Microcontrollers kann entweder intern oder extern definiert werden. Diese Frequenz sollte immer angegeben werden. Wird dies nicht vorgenommen, kann es Probleme bei der Handhabung von Wartezeiten ("Delays") geben. In Simulide kann die Frequenz des externen Quarz eingegeben werden - diese sollte zum in der Software angegebenen Frequenz passen. Die Angabe ''#ifndef'' ist hier eine Compiler-Direktive und keine C-Code. Wie alle anderen Deklarationen sind alle Zeilen nach der einem ''#'' __vor__ der Ausführung des Codes im Controller zur Zeit der hexfile-Erstellung im Compiler wichtig. ''#ifndef'' prüft hierbei, ob ein Symbol bereits in einem anderen File definiert wurde.
     - ''Header includes'': Header-Dateien sollten bereits aus der Informatik 2 bekannt sein. Bei IDEs wird häufig zwischen Dateien unterschieden,  welche in den Ordnern der IDE und Dateien, welche im Projektordner liegen. Hier sollen folgende Header-Dateien genutzt werden:     - ''Header includes'': Header-Dateien sollten bereits aus der Informatik 2 bekannt sein. Bei IDEs wird häufig zwischen Dateien unterschieden,  welche in den Ordnern der IDE und Dateien, welche im Projektordner liegen. Hier sollen folgende Header-Dateien genutzt werden:
-      - ''<avr/io.h>'': Header-Datei, welche Input/Output Bezeichner für Pins und Ports definiert. Da im Folgenden bestimmte Ports angesprochen werden sollen, ist diese Header-Datei wichtig. Die Header-Datei liegt im Unterordner ''avr'' in den Ordnern der IDE. Diese wurde bereits schon im Bespiel [[1._hello_blinking_world]] verwendet. +      - ''<avr/io.h>'': Header-Datei, welche Input/Output Bezeichner für Pins und Ports definiert. Da im Folgenden bestimmte Ports angesprochen werden sollen, ist diese Header-Datei wichtig. Die Header-Datei liegt im Unterordner ''avr'' in den Ordnern der IDE. Diese wurde bereits schon im Bespiel [[1_hello_blinking_world]] verwendet. 
-      - ''<util/delay.h>'': Header-Datei, welche einen einfachen Umgang mit Wartezeiten ermöglicht. Diese wurde bereits schon im Bespiel [[1._hello_blinking_world]] verwendet. +      - ''<util/delay.h>'': Header-Datei, welche einen einfachen Umgang mit Wartezeiten ermöglicht. Diese wurde bereits schon im Bespiel [[1_hello_blinking_world]] verwendet. 
-      - ''"lcd_lib_de.h"'': Diese Header-Datei sollte im Projektordner eingefügt sein. Bei einem neuen Projekt ist sie dies noch nicht. <WRAP right>{{microcontrollertechnik:atmelstudio_addexistingitem.jpg?400}}</WRAP> <panel type="info" title="To Do: notwendige header-Dateien">**Bitte fügen Sie die Datei lcd_lib_de.h in den Projektordner ein** \\ Dazu sollten Sie im Solution Explorer auf das Projekt rechts-klicken (hier ''2_Sound'') >> Add >> Existing Item... (siehe Bild rechts). \\ Die gewünschte Datei (hier: die heruntergeladene ''lcd_lib_de.h'') auswählen und mit Add hinzufügen. Die Datei sollte nun im Solution Explorer angezeigt werden.</panel>+      - ''%%"lcd_lib_de.h"%%'': Diese Header-Datei sollte im Projektordner eingefügt sein. Bei einem neuen Projekt ist sie dies noch nicht. <WRAP right>{{microcontrollertechnik:atmelstudio_addexistingitem.jpg?400}}</WRAP> <panel type="info" title="To Do: notwendige header-Dateien">**Bitte fügen Sie die Datei lcd_lib_de.h in den Projektordner ein** \\ Dazu sollten Sie im Solution Explorer auf das Projekt rechts-klicken (hier ''2. Sound und Timer'') >> Add >> Existing Item... (siehe Bild rechts). \\ Die gewünschte Datei (hier: die heruntergeladene ''lcd_lib_de.h'') auswählen und mit Add hinzufügen. Die Datei sollte nun im Solution Explorer angezeigt werden.</panel>
     - ''#defines'': Über ''#defines'' kann vorgegeben werden, welcher Text durch den Präprozessor im Code ersetzt werden soll. Damit können Konstanten oder kurze Codeersetzungen (Makros) vorgegeben werden. In diesem Programm soll ein maximale und minimale Periodendauer, sowie eine Haltedauer für den höchsten und niedrigsten Ton vorgegeben werden. Zusätzlich sind drei Standardmakros vorgegeben, um      - ''#defines'': Über ''#defines'' kann vorgegeben werden, welcher Text durch den Präprozessor im Code ersetzt werden soll. Damit können Konstanten oder kurze Codeersetzungen (Makros) vorgegeben werden. In diesem Programm soll ein maximale und minimale Periodendauer, sowie eine Haltedauer für den höchsten und niedrigsten Ton vorgegeben werden. Zusätzlich sind drei Standardmakros vorgegeben, um 
       - ein Bit in einem Byte zu setzen (''SET_BIT(BYTE, BIT)''),        - ein Bit in einem Byte zu setzen (''SET_BIT(BYTE, BIT)''), 
Zeile 192: Zeile 194:
     - **Endlosschleife**: damit ein Programm vom Microcontroller dauerhaft ausgeführt wird, muss dies in einer Schleife eingebunden sein. Diese wird durch das Konstrukt ''while(1){''...''}'' vorgegeben.     - **Endlosschleife**: damit ein Programm vom Microcontroller dauerhaft ausgeführt wird, muss dies in einer Schleife eingebunden sein. Diese wird durch das Konstrukt ''while(1){''...''}'' vorgegeben.
     - In der Endlosschleife sind scheinen die Zeilen 77..82 und 84..89 ganz ähnlich auszusehen.      - In der Endlosschleife sind scheinen die Zeilen 77..82 und 84..89 ganz ähnlich auszusehen. 
-      - Dort wird zunächst in einer for-Schleife das Register ''OCR0A'' von der maximalen Periodendauer ''MAX_PER'' zur minimalen ''MIN_PER'' heruntergezählt und beim Zählschritt jeweils 10 Millisekunden gewartet (''_delay_ms(10)''). Wie im Video dargestellt, bietet es sich an für die Details zum Output Compare Register (''OCR0A'') den entsprechenden Teil des [[http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9365-Automotive-Microcontrollers-ATmega88-ATmega168_Datasheet.pdf|ATmega88]]-Datenblatts durchzulesen. Als leichten Einstieg kann auch die [[https://www-user.tu-chemnitz.de/~heha/viewchm.php/hs/ATmegaX8.chm/|deutsche Übersetzung des ATmega88-Datenblatts]] per Index nach ''OCR0A'' durchsucht werden.+      - Dort wird zunächst in einer for-Schleife das Register ''OCR0A'' von der maximalen Periodendauer ''MAX_PER'' zur minimalen ''MIN_PER'' heruntergezählt und beim Zählschritt jeweils 10 Millisekunden gewartet (''_delay_ms(10)''). Wie im Video dargestellt, bietet es sich an für die Details zum Output Compare Register (''OCR0A'') den entsprechenden Teil des [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48_88_168_megaAVR-Data-Sheet-40002074.pdf|ATmega88]]-Datenblatts durchzulesen. Als leichten Einstieg kann auch die [[https://www-user.tu-chemnitz.de/~heha/viewchm.php/hs/ATmegaX8.chm/|deutsche Übersetzung des ATmega88-Datenblatts]] per Index nach ''OCR0A'' durchsucht werden.
       - Nachdem bis zur kürzesten Periode gezählt wurde, soll der höchste Ton die Dauer von ''WAIT_TIME'' Millisekunden gehalten werden.        - Nachdem bis zur kürzesten Periode gezählt wurde, soll der höchste Ton die Dauer von ''WAIT_TIME'' Millisekunden gehalten werden. 
       - Der Zustand der LED soll dann gewechselt werden.       - Der Zustand der LED soll dann gewechselt werden.
Zeile 224: Zeile 226:
     - ''void init()'': Bei längeren Programmen bietet es sich an eine übergeordnete init-Funktion anzulegen, aus welcher die einzelnen Initialisierungen von Sensoren und ähnlichem aus aufgerufen werden.      - ''void init()'': Bei längeren Programmen bietet es sich an eine übergeordnete init-Funktion anzulegen, aus welcher die einzelnen Initialisierungen von Sensoren und ähnlichem aus aufgerufen werden. 
     - ''void initPorts()'': In dieser Funktion werden die Data Direction Register der Ports B und D korrekt zugewiesen.      - ''void initPorts()'': In dieser Funktion werden die Data Direction Register der Ports B und D korrekt zugewiesen. 
-    - ''void initTimer()'': für das Timer Modul muss der gewünschte "Clear Timer on Compare" Modus und Hardware-Vorteiler gewählt werden. Mit dem Teiler $r_{prescaler}=64$ ergibt sich für die Timer-Schritte pro Sekunde: $f_{Timer}= f_{Quarz} / r_{prescaler} = 12'288'000 Hz / 64 =192'000 Hz$. Da mit ''COM0B0=0'' ein Invertieren des Ausgangs eingestellt wurde, wäre die höchste ausgegebene Frequenz $f_{out, max}= f_{Timer}/2 = 96'000 Hz$. Diese würde sich ergebe, wenn der Timer angewiesen würde nur einen Schritt zu zählen. Für eine Frequenz von $f_{out}= 1'600Hz$ muss $OCR0A=f_{out, max}/f_{out}-1=96'000Hz / 1'600Hz - 1= 59$ gesetzt werden. Dies entspricht gerade ''MIN_PER = 59''. \\+    - ''void initTimer()'': für das Timer Modul muss der gewünschte "Clear Timer on Compare" Modus und Hardware-Vorteiler gewählt werden. \\ Mit dem Teiler $r_{\rm prescaler}=64$ ergibt sich für die Timer-Schritte pro Sekunde: \\ \begin{align*} f_{\rm Timer}= f_{\rm Quarz} / r_{\rm prescaler} = 18'432'000 ~\rm Hz / 64 =288'000 ~\rm Hz \end{align*} Da mit ''COM0B0 = 0'' ein Invertieren des Ausgangs eingestellt wurde, wäre die höchste ausgegebene Frequenz $f_{\rm out, max}= f_{\rm Timer}/2 = 144'000 ~\rm Hz$. \\ Diese würde sich ergeben, wenn der Timer angewiesen würde nur einen Schritt zu zählen. Für eine Frequenz von $f_{\rm out}= 1'000~\rm Hz$ muss ''OCR0A'' wiefolgt gesetzt werden: \begin{align*} {\rm OCR0A}=f_{\rm out, max}/f_{\rm out}-1=144'000 ~\rm Hz / 1'000~\rm Hz - 1= 143 \end{align*}  Dies entspricht gerade ''MIN_PER = 143''\\ \\ 
   - Ansprechen des Displays: <sxh c; first-line: 118>   - Ansprechen des Displays: <sxh c; first-line: 118>
  
Zeile 258: Zeile 260:
     - Versuchen Sie mit dem [[http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9365-Automotive-Microcontrollers-ATmega88-ATmega168_Datasheet.pdf#page=75|Datenblatt]] (Seite 75ff insbesondere Kapitel 12.4) herauszufinden wie das funktioniert.      - Versuchen Sie mit dem [[http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9365-Automotive-Microcontrollers-ATmega88-ATmega168_Datasheet.pdf#page=75|Datenblatt]] (Seite 75ff insbesondere Kapitel 12.4) herauszufinden wie das funktioniert. 
     - Prüfen Sie dazu im Datenblatt auch nach, was an Pin B5 noch für Funktionen hängen (Kapitel 1. Pin Configurations).     - Prüfen Sie dazu im Datenblatt auch nach, was an Pin B5 noch für Funktionen hängen (Kapitel 1. Pin Configurations).
-    - Warum wird zwar ''OCR0A'' als Vorgabe genutzt, aber ''OC0B'' als Ausgabe gewählt (siehe Zeile: ''TCCR0A = (1<nowiki><<</nowiki>WGM01) |(1<nowiki><<</nowiki>**COM0B0**)'')?+    - Warum wird zwar ''OCR0**A**'' als Vorgabe genutzt, aber ''OC0**B**'' als Ausgabe gewählt (siehe Zeile: ''TCCR0A = (1<nowiki><<</nowiki>WGM01) |(1<nowiki><<</nowiki>**COM0B0**)'')?
   - Wie ist es möglich bei aufsteigender und abfallender Frequenz einen entsprechenden Text am Display auszugeben? Ändern Sie den Code geeignet.   - Wie ist es möglich bei aufsteigender und abfallender Frequenz einen entsprechenden Text am Display auszugeben? Ändern Sie den Code geeignet.
   - Versuchen Sie das Programm so zu variieren, dass es ein Martinshorn ausgibt. Suchen Sie dazu zunächst die benötigten Frequenzen und ändern Sie das Programm passend ab.   - Versuchen Sie das Programm so zu variieren, dass es ein Martinshorn ausgibt. Suchen Sie dazu zunächst die benötigten Frequenzen und ändern Sie das Programm passend ab.
Zeile 264: Zeile 266:
  
 <-- <--
 +
 +
 +
 +
 +  * Diese [[https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgzCCsB0AsBMkywOz3egDNgjAUwFoBOEHaFbeTMIo2bOzeKTKEWCSQnHAKACUQrWAA4QBHGABs7MThDMcIjlWwLokdZtaYNvKilJUFI1jkywTYywGEAyvF4AZI63inX4CwqEgAZgCGADYAznhsmM6kkMzuZjFelsysgaHh2vqYhjgJcaTSVuwg9nwGpMomZlJi7tbFdpEuSkkezYk+8qlhEbwA7uUtZhVUYpEAsiBSUoOT0+2xei4iYLEey8xg3sn+wd0ZZeuVICI4MrVFADohKLwAHscc4KggRIjgkMIKlgDyNvyYAEFMoZlDU1itCpYrlIoqCjnDNklfF10kJYR48iIPIiOjs0j0Dhi1nNzlCQrBgccSWtRJCQFdILDqawRHMcdsUT0XK8wawefNkbtUZEyvy8kQcKs6ldSlkXrAZmKsZcQo15YqFQLOkKuS9JUcJRstqQ8Xs0aL9ZiiGdlWTHAdrfCidKQmBYY6rTJ2YL8RkJtU3B4AwL4HoJihLR4I0akaHGf6PUHHd647xw1JA6wUBmQ2GQChs0cC17janw5q8ihNSm82hefn3LnGS5pFVWGACqc3CbORl7lJIJoOyQUBDkMwkpYACo2AByU7VOUUOckMi7PhSOoyTQSc1XkyRm99aP6NGYBFp8AhF9GfQU18vELmkXutHANFIRCHCCK8GnNj+TAACE72jWQXhzWlIn6ChLEgGQv2YeCT0mR05joSxnzvaoxDQF4CjwyJBFZSwCExDwyI8HR2FYbRfF0Rk2iXA9P2YPdwF4U5JxYp8kgsEhzAiNg6Lo2i2E5aDokUQtmPXSTmMdPDHXkhIeGYVp9UkvCcE1VpNUkvTLA05I71kxtlUlW9+gs8y5ELAy7JkbT7NM1TNUdHTLEkjz3LOTArIghR-IbIKAuYtYWR0O8IuOYQAr-ULfBGFC3GCuKUvAjwoNc1Z4liU4UOY+ACtUBQCsk0rir81L4pK4KqoUBKKpKhLJTcJrTOMdBLDao5vLcyxEKgGRvMgsRrTMRtRsm8aKkslDrTEAhZtIgLFtIBDqnENbCxW44FsLBKiF2haKghIhhi80DjHoF4KlurTG3Os6TJggojsOq6YM1Ar1vKzipmOArKJZBKQaC2ASBEXgAEJigAewAWwABwCAAnAIABd4bR3wAElMAAGiuPGcGJkI8fgcm8bAcmACkiauOmyaZqmmYgABFBGUfRrGcaEbBBewC4AEccAuAA7QXzFwUXxalzAZcVzA5cl3AZZ4VWpaVmWteV8wDb1nh1ZVsW1Z4A3NbNiWdcFrWNY1+39eVp2LcV8XreN93hc9y3Dd9v3Tfli2Q49+WAH5I6jyPRZViXMj2gglNecRtO51GMex3GRWCi7MMGlP2JsJGM753HGX6Q0vj5fUbwWxtxQbrDK+8C8+S2bLK8jGvYmQgyPWQkRHQICEHKWhKsRqZuXgb2kiA7gKsUzY41kXpSZBEPD4GnzfYjmEiFB3kl9+ZFC4UxS8++iy+N5JK-rLv2+eu8AyIUxN-O+OD+xBEZC-0Xv+tJf5rk0pxD4pALCjAgYRE02wK4QOvHISB21CrIKQRCMK1B1IILYl9SYyp-74Nwq9WYk4xA4S+AFKYMxqGUJQlIAeMgGFMLwcGRATDGH0KJKwNh99UJnDmMwvqoEtiCI9NPWCw18yiLwWBSs+pP51kPpYJReRHpuDmKoiRN0sxdW0TUZCSjR7XQMU5CsfCqwzEsQoCx70VF2ICtmZeTi6FaQrLdax-0yiqKjJGOobpvEVijA3W0ChKTFiLDmUk5o5QuMrEEuospDBCLyGw0JjJvHd34XSCkZQ0k8OpHUGEeTT7TDBHUG4lctroQqNPdayp1p1N2nyCoVE7zHU2i8Zpp1n6DQqMpaKyE1J3R6qAh+vSRkQLwbvQKHTAoORZONLaypRpLSUhUJOJD1p122YRdphYCDITzuIPhcy25dJkIcka7SNnPVIg9aKyoyJ9NIh1ayw87niGMS3e5fIDkPJgjoqAhYAXAq9MwIxJDIAbIKpAA5-1+jQu4ki8QCKoApzrnCy5n8UUJVHGcPBkAMW0iJcuFCpKNr5h+tcxF91cIKICiiklrSoqIpToY7wfCUUeCxbFclKdhkUr4RmHhmE0KsOVHhDMxDCpXnPK0eAw82n9B4O9IZ+41GdTfnuOV4g3muA0T1XV28rplDasvHgwxQk2G+GMQEi4NUaQKN6I8Zoc7ZEdWYXq0SbV2oBHwJolUFVqG9NqY88kg2TTUCatE9wLYkGQJNHITwIDcRnIBIEExJCajImoSQGzKpaE6sDHVw8sI5DXIqy5rQwC11aFASkB8JDLKeacOoM55wqxCAAN2CAAVzwJSBUNRbrDoUHhSwABjIIeB0aUl1XXZKdcp1BAANYLiHbSZt7AwYFUsAAEwAJZo14NAEAABVZGAAReGvQJbFz7RLTGeA0YiCAoezGvgICCUkCAAARvDTG2NEbsEGuAYoTgADSG4fAc3bF+kAHN5DJvkJzRQJANiIYgFecDnMWhFE5kOTg4GOZeiYSRwwsB5CGAgPwAAonYNgGGQDY2RuwCAYgIDnoAAqTFgSAOmkGABiQRD3IxE-DZGdGgiIxlFceAcnXRXFgAyC4aM8YS27S+59aNpOyZCFIK4KA1MAglvugA4ljPAemjPKauCINT3w0aWefTZkIDmQiShlOLNGpmLNWbc2AaEMoFNoycPDAA5oeydGnkZ9sxm5nzfmXPWZkzKSAIWZQqbRk5lLiWgueZU55lWvmzN5bS+5mUhnPNBdK-51zFWcBECyzKBzOXnMBca8ZzzHnmt1fK-pyQ8mu04GM2FyL0XvjxbiwlirtXwtRcnVNzGM3EsZbRoJkTYmJNSca+LEICnPP7ZyFV1TG3hOifE0ESTiWu2HfMDKZrB2u3rc25dnbbmnuHa+wVv8Z3kudcG91v7B2fO5cB-J-b6B5PrYBw1-TV5WvydC297b13dsI4ywdmH8mPOKv+2ViHoP5NfcM+1gb8nqvwG65sEzhP4e4+R-JsbqOrs3bm3dq4tPXQFeQAT+rqWEfVb566MHHWGei654dsAsP6eC6579mnKOLto-Z-pmX8mudY+kFz7rsuBeBf22AGnbXwcS7AB5mgymStw-l66YX0u+us4+xV+gmvyRdqo8pw762FuTem-FtziPxuLeW6txrfW-dLYD7N9XZOo9h8D67nzCeY+BfmxN6PK2k8I7a7btzXv7cK8ZwdgrTX0tc+U7V2cOMKfkiN8L37eOy9PZO0p8kmELhXC7SrbvGgu8hCx+LTXqnVOeYHwp0fg+5Mj9VAPrHk-x9XBRPPgfI2J9r9X0v7HU+h8b93zPnfc+x-D6Pxlk-+-p9j8X3GWft+DOb4f934Lz-t+L-P9Pt-q+L+z975-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-eSWye-SBLJYVRaVJfkFIK9VII9RFeAAKgkPQNZdBZJAqHlKBggyhGOsxGOjUShHsTCXsXXJJPg7SGOgQ3eBSoKjJGMmCm3ZhLkXgscp5C8ANAtHkYNNSnuRhBtC0nLRwwRMwBpWuC5JXJ2IWAw0I5MMFFKkXeI+MeidQ3I1pA4vmFEoou4lmJ9HuREtg1o8qnqOePOUtJ-EPDaCyOItMmYyvFPOY0xQhJaKck3INLPGtJaLdJw9g95Go+qMIpcSgEPApUOIrO8I9bJVkJKeYBvDwIfCZPDKQAWDBvQG+LoFIG8LoELB0vBCkx0HE26DE6NoeDRBdBENAMhqQLwEAA|Falstad Schaltung]] skizziert die Struktur des Timer/Counters im CTC Mode