Danke!Zitat von ehenkes
Das ist aber exakt, nicht so "krumme" Werte wie beim PiccoZ ...Ergebnisse an der D10 liegen zwischen 36000 und 36015 Hz.
Ich habe mal mit einem Frequenzzähler und einem Oszilloskop gemessen: Ergebnisse an der D10 liegen zwischen 36000 und 36015 Hz. Passt also gut.
sowas lässt sich halt mit einer pwm schön realisieren. allerdings ist das von der theorie her schon recht grenzwertig: im datenblatt wird exakt 36 khz angegeben, ohne speilraum. deshalb reagiert der asuro auch so allergisch darauf wenn am poti nicht 100%ig die richtige stellung gefunden wird.
Im dem Lib v2.8rc1 ist OCR2 = 0x91(dezimal 145) . Der OCIE2 bit im TIMSK Register wird aber nicht gesetzt.
Erstens brauchen wir diesen Wert in OCR2 immer noch?
Zweitens für eine 36KHz Frequenz müssen wir doch 219Takte + 3Additions Takte = 222Takte zählen (wie beim Overflow Interuppt Enable). Wir zählen ja hier nur bis 145. Kann mir dass jemand vlt. erklären?
Hallo AsuroNeu,
auch dir erst einmal ein "Willkommen im Forum".
Ich fange mal mit 'Zweitens' an.
Der Timer zählt immer bis 255.
Wenn der Timer bei dem numerischen Wert 145 angekommen ist passiert nur etwas.
Dann nämlich wird durch die Initialisierung:
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20)
-- WGM20 und WGM21 setzen den Timer in den "Fast PWM"-Mode
-- COM20 und COM21 setzen im "Fast PWM"-Mode einen 'Output Compare Mode'
==>> auf 'Set OC2 on Compare Match, clear OC2 at TOP
dieser 'Compare Match' ausgelöst.
Verglichen wird der Zählerwert (0 bis 255) mit dem in OCR2 hinterlegten Wert 145.
Somit zählt der Timer zwar natürlich auch bis zu dem numerischen Wert 145, aber er muss dafür nicht 145 mal takten.
Schliesslich wird ja im Interrupt, wenn der numerische Timerwert also gerade von 255 auf 0 geht als erstes diese ominöse 37 auf die 0 addiert.
Somit benötigt die Timerhardware nur 145 - 37 = 108 Takte um auf den numerischen Wert 145 zu kommen.
Jetzt fehlen aber immer noch 3 Zeiteinheiten, um in die Mitte von deinen ausgerechneten 222 Takten zu gelangen.
Diese 3 Zeiteinheiten vergehen aber schon 'von alleine' durch die Addition der 37.
--> Und damit hätten wir nun 108 + 3 = 111 <== die Mitte
Warum ist die Mitte relevant?
In der Mitte wird über die Initialisierung auf:
==>> 'Set OC2 on Compare Match, clear OC2 at TOP
eingestellt,
dass Pin OC2 bei 'Compare Match' (145 in OCR2) gesetzt wird (5 Volt)
dass Pin OC2 bei 'TOP' (numerischer Wert bei 255 angekommen) gelöscht wird (0 Volt)
Und erst wenn beide 'Zählzeiten' abgelaufen sind haben wir eine volle Periode unseres Signals.
Frage 'Erstens' ist damit wohl beantwortet. Ja, brauchen wir noch .
Möglicherweise hilft dir auch dieser Erklärungsversuch etwas weiter. (Schau dort mal bei "Achtung: Es wird nun kompliziert, aber die Initialisierung ist hier das A und O." nach.)
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
Vielen Vielen Dank Sternthaler.
Die Erklärung in dem anderen Thread war super. Jetzt verstehe ich auch warum wir nur bis 145 in OCR2 steht. Da die IR-LED mit 'duty cycle 50% bei 36KHz ' arbeiten.
Deswegen brauchen wir auch den OCIE2 bit im TIMSK nicht setzen, da dieser kein ISR ist, sondern für IR-Kommunikation gebarucht wird.
Danke nochmals.
Lesezeichen