PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenz für OCR2 ausrechnen



sloti
10.01.2008, 17:18
Hi,
ich hab mal ne Frage zur Berechnung von Frequenzen, die dann an OCR2 zum Beispiel ausgegeben werden können. Ich kann nämlich keinen zusammenhang zwischen der Frequenz und der Bit initialisierung des registers finden.
Hier mal ein paar Programmbeispiele dazu:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; In dem Beispiel wird das Register OCR2 auf 40 kHz gesetzt aber wie kommt man da auf den wert 64 bzw. binär 01100100. Danke schonmal im vorraus.

mfg
Erik

Moritz f.
10.01.2008, 19:18
Hi,
ein blick ins Datenblatt wirkt oft wunder. . .
um dir das ganze genau zu erklären benötige ich aber noch die Frequenz mit der dein µC betrieben wird und eventuell den Controller

Ich nehme jetzt mal den Timer2 von Atmega32 an.

Bei dem stehen im Datenblatt auf Seite 118 ein paar Daten zu der von dir verwendeten Betriebsart. (ich schätz mal CTC)

Auch zu finde ist die Formel f=fquarz/(2*prescale*(1+OCR2))

Herausfinden wie die gewünschte Frequenz erzeugt werden kann kann man nun durch umformen auf OCR2, das ist der Wert bei dem der interrupt ausgelößt wird. Nun muss man die verschiedenen prescaler einsetzen und schauen wann ein Wert für OCR2 herauskommt der größer 0 ist.

Der Timerfrequenz ist also die Quarzfrequenz geteilt durch den Prescaler, und wenn nun die Timervariable die in genau dieser Frequenz erhöht wird den im Register OCR2 gespeicherten Wert erreicht wird der Interrupt ausgeführt, der Timer wieder von 0 gestartet und das ganze beginnt von neuem.

An dieser Stelle erklärt sich auch der Betriebsartenname CTC, dieser bedeutet nämlich Clear Timer on Compare Match.

So, hoffentlich hab ich das verständlich erklärt bzw. die Frage richtig verstanden.

lg MoFe

ps: ich weiß nicht ob du das weißt (du hasts oben nicht geschrieben) aber das 64 ist hexadezimal 64, nicht dezimal.
(wahrscheinlich hasts eh verstanden, aber da du dann später bei dem 01100100 noch binär dazugeschrieben hast und vorher eben nicht hexadezimal dachte ich das ichs nochmal erwähne)

so ich hoffe ich hab das verständlich erklärt

sloti
12.01.2008, 17:03
Hi,
danke erstmal für deine Anwort, ist sehr gut Verständlich. Meine Kontrollrechnungen passten ziemlich genau zu dem Beispiel. \:D/

mfg
Erik

uwegw
12.01.2008, 17:48
Um die Werte für bestimmte Frequenzen zu berechnen, gibts nen praktisches Tool:
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=123

sloti
12.01.2008, 20:04
Hi uwegw,

das tool ist echt hilfreich, danke! :)

mfg
Erik

albi1989
15.02.2008, 18:18
hmmm ich bekomm bei dem Programm aber nen anderen wert raus als bei der Formel
also ATmega 8 und ich möchte eine Frequenz von 36KHz
ohne Prescaler mit Toggel OC2
Formel:
36036.03..=8000000/(2*(1+110))

also muss doch 110 in Hex 6E in den OCR2
das prog sagt mir bei diesen einstellungen 6F

was bedeuted das überhaubt wenn ich den Com20 setze also Toggel OC2 on compare match

Moritz f.
15.02.2008, 21:25
Hallo,
schau dir mal die Zahlen (6E=110 und 6F=111) genau an. Da is genau 1 Unterschied. Is also nicht sehr tragisch. Allerdings ist der mit Formel berechnete Wert etwas genauer. Wahrscheinlich liegt der unterschied in einem Rundungsfehler des Programmes.

Toggle OC2 on compare match bedeutet das wenn der Zähler des Timers den gleichen Wert hat wie das Vergleichsregister, der Zustand am Pin OC2 "umgedreht" wird. Also aus 1 wird 0 und aus 0 wird eins.

lg MoFe

albi1989
16.02.2008, 11:32
also funzt das prog ja so wie es soll :D das gut zu wissen
ich war nur leicht verwirrt ob ich vlt ein berechnugns fehler gemacht habe
naja hmm jetzt hab ich dabei noch ein Fehler passt eig nicht ganz ins Topic aber wenn wir schon bei dem Programm sind

Bei der Baudrate wollte ich 2400 mit einem 16MHz

Die Formel dafür ist ja UBBR=Frequenz/(16*Baudrate)-1
Ergebnis ist 415.66 gerundet 416

Fehler sind bei mir 0,08%
Das prog zeigt aber ? in beiden Feldern an warum?
UBRR hat Low und High Register also ist 416 kein Problem eigentlich

uwegw
16.02.2008, 12:07
Das Programm ist schon etwas älter. Die ersten AVRs (die 90S...-Serie) hatten nur einen 8bit-Baudratenteiler. Daher ließen sich mit schnellen Quarzen manche langsamen Baudraten nicht einstellen. [edit: sie liefen aber auch nur mit 8MHz] Aber da dein Mega8 ja nen 16bit-Register dafür hat, sind deine 416 der richtige Wert für deinen Fall.

Das war mir an dem Programm bisher noch gar nicht aufgefallen. Liegt wohl daran, dass die übliche Baudrate 9600 ist, und die kriegt man selbst bei 20MHz noch in 8bit unter...