-
Timer 2
Kann dies bitte mal jemand detailliert erklären, wie es hier durch Setzen der Register TCCR2, OCR2 und TIMSK zu 36 kHz kommt.
Code:
/* Timer2, zum Betrieb mit der seriellen Schnittstelle, fuer die IR-Kommunikation auf 36 kHz eingestellt. */
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle fuer 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter
Das gleiche bitte für die Ultraschall-Funktion mit 40 kHz:
Code:
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100; // 40kHz @8MHz crystal
TIMSK |= (1 << OCIE2); // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
-
Ich versuche es mal selbst. Bitte korrigieren, falls falsch:
36 kHz:
Im Register TCCR2 werden die Bits WGM20, WGM21, COM20, COM21, CS20 auf 1 gesetzt.
Das Register OCR2 wird auf hexadezimal 91 - dezimal 145 - gesetzt.
Im Register TIMSK wird das Bit TOIE2 auf 1 gesetzt.
WGM20 und WGM21 bedeuten Modus "Fast PWM".
Pin OC2 wird durch COM20 und COM21 auf "Compare Match" gesetzt.
CS20 bedeutet "No Prescaling".
OCR2 = x91 = dec145 = b10010001 wird ständig mit TCNT2 verglichen. 36 kHz ergeben sich durch 256 - 145 = 111.
4000000 / (256 - 145) = 36000
TOIE2 in TIMSK gesetzt bedeutet "Interrupt Overflow Enabled"
-
Hallo,
der Asuro läuft aber mit 8MHz, deswegen wird für 72000 ausgerechnet, damits nachher wieder passt, also bis $91 zählen ist nur die halbe Frequenz.
-
Verstehe ich leider noch nicht komplett. Kann mal jemand, der zu 100% durchblickt, bitte die kompletten Formeln hinschreiben und begründen, die mit f = 8 MHz und OCR2 = 0x91 als Input beginnt und 36 kHz als Output liefert.
-
die pwmfrequenz hat ja mit dem dutycycle (also wie lange der pin pro durchlauf auf HIGH bleibt) nichts zu tun. bei fast pwm wird nur hochgezählt bis 0xFF. Also:
f=f(osc)/(prescaler*TOP)=8MHz/(1*256)=31250Hz
schlagt mich wenns net stimmt -.-
EDIT: quatsch. sollen ja 36kHz werden. mom, ich guck nochmal ins datenblatt. sry
-
Die Initialisierung von oben stammt aus der neuen AsuroLib, bei dieser gehört aber dann auch noch der Teil in der ISR dazu, dort wird zum Timer $25 addiert.
In der origianl asuro.c wird der CTC-Modus verwendet, und bei jedem Compare der Pin getogglet.
-
Du meinst diesen Teil des Sourcecodes?
Code:
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25; //dezimal 37
count36kHz ++;
if (!count36kHz)
timebase ++;
#ifdef RC5_AVAILABLE
if (enableRC5 && !(count36kHz % 8))
IsrRC5(); // wird alle 222.2us aufgerufen
#endif
}
OK, das ist wichtig, weil TCNT2 ja mit OCR2 vergleichen wird.
Könnte bitte jemand exakt und sequentiell erklären, wie TCNT2 in Bezug auf die Frequenz von 8 MHz zählt, wann und warum diese 37 ($25) addiert werden, wann und wie genau der Vergleich mit OCR2=145 ($91) erfolgt und wie aus diesen Zahlen 36000 Hz entstehen. Ich schaffe es leider noch nicht ganz sicher, würde es aber gerne komplett verstehen. Bitte nur die lib 2.7 beachten.
-
@robocat:
8000000 / (1*(256 - 145)) = 2*36036
Da spielt die Addition von 37 hinein. Diese Anpassung von 36 kHz auf 72 kHz kapiere ich aber leider noch nicht vollends, stehe da auf dem Schlauch.
-
ich gebs auf. sorry für die verwirrung. bin heut wohl noch so im halbschlaf.
gruesse
-
Jetzt muss Du noch erklären, warum der Wechsel gerade bei 145 erfolgt?
37 -> LO -> 145 -> HI -> 256=37 -> ...
145-37= 108
256-145=111
Das ist doch nicht ganz symmetrisch. Da hätte man doch eher 146 oder 147 für OCR2 genommen.
EDIT: Robocat hat seine Erklärung leider zurück gezogen. Er hatte erklärt, dass beim Overflow der Zähler nicht auf 0, sondern auf 37 gesetzt wird. Bei 145 würde der Ausgang von LO auf HI gesetzt, bei 256 dann wieder von vorne. Das ergibt dann aber mit 8000 kHz / (256-37) = 36,5 kHz und ist vielleicht falsch. Aber wie geht es genau?
Ist offensichtlich schwierig zu kapieren, selbst für Experten. Jetzt will ich es aber ganz genau wissen.
Also meine obige Formel scheint mir immer noch der richtige Weg zu 36 kHz. Jetzt muss nur jemand die genaue Abfolge und die Bedeutung der Addition von 37 beim Overflow des Timers erklären.