erstellt  28.08.2011
Sekundentakt mit Atmega 8
Um einen Sekundentakt zu erzeugen bedienen wir uns des Timer 1, das ist ein 16 Bit Timer der bis 56535 zählen kann.



Zeile
Programmzeile
Beschreibung
1
$regfile "m8def.dat"
Definiert den Prozessor als Atmega8
2
$crystal=20000000
Gibt die Quarzfrequenz in Herz an, hier 20 MHz
3
$hwstack=32
Defaultwert für Reservierten Hardwarespeicher
4
$swstack=10
Defaultwert für Reservierten Softwarespeicher
5
Config LCD=16*2
Definiert das Display als ein mit 2 mal 16 Zeichen
6
Config LcdPin=Pin,DB4=Portb.5,Db5=Portb.4,Db6=Portb.3,Db7=Portb.2,Rs=Portd.1,E=Portd.0
Definiert die Anschlüsse des Displays an den Prozessor
7
DDRD=&B01100011
Setzt die Pins d.0, d.1,d.5 und d.6 als Ausgänge
8
On Timer1 Timer_eins
Legt den Namen der an zuspringende Unterroutine für Timer 1 fest hier "Timer_eins"
9
TCCR1A=&B00000000
Konfiguration der Timers über Register siehe Tabelle 1
10
TCCR1B=&B00000101
Konfiguration des Timer über Register siehe Tabelle 2
11
Timsk.toie=1 oder (TIMSK=&B00000100)
Überlaufinterrupt einschalten siehe Tabelle 3
12
SReg.7=1 oder (Sreg=&B10000000)
Interrupt freigabe siehe Tabelle 4
13
Timer1=46004
Voreinstellung des Timer1
14
Do
Anfang der Hauptprogrammschleife
15
cls
Display löschen
16
LCD Timer1
Gibt den internen Timerwert auf das Display aus
17
Waitms 500
Pause damit Display Zeit zur Anzeige hat
18
Toggle Portd.6
Status am Portd.6 wechseln (Led an/aus)
19
Loop
Ende der Hauptprogrammschleife
20
Timer_eins:
Interruproutine für Timer 1, hierher wird gesprungen wenn der Timer 1 einen Überlauf hat.
21
Timer1=46004
Voreinstellung für Timer setzen , muss bei jeden Überlauf erneut gesetzt werden.
22
Portd.5=1
Ausgang setzen für Ledanzeige
23
waitms 8
Pause damit Led Zeit zum leuchten hat
24
Portd.5=0
Led wieder ausschalten
25
Return
Rücksprung

Die Voreinstellung der Timervoreinstellung berechnet sich folgendermaßen:
Taktfrequenz geteilt durch Prescaler = Ergebnis
20Mhz : 1024 =19531
Bitauflösung des Timer Minus Ergebnis
65535 - 19531 =46003
Bei einer Voreinstellung von 46003 haben wird der Interrupt jede Sekunde ausgelöst und die Interrupt Routine abarbeiten

Tabelle 1- 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  Anschluß konfiguriert ob er mit dem Ausganspin verbunden wird oder nicht
(00= nicht verbunden) 01= OC1A verbunden
0
0






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


0
0




Der Ausgang OC1A ist beim hochzählen 0 bis Vergleichswert 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 RegisterIn 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¨ ost.








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










Tabelle 2 - 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 registriert bei 0 die fallende
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







nach oben









Tabelle 3 Timer Counter Interrupt Maske - TIMSK

Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

OCIE2
TOIE2
TICIE1
OCE1A
OCIE1B
TOIE1
-
TOIE0
Interrupt für Timer 1 aktiviert





1


Interrupt für Timer 0 aktiviert







1



Tabelle 4 -Status Register SREG

Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

I
T
H
S
V
N
Z
C
Globale Interruptfreigabe bei 1 sind Interrupts freigeschaltet bei 0 gesperrt
1









Aktualisiert 27.01.2019
Copyright by Manfred Schrod 2009