Im Kapitel 2 - Timer wurde der Einsatz eines Timers vorgestellt. Es ist eigentlich ein Zähler, der zum Beispiel beim ATtiny13a bei Erreichen der Zahl 255 einen Overflow anzeigt (er kann als 8-Bit Zähler nicht über 255 hinaus zählen) und dann einen Interrupt auslöst, der dann zum Beispiel einen Toggle-Vorgang an einem definierten Ausgang auslöst (Kapitel 2 - Abschnitt 8).
Das Hochzählen von 0 bis 255 kann mit einem Preload-Wert verkürzt werden. Setzt man einen Preload-Wert von 100 an, dann zählt der Timer vom gesetzten Wert bis 255 hoch und löst dann einen Interrupt aus; die Zeitspanne bis zum Auslösen eines Interrupts lässt sich auf diese Weise feiner einstellen. Das werden wir im Folgenden ausnutzen.
Es werden die folgenden Bezeichner eingeführt:
Bei einem 8-Bit Timer wird nach CKMAX = 256 Ticks ein Overflow ausgelöst und damit eine Interrupt-Service-Routine (ISR) aufgerufen. Setzt man einen Vorgabewert CKPreL, dann wird nach
CK = CKMAX - CKPreL (1)
Ticks ein Overflow ausgelöst. Zusätzlich wissen wir, dass sich die Frequenz des Arbeitstaktes bei einem Controller über Formel (2) bestimmen lässt:
fAT = fST(+Fuse) / Prescalewert (2)
Die Frequenz am Ausgang errechnet sich dann zu
fAUSGANG = fAT /(2*CK) (3)
Beispiel
CKMAX = 256 (8-Bit Timer)
fST(+Fuse) = 9,6 MHz / 8 = 1,2 MHz
fAT = 150 kHz
PreS = 8
Mit den Vorgabewerten eines ATtiny13a errechnet sich nach (2) die Frequenz des Arbeitstaktes zu
Die Ausgangsfrequenz ergibt sich über Formel (3) dann zu
Aus (3) folgt mit (1)
fAUSGANG = fAT /(2*( CKMAX - CKPreL )) (4)
Löst man Gleichung (4) nach CKPreL auf, erhält man
CKPreL = CKMAX - fAT / (2*fAUSGANG) (5)
Zur Berechnung der Vorgabe-Ticks CKPreL muss man in (6) die gewünschte Frequenz am Ausgang fAUSGANG, die Frequenz des Arbeitstaktes fAT und die maximal möglichen Ticks des Timers CKMAX eingeben und erhält die Vorgabe-Ticks (preloads).
Beispiel
Wie groß muss der CKPreL-Wert sein, damit am Ausgang ein Signal mit einer Frequenz fAUSGANG von 500 Hz steht?
CKMAX = 256 (8-Bit Timer)
fAT = 150 kHz
fAUSGANG = 500 Hz
Berechnung über (5) ergibt einen CKPreL-Wert von 106 oder 0x6A.
Die Berechnung der mit einem Vorteiler herabgesetzten Oszillatorfrequenz zeigt die folgende Tabelle. Sie ist als Excel-Datei schnell zu erstellen und erspart einem im Einzelfall viel Rechenarbeit. Die maximale Timerperiode ergibt sich aus Schwingungsdauer für den Arbeitstakt TAT multipliziert mit dem maximalen Zählwert von 256.
Mit dem soeben berechneten Preload-Wert von 0x6A oder &H6A wird im Realexperiment der Nachweis erbracht, dass die Ausgangsfrequenz im Rahmen der Toleranz des Systems bei 500 Hz liegt.
Timer mit Preload Wert | |
Material |
|
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Das Programm Piezo_LS2.bas
Über GND und B.0 wurde das Signal mit dem Oszilloskop abgenommen und aufgezeichnet. Der Variablen Preload vom Typ Byte wird der errechnete Vorgabewert zugewiesen (Programmzeile 29) und der Timer0 auf diesen Wert gesetzt (Programmzeile 30). Jedesmal, wenn die ISR aufgerufen wird, wird auch der Timer0 auf den Vorgabewert gesetzt. Die nachfolgende Abbildung zeigt das Oszillogramm.
Im folgenden Abschnitt werden wir uns den Timer0 in seiner Funktion als Puls-Weiten-Modulator (PWM) anschauen.
Der ATtiny besitzt nur einen Timer mit zwei PWM Kanälen (Datenblatt ab S.59). Die für den Timer/Counter zuständigen Register sind TCNT0 und die Output Compare Register A und B OCR0A und OCR0B. Diese beiden Register werden zu jeder Zeit mit dem Timer/Counter Wert verglichen. Das Ergebnis kann vom Wellenformgenerator zur Puls-Weiten-Modulation oder Ausgabe einer variablen Frequenz genutzt werden.
Die Output Compare Unit
Der 8-Bit Komparator vergleicht ständig TCNT0 mit den Output Compare Registern OCR0A und 0CR0B. Sobald Gleichheit zwischen TCNT0 und einem oder beiden Output Compare Register festgestellt wird, wird dies durch das Setzen des entsprechenden Flags OCF0A oder OCF0B mit dem nächsten Taktsignal signalisiert. Wurde der zugehörige Interrupt eingeschaltet, erzeugt das Output Compare Flag einen Output Compare Interrupt. Sobald der Interrupt ausgeführt wird, werden die Output Compare Flags zurückgesetzt. Alternativ geht das auch per Software durch den Eintrag einer 1 an der entsprechenden Bitposition. Der Wellenformgenerator erzeugt bei festgestellter Gleichheit von TCNT0 und den OCRx-Registern ein Ausgangssignal, das durch die Waveform-Generator-Modes Bits WGM0[2:0] und Compare Output Mode COM0x[1:0] festgelegt ist (Datenblatt, S.61ff).
Timer als PWM mit festem Tastverhältnis | |
Material |
|
Aufgaben |
|
Schaltungsaufbau
Das Programm led_pwm_0.bas
Oszillogramme für drei verschiedene Tastverhältnisse
Wie arbeitet das Programm led_pwm_0.bas?
Will man das Programm verstehen, muss man sich die Arbeitsweise einmal grafisch vor Augen führen. Ein Zähler wird vom Systemtakt des Mikrocontrollers angetrieben und erhöht seinen Wert bei jedem Tick um 1. Sobald er eine voreingestellte Schwelle (Compare0A) erreicht hat, toggelt Ausgang B.0, wobei festgelegt wurde, dass der Togglevorgang mit einer 0 eingeleitet wird (clear down). Entschließt man sich für clear up, dann beginnt der Spannungspegel am Ausgang mit einer 1 oder 5V. Was jetzt im Bild HIGH ist wird dann zu LOW und umgekehrt.
Im folgenden Kapitel 4 geht es um die Anbindung einen USB-UART Converters an den mächtigeren ATmega8A, der die Möglichkeit eröffnet, Daten über Terminal und Tastatur am PC einzugeben und an den Controller zu übertragen. Auch die umgekehrte Richtung ist möglich. Die Daten vom Controller werden in einem Terminalprogramm am PC sichtbar gemacht. Weiter mit Kapitel 4.