erstellt  08.09.2013
Timer 1 im CTC Modus
CTC Modus bedeutet (Clear Timer on Compare Match) dabei zählt der Timer von Null an aufwärts bis zu einen vorgegebenen Vergleichswert wobei der Vergleichswert
in einem Pseudo-Register mit der Bezeichnung "Compare1A" abgelegt ist. Dabei ist es möglich den Status eines festgelegten Pins am Atmega zu ändern.
Diese festgelegten Pins sind am Atmega 8 der Pin 15 ( OCR1A) und der Pin 16 (OCR1B) ( siehe Bild 1 ).
Es ist möglich beim erreichen des Vergleichswert diese Pin's von "Eins" nach "Null" zu schalten oder von "Null" nach "Eins".
Bei dem "unten" folgenden kleinen Programm wird beim Atmega mit einer Taktfrequenz von 16 MHz, eine Ausgangsfrequenz von 1000 Herz.
Bild 1
Atmega 8 Timer Ausgangs Pin

Programmzeile Beschreibung
$regfile "m8def.dat"         Definiert den Atmega als Atmega 8
$crystal = 16000000          Gibt die Quarzfrequenz an in Hertz
$hwstack = 32                 Default  32 Hardware reservierte Speicher
$swstack = 10                Default Software Resvierung Speicher
Ddrb.1 = 1 Ausgangspin setzen
Tccr1a = &B01000000          Toggelt Pin OC1A
Tccr1b = &B00001010   Timer Reset beim erreichen des Vergleichswertes und Systemtakt durch 8 teilen
Compare1a = 1000 Vergleichswert setzen
Do
Loop
Der gewünschte Compare Wert errechnet sich für die benötigte Frequenz von 1000 Herz folgendermaßen:
Taktfrequenz : Vorteiler : 2 : Gewünschte Frequenz = Comparewert
16 000 000 Hz : 8 : 2 : 1000 Hz = 1000

Register TimerControl A
Register TCCR1A Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
Über BIT 6 + 7 wird der OC1A  Anschluss konfiguriert ob er mit dem Ausganspin verbunden wird oder nicht.
(00= nicht verbunden) 01= OC1A verbunden.
Beim Atmega 8 ist Ausgang OC1A gleich Portb.1 und der muss als Ausgang deklariert werden, wenn diese Funktion genutzt wird.
0 0





Über Bit 4 + 5 wird der OC1B Anschluss konfiguriert ob er mit  dem Ausgangspin verbunden wird  wenn WGM13=0 ist(00=nicht verbunden) 01=verbunden

0 0



Ausgang OC1A zählt von  0 bis Vergleichswert , wenn dieser erreicht wird , dann wird Ausgang auf 1 gesetzt. 1 0





Resetiert OC1B wenn Vergleichswert erreicht wird

1 0



Der Ausgang OC1A ist beim hochzählen 1 bis Vergleichswert erreicht wird , dann wird Ausgang auf 0 gesetzt. 1 1





??


1 1



Timer 1 wird bei einem Gleichstand des Zählers mit dem Vergleichsregister ( Compare1A) den Status des Ausgang OC1A ändern. Wobei Compare 1 A nur ein 16 Bit Pseudoregister für zwei tatsächliche 8 Bit Register ( OCR1AH + OCR1AL) ist. 0 1





Bei Gleichstand des Zählers und des Vergleichsregister Status am Ausgangpin  OC1B ändern

0 1



COM1A1
(Compare Match Output Mode) diese Register steuern den Output Compare Funktionen damit wird entschieden ob der OCR Ausgang aktiviert ist oder nicht








Force Output Compare (FOC) Modus
Der Force Output Compare Modus ist in alle Timer/Counter integriert.
Der FOC Modus kann nur bei nicht-PWM Modi genutzt werden. Beim Schreiben einer
logischen 1 auf FOCx wird ein sofortiger Compare Match des Funktionsgenerators
erzwungen. Der OCx Ausgang wird auf den Status des COMx1 Bits gesetzt. Deshalb
bestimmt der Wert aus COMx1 den Wert des OCx Pins beim Vergleich.








TCNTx - Timer/Counter Register In diesem Register wird der aktuelle Zählwert gespeichert. 







OCRx[A | B][H | L] - Output Compare Register (A oder B und H oder L nur
Timer1)Wenn TCNTx den Wert dieses Registers erreicht, wird ein Output Compare
Interrupt Request ausgelöst.








FOCx (Force Output Compare) Beim Schreiben einer logischen 1 auf FOCx wird ein sofortiger compare match des Funktionsgenerators erzwungen.







Der Zählwert des Timers also die gezählten Takte werden im Zähl-Register TCNT0 abgelegt mit jedem Takt wird der Wert im Register CNT0 um eins erhöht.
Es gibt zwei Möglichkeiten den Timern zu sagen was sie machen sollen, zum einen funktioniert das mit Bascom Befehle, und zum anderen gibt es die Möglichkeit Registereinstellungen direkt zu ändern.








TIMSK - Timer/Counter Interrupt Mask RegisterZur Auswahl, welche Interrupts aktiviert werden sollen.







ICR1[H | L] - Input Capture Register 1 Hi oder Low (nur Timer1)Wird bei jedem Input Capture Event mit TCNT abgeglichen. Kann zur
Festlegung des Maximalwertes genutzt werden.








TIFR - Timer/Counter Interrupt Flag RegisterHier werden bestimmte Bits gesetzt, wenn ein Interrupt ausgeführt werden soll.







ASSR - Asynchronous Status Register (nur Timer2)Register zur Steuerung des asynchronen Modus







SFIOR - Special Function IO RegisterPSR2 Bit setzt den Prescaler des Timer2 zurück







Register TimerControl B
Register TCCR1B Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

ICNC1 ICES1
WGM13 WGM12 CS12 CS11 CS10
Bei 1 wird steigende Flanke und  bei 0 die fallende Flanke registriert
1





CSxx (Clock Select) konfiguriert den Prescaler
CS10,CS11,Cs12.
Mit den Bits 0-1-2 (CS10,CS11,CS12) wird  der Prescaler ( Vorteiler ) eingestellt also in wie weit der Tackt des Atmegas herunter geteilt soll , oder aber wenn der Takt von Außerhalb angelegt wird , an welcher Flanke der Takt registriert werden soll bei abfallender oder Steigender Flanke.(000 =Timer / Counter hält an)





0 0 0
Voller Takt wird genutzt




0 0 1
Takt durch 8




0 1 0
Takt durch 64




0 1 1
Takt durch 256




1 0 0
Takt durch 1024




1 0 1
Externer Takt an Pin T1 bei fallender Flanke




1 1 0
Externer Takt an Pin T1 bei steigender Flanke




1 1 1
Register (ICES1) wird festgelegt ob bei aufsteigender Flanke ( ICES1=1) oder fallender Flanke (ICES1=0 )der Eingangspin ausgewertet werden soll.
ICES1  (Input Capture Edge Select) Bestimmt, welche Flanke ein Capture Ereignis auslöst. Bei 0 löst eine fallende Flanke ein Capture Ereignis aus, bei 1 eine steigende Flanke 1 = Triggert bei steigender Flanke 0 Triggert bei fallender Flanke1

1





ICNC1 (Input Capture Noice Canceler) Ist die Störunterdrückung (ICNC1=1) eingeschaltet, wird der Eingangspin viermal hintereinander abgetastet und muss auch 4 mal den gleichen Wert aufweisen also 4 mal 0 oder 4 mal 1 je nach welche Flanke er erkannt werden soll damit der Eingangsimpuls als solcher gewertet wird.
Bei ausgeschalteter Störunterdrückung (ICNC1=0) wird jede Flanke als Eingangsimpuls erkannt, so kann es beispielsweise bei nicht entprellten Signale zu Störungen durch mehrfach Erkennung kommen. Störunterdrückung eingeschaltet 0 ist ausgeschaltet
1







Atmega8 CTC Modus Ausgang Pin
Hier eine Tabelle mit einigen Beispielen bei denen man sehr schön sehen kann das der Comparewert im Verhältnis zur Frequenz nicht Linear steigt !
Werte bei einer Taktfrequenz von 16 Mhz und einen Vorteiler von 8
Compare Wert Frequenz/Hz
0 1000 000
1 500 000
10 90 000
100 9800
230 4300
2300 431
23000 43
65534 15

Werte bei einer Taktfrequenz von 16 Mhz und einen Vorteiler von1
Compare Wert Frequenz/Hz
0 8 000 000
1 4 000 000
10   727 000
100      79 000
230       64 632
2300        3 475
23000           347
65534 122

Mögliche Probleme !
Egal welcher Comparewert eingestellt wird, die Ausgangsfrequenz bleibt immer gleich. Möglicherweise wurde das Bit 4 des Register Tccr1b = &B00001010  nicht gesetzt, dadurch wird dann kein Reset des Register mehr ausgeführt.
aktualisiert 12.02.2018