Hallo
36kHz wäre richtiger, denn das ist die Trägerfrequenz des IR-Signals und auch die des SFH5110-36.
In der orginalen CD-Version der asuro-Library wurde diese Trägerfrequenz über den Timer2 im normalen Modus erzeugt. Beim Überlauf wurde der OC2-Ausgang getoggelt und das Zählregister TCNT2 mit einem Startwert für 72kHz geladen. Bei den späteren Libs wurde das zur CTC-Betriebsart geändert. Dadurch wurde die Timer2-ISR nur noch mit 36kHz aufgerufen. Da die ISR aber auch die Zeitbasis für die Sleep()-Funktionen liefert, dauert eine Millisekunde bei der orginalen Lib 72 Sleep()s und bei den neueren Lib nur 36 Sleep()s. Grundsätzlich, weil die Änderung und Erweiterung gleichzeitig stattfand, funktionieren alle Libs die Msleep() kennen mit 36kHz.
Wirklich clever wurde die Erzeugung der Trägerfrequenz mit den Änderungen von Waste im Rahmen der IR-Abstandsmessung. Jetzt war es möglich, die Hell- und Dunkelanteile des IR-Signals zu beeinflußen. Dieses Timersetup wird auch in der aktuellen Version der Library verwendet, weil sie auch die IR-Abstandmessung unterstützt.
Wie das Timersetup genau funktioniert hatte ich hier mal beschrieben:
https://www.roboternetz.de/community...l=1#post436695
Gruß
mic
Zitat aus dem Beitrag:[Edit]Dieser Absatz erklärt, wie das Timersetup funktioniert, das ist für das Verständniss der IR-Abstandsmessung nicht so wichtig: Beim Start des Counters wird der OC2-Pin auf low gesetzt, beim Erreichen des Wertes im OCR2-Register wird der OC2-Pin nach high umgeschaltet. Der Counter zählt dann weiter bis zum Überlauf, dann wird das Zählregister wieder auf null gesetzt und die Overflow-ISR angesprungen. Bei 8MHz dauert eine 36Khz-Periode ca. 222 Zähltakte, wenn man für den Counter keinen Prescaler verwendet. Beim Berechen des Counterstartwertes und des Umschaltpunktes setzt man nun am Besten am Ende einer Periode beim Überlauf des Zählregisters an. Für 111 Takte vor dem Überlauf muss man den Wert im OCR2-Register auf 256-111=145 oder 0x91 setzen, 222 Takte davor muss das Zählregister starten. Für das Laden des Zählregisters braucht man noch zusätzliche drei Takte: 256-222+3=37 oder 0x25. Die betreffenden Zeilen im Timersetup in asuro.c:
Das += bewirkt, dass inzwischen schon erfolgte Zähltakte nicht ignoriert werden.Code:Im Init(): OCR2 = 0x91; // duty cycle for 36kHz In der ISR: SIGNAL (SIG_OVERFLOW2) { TCNT2 += 0x25; ...
Noch 'ne Info zum Tiny13: Der läuft im Auslieferzustand mit 1,2MHz, ohne internen Vorteiler /8 (Fuses) mit 9,6MHz, mit interner Taktquelle. Hier erzeugt mein 1,2MHz-Tiny13 Servoimpulse mit einer 10kHz-Basis:
https://www.roboternetz.de/community...l=1#post298095
Bei einem umgefuseten 9,6MHz-Tiny wären das ca. 80kHz. Das Feintuning der Frequenz müßte man am OCR0A einstellen.
Lesezeichen