STM8 Timer 1


Der 16 Bit Zähler des Timer 1

Der Zugriff auf den 16-Bit Zählerwert erfolgt ebenfalls über zwei 8-Bit Register, TIM1_CNTRH und TIM1_CNTRL. Der Zähler ist nicht gepuffert daher wirken schreibende Zugriffe unmittelbar auf den Zähler. Als logische Konsequenz daraus sollte der Zähler nicht im aktiven Betrieb mit einem neuen Wert beschrieben werden.

Bei einem Lesezugriff wird das LSByte (das niedrigwertigere Byte) allerdings in einem gesonderten 8-Bit Zwischenspeicher exakt in dem Moment abgelegt wenn das TIM1_CNTRH Byte gelesen wird. Daher ist beim Lesen des Zählers die Sequenz: erst TIM1_CNTRH dann TIM1_CNTRL einzuhalten.

Vorsicht: Das Auslesen des Zählers mit einem LDW (Load Word) Befehl führt zu einem Fehler da dieser Befehl exakt die umgekehrte Reihenfolge benutzt und auf das LSByte vor dem MSByte zugreift.

 

TIM1_CNTRH Register - Counter Register High                     (TIMER1 Adresse = 0x00.525Eh im STM8S
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
TIM1_CNTRH CNT[15] CNT[14] CNT[13] CNT[12] CNT[11] CNT[10] CNT[9] CNT[8]

 

TIM1_CNTRL Register - Counter Register Low                     (TIMER1 Adresse = 0x00.525Fh im STM8S )
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
TIM1_CNTRL CNT[7] CNT[6] CNT[5] CNT[4] CNT[3] CNT[2] CNT[1] CNT[0]

Das Update Event

Ein Update Event kann durch folgende Auslöser erzeugt werden:

♦ Durch den Über- (CNTR > FFFF) bzw. Unterlauf (CNTR < 0) des Zählers (Abwärtszähler)

♦ Durch einen „Match“ des Zählers mit dem Wert In den TIM1_ARRH/TIM1_ARRL Registern (Aufwärtszähler und Center Aligned Mode))

♦ Durch Software mit dem Setzen des „UG“-Bits im TIM1_EGR Register

♦ Durch einen Trigger Event (Hardware) im Clock/Trigger Controller

Update Events werden unterdrückt wenn:

♦ das UDIS-Bit im TIM1_CR1 Register gesetzt ist (permanent)

♦ der Repetition Counter nicht „Null“ ist (dynamisch)

Ein Update Event kann dabei je nach Konfiguration die folgenden Aktionen auslösen:

♦ Das Prescaler Puffer Register (Schattenregister) wird mit den Werten aus dem TIM1_PSCRH / TIM1_PSCRL Registern geladen.

♦ Der Prescaler wird mit dem Inhalt des zugehörigen Schattenregisters geladen

♦ Der Zähler TIM1_CNTRH / TIM1_CNTRL wird mit dem Inhalt des zugehörigen Auto Reload Schattenregisters geladen (Aufwärtszähler und Center Aligned)

♦ Das Auto Reload Schattenregister wird mit dem Inhalt der Auto Reload/Preload Register TIM1_ARRH / TIM1_ARRL geladen (nur wenn ARPE = 1)

♦ Die Capture/Compare Schatten Register werden durch die Capture/Compare Register (TIM1_CCRiH / TIM1_CCRiL) geladen

♦ Das Repetition Counter Shadow Register wird mit dem Inhalt des TIM1_RCR Registers geladen

Die Timer 1 Zähler Funktion

Wie Anfangs bereits beschrieben kann der Zähler des Timer 1 sowohl als Aufwärts- als auch als Abwärtszähler arbeiten. Mit der entsprechenden Hardwareeinstellung ist sogar ein alternierender Betrieb mit einem zyklischen Aufwärts-und Abwärts-Zählen möglich (Center-Aligned Mode).

Die Aufwärtszähler Funktion

In dem von den anderen Zählern des STM8 bekannten Aufwärtszähler Modus beginnt der Zyklus mit dem Wert „0“ und zählt bis zu dem im Auto-Reload Register (ARR) hinterlegten Wert „x“. Beim Erreichen des Auto-Reload Wertes wird ein Überlauf erkannt und der Zähler wird auf „ Null“ zurückgesetzt. Gleichzeitig kann ein „Update Event“ bzw. ein Interrupt ausgelöst werden.

Das DIR Bit im Register TIM1_CR1 definiert mit dem Wert „0“ den Aufwärts-Modus der Zählweise. Die beiden CMS[1..0] Bits im gleichen Register müssen den Wert „0x00b“ haben da diese den „Edge Aligned Mode“ vorgeben.

Die Abwärtszähler Funktion

In dieser Einstellung, die durch das DIR Bit = „1“ konfiguriert wird beginnt der Zähler bei dem im Auto-Reload Register hinterlegten Wert „x“ und zählt rückwärts bis zum Wert „0“.

Die beiden CMS[1..0] Bits im Register TIM1_CR1 müssen, wie beim Aufwärtszähler auf den Wert „0x00b“ eingestellt bleiben um den „Edge Aligned Mode“ beizubehalten.

Nach dem Nulldurchgang des Wertes wird der Zähler automatisch mit dem Wert des Schattenregisters (Auto Reload Wert) geladen und beginnt dann erneut mit dem Abwärtszählen.

Gleichzeitig mit dem Update kann ein Update Event erzeugt (UDIS Bit im TIM1_CR1 Register = 1) bzw. ein Interrupt ausgelöst werden (UIE Bit im TIM1_IER Register = 1).

Die Auf-/Abwärts Funktion (Center Aligned Mode)

Eine Besonderheit ist beim Timer 1 die Auf-/Abwärts Funktion des Zählers, die vollkommen Hardware gesteuert abläuft. Dies Funktion ist speziell mit dem Generieren eine PWM-Pulsform auf mehreren Ausgängen interessant da damit ein synchrones Schalten aller Ausgänge vermieden werden kann.

Wie im Bild sichtbar beginnt der Zähler mit dem Wert „Null“ und zählt aufwärts bis zum eingestellten Auto-Reload Wert. Jetzt wird aber kein Reset des Zählers durchgeführt sondern das DIR Bit wird umgeschaltet und gegebenenfalls ein Interrupt ausgelöst.

Durch das Invertieren des DIR Bits zählt der Timer jetzt rückwärts bis zum Erreichen des Wertes „Null“. Mit dem Unterlauf (Underflow) wird das DIR Bit erneut invertiert und die Sequenz kehrt sich wieder um. Auch hier kann ein Interrupt ausgelöst werden.

Wie später zu sehen sein wird kann diese Dreiecksform durch einen geeigneten Wert im Capture/Compare Register den Zählerausgang „togglen“ und je nach Höhe des Wertes einen mehr oder minder breiten Puls erzeugen (PWM) der symetrisch um den Überlaufzeitpunkt ausgegeben wird.

Der Repetition Counter des Timers 1

Eine weitere Besonderheit des Timer 1 Funktionsblocks ist der 8-Bit “Repetition” Abwärts-Zähler (R-C) der „n + 1“ Update Events des primären Zählers erfasst und damit die Möglichkeit schafft entsprechende Aktionen (UEV oder Interrupts) erst nach mehreren Zählerzyklen zu aktivieren.

Der „Wiederholungs-Zähler“ besitzt ein Auto-Reload Register TIM1_RCR, dessen Wert „n“ beim Erreichen des Wertes „Null“ im Repetition-Zähler, in denselben geladen wird. Gleichzeitig wird durch den Zähler ein UEV (Update Event) und falls freigegeben auch ein Interrupt ausgelöst.

Wird das Register TIM1_RCR mit „0x00h“ geladen so wird jeder Event erfasst, beim Wert „0x01h“ jeder Zweite usw.

Der „Repetition“ Zähler wird durch folgende Ereignisse dekrementiert :

Durch einen Überlauf (Overflow) des Timer 1 Basis-Zählers

Durch einen Nulldurchgang (Underflow) des Timer 1 Basis-Zählers

Durch jeden Überlauf und Nulldurchgang des Basis-Zählers im „Center Aligned Mode“

In diesem speziellen Fall können maximal 128 Zähler-Zyklen durch den Repetition Zähler erfaßt werden da pro Zyklus zwei Events auftreten werden (Overflow/Underflow).

Der Repetition Counter (R-C), kann durch das Erzeugen eines UEV per Software (Setzen des UG Bits im Register TIM1_EGR) oder durch die Hardware (Clock/Trigger Controller), aus dem Auto-Reload Register unmittelbar neu geladen werden – vollkommen unabhängig vom aktuellen Zählerstand des Repetition Counter.

Copyright Notiz

Dieses Dokument sowie dessen Inhalt, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2017) und sind nur mit einer schriftlicher Zustimmung des Autors, Dipl.Ing.(FH) Franz Henkel zur vollständigen oder auszugsweisen Weiterverwendung in Form einer gedruckten oder elektronischen Kopie oder Replikation bzw. einer vollständigen oder auszugsweisen Bereitstellung des Inhalts in schriftlicher oder elektronischer Form, zu verwenden.