erstellt  26.04.2014
Um eine Zeitbasis mit dem Atmega 8 Mikroprozessor zu erstellen bediene ich mich wenn möglich des Timer1, weil der eine größere Auflösung ( 65535  gegenüber Timer 0 oder Timer 2 mit 265 ) hat und damit von der Genauigkeit den anderen Timern überlegen ist.
Programm
Bascom Programm einer Zeitbasis von 1 Hz ( 1 Sekunde)
 
Programmcode
Beschreibung
On Timer1 Zeitbasis
Legt fest das in Routine "Zeitbasis" gesprungen werden soll, wenn Timer1 einen Überlauf meldet
TCCR1A = &B00000000
Konfiguration des Timers siehe Tabelle TCCR1A unten
TCCR1B = &B00000011 Konfiguration des Timers siehe Tabelle TCCR1B unten
Timsk=&B00000100
Schaltet den Überlauf Interrupt ein siehe Tabelle TIMSK
SREG=&B10000000
Interrupt Freigabe Global siehe Tabelle SREG
Timer1 = 49910
Timer Voreinstellung je nach Systemtakt und benötigter Zeit hier für Systemtakt von 1 MHZ und benötigter Zeit von einer Sekunde Timer zählt von ( Zeile kann auch entfallen)
Do
Programm Anfang
Loop
Programm Ende
Zeitbasis:
Routine die angesprungen wird nach jedem Timerüberlauf
Timer1 = 49910
Timervorgabe wird auf Wert 49910 zurück gesetzt und zählt dann weiter bis 65535
Portd.6=1
Ausgang Portd.6 wird auf 1 gesetzt
Waitms 10
Pause von 10 Millisekunden
Portd.6=0 Ausgang Portd.6 wird auf 0 gesetzt
Return
Routine verlassen
  
nach oben
Berechnung  des Vorgabewertes bei Timer 1
Arbeitsfrequenz = 1000000 HZ
Vorteiler = 64
Timerauflösung =65536 bei Timer 1
Gewünschte Frequenz= 1Hz
(1000000 /64) /1= 15625 Hz
65535-15625 = 49910    
49910  = Vorgabewert


oder wenn die Led innerhalb der Timer Routine nur getoggelt wird muss bei der Berechnung noch einmal durch 2 geteilt werden.



Programmcode
Beschreibung
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 1000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10 Default Software resvierung Speicher
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , Rs = Portd.1 , E = Portd.0
Ddrc = &B00000000

Ddrd.5 = 1

Ddrd.6 = 1

On Timer1 Timer_eins_routine
Tccr1a = &B00000000
Tccr1b = &B00000011
Timsk = &B00000100 Interrupt für Timer 1 Einschalten
Timer1 = 57722

Sreg.7 = 1  
Interrupts Global freischalten
Do
Toggle Portd.6
Loop
Timer_eins_routine:
Timer1 = 57722
Toggle Portb.0
Return

nach oben
Berechnung  des Vorgabewertes bei Timer 1
Arbeitsfrequenz = 1000000 HZ
Vorteiler = 64
Timerauflösung =65536 bei Timer 1
Gewünschte Frequenz= 1Hz
((1000000 /64) /1)/2= 7812,5 Hz
65535-7812,5 = 57722,5   
57722  = Vorgabewert

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 Atmega8 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 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 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









nach oben
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
TIMSK
Bit
7
6
5
4
3
2
1
0


OCIE2
TOIE2
TICIE1
OCIE1A
OCIE1B
TOIE1
-------
TOIE0

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R
R/W




1





Timer Counter1 , Input Capture Interrupt Enable
Wenn dieses Bit eine 1 hat und der Interrupt Flag im Status Register gesetzt ist ( Globale Interrupt freigegeben) dann ist der Interrupt für Timer 1 Vergelichsregister freigegeben




1




Timer/Counter1,Output Compare A Match  Interrupt Enable





1



Timer/Counter1,Output Compare B Match  Interrupt Enable






1


Timer/Counter1,Overfow Interrupt Enable








1
Timer0 Overflow-Interrupt ein Beispiel (TIMSK.TOIE0=1)

nach oben
SREG
Bit
7
6
5
4
3
2
1
0


I
T
H
S
V
N
Z
C

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W


1







Globalen Interrupt Freigeben (SREG.7=1)

nach oben




Aktualisiert 08.01.2017


Copyright by ms2009