erstellt 17.11.2009
|
Tonausgabe
mit Atmega 8
|
Eine Tonausgabe kann beim Atmega 8
unter anderem auch ausgegeben werden indem Timer 1 direkt an einen Pin
ein Signal ausgibt,
dabei wird das Signal nicht vom übrigen
Programm in seiner Frequenz , also Tonhöhe beinflusst.
Andere Mikrokontroller der Firma Atmel haben teilweise auch die
Möglichkeit das über andere Timer zu bewerkstelligen,
beim Atmega 8 geht das allerdings nur mit Timer 1.
Das Grundprinzip ist folgendermaßen:
Ein Zähler
läuft hoch und und schaltet bei erreichen des Endwertes ( bei
16 Bit =65535) den Ausgangspin um .
Um den Wert ändern zu können also die Zeit zu
beeinflussen, hat man die Möglichkeit zum einen die
Taktfrequenz in einen gewissen Rahmen zu verändern so dass der
Zähler später den Ausgangspin umschaltet, oder aber
den Zähler nicht von Null an loslaufen zu lassen sondern ihn
mit einem Vorgabewert zu versehen,
so dass er früher den
Ausgangspin umschaltet.
Um die Taktfrequenz zu verändern gibt der Atmega die
Möglichkeit die Frequenz durch einen sogenannten Prescaler(
Vorteiler ) durch folgende Werte herunter zu
teilen:8-64-256-1024 .
Dies
kann im Register TCCR1B ( siehe Tabelle unten) unter den Bit's 0-1-2
vorgegeben werden.
Im vorliegenden Fall wird der Takt durch 8 geteilt.(
siehe Tabelle unten TCCR1B)
In Tabelle TCCR1A Bit 0 und 1 , und
in Tabelle TCCR1B Bit 3 und 4 wird die Arbeitsweise des
Zählers angegeben , in den hier vorliegenden Fall ist das der
CTC Modus
(Clear Timer Compare
Match) das bedeutet das der Zähler bis zum vorgegebenen
Vergleichswert zählt und dann einen Reset auslösst,
also der Zähler wird auf Null gestellt
und fängt von
vorne an zu Zählen.
Der Vergleichswert wird mit der Anweisung "Compare1A" angegeben.
Nehmen wir einmal an wir haben den
Prescaler auf 8 eingestellt und den Vergleichswert auf 0. So wird in
diesem Fall die Höhe der Frequenzausgabe
folgendermaßen ermittelt:
Taktfrequenz geteilt durch den Vorteiler, dann noch einmal durch 2
teilen , weil ja bei jedem erreichten Vergleichswert der Ausgangspin
einmal umgeschaltet wird und nicht zurückgesetzt wird.
Durch einsetzen der ersten drei Bits, durch den Wert Null im Register
TCCR1B kann das Tonsignal augeschaltet werden
(TCCR1B=&B00001000).
|
Frequenzberechnung
|
Und so
ermitteln wir die Tonfrequenz
|
Taktfrequenz= 1Mhz |
Taktfrequenz / Vorteiler / 2
/Comparewert |
Vorteiler = 8 |
1000000 / 8 =125000 / 2 /200= 312,5
Hz |
Vergleichswert=200 |
|
Wenn wir
nun die Formel umstellen um einen Vergleichswert (Compare)
einzustellen:
|
|
|
Tonfrequenz= 1000 |
Taktfrequenz
/Vorteiler/2/Tonfrequenz |
Taktfrequenz=1Mhz |
1000000 / 8 / 2 / 1000 = 62,5
Voreinstellung des Vergleichsertes |
Vorteiler=8 |
|
|
Die
Registereinstellungen haben folgende Bedeutungen:
|
TCCR1A
|
Bit
|
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
COM1A1
|
COM1A0
|
COM1B1
|
COM1B0
|
FOC1A
|
FOC1B
|
WGM11
|
WGM10
|
Legt fest das Pin PB1 (OC1A) als Ausgang dient |
0 |
1 |
|
|
|
|
|
|
Legt bei Bedarf fest das Pin PB2 (OC1B) als
Ausgang benutzt wird |
|
|
X |
X |
|
|
|
|
|
|
|
|
TCCR1B
|
Bit
|
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
ICNC1
|
ICES1
|
-----
|
WGM13
|
WGM12
|
CS12
|
CS11
|
CS10
|
Timer 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
|
Takt bei fallender Flanke |
|
|
|
|
|
1
|
1
|
0
|
Takt bei steigender Flanke |
|
|
|
|
|
1
|
1
|
1
|
|
Im
Register TCCR1B werden mit den Bits 2-1-0 der Prescaler eingestellt
also in wie weit der Tackt des Atmegas heruntergeteilt wird ,
oder aber
wenn der Takt von außerhalb angelegt wird , an welcher Flanke
der Takt registriert werden soll , bei abfallender oder steigender
Flanke. |