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
|
|
|
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 |
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
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)
|
|
|
|
|
|
|
|
Aktualisiert 08.01.2017
|
Copyright by ms2009
|