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.
Das Programm
1 &Regfile="m8def.dat" Benutzt Atmega 8 Datenfile für Informationen über Pinbelegung usw
2 &Chrystal=1000000 Weisst den Atmega an mit einer Taktfrequenz von 1 Mhz zu arbeiten
3 DDRB.1=1 Setzt Pin B.1 als Ausgang
4 TCCR1A=&B01000000 Im Register wird festgelegt welcher Ausgang benutzt wird
5 TCCR1B=&B00001010  
6 Compare1A=200  
7 Do  
8 Loop  
9 End  
Aktualisiert 12.02.2019
Copyright by Ms 2009