Genau!
Kann ja nochmal versuchen, das Timer-Modul des Tiny13 zu beleuchten - ist ja nicht soo viel. Schau erstmal selbst ins
Datenblatt, dort insbesondere das Kapitel zum Timer0 ab Seite 58.
Der Tiny13 besitzt nur einen Timer. Dieser ist 8 Bit breit.
Das Zählregister (TCNT0) kann also von 0 bis 255 zählen, danach läuft es über. Schau Dir mal Figure 11-1 an. Dort siehst Du das Zusammenspiel der Register mit der Kontrolllogik. Hervorgehoben ist das Zählregister (TCNT0), darunter die beiden Output Compare Register (OCR0A/B), ganz unten die beiden Steuerregister (die den Rest beeinflussen) - lediglich die beiden Register für die Interrupts sind nicht dargestellt.
Von rechts landet die Timer-Clock (clk
t0) auf der Logik. Diese kann entweder über einen Vorteiler (Prescaler) aus dem systemtakt abgeleitet werden, oder aus Flanken des T0-Beinchens. Festgelegt wird das in den Clock Select Bits (CS) in einem der Steuerregister.
Die Kontrolllogik kann einen Timer Overflow Interrupt anfordern, also das entsprechende Interrupt-Flag setzen. Wann das geschieht, hängt vom Waveform Generation Mode (Operationsmodus) ab, welcher auch in den Steuerregistern festgelegt wird.
Die Logik kann jetzt also den Zähler inkrementieren, dekrementieren oder löschen, dabei wird jetzt ständig der Zählerstand mit den Inhalten der beiden Output Compare Register verglichen. Bei Gleichheit wird das jeweilige Interruptflag gesetzt (IntReq), was einen Interrupt auslösen kann; außerdem können die OC0A/B-Beinchen automatisch manipuliert werden. Das wird natürlich auch in den Steuerregistern festgelegt - über den Waveform Generation Mode und den jeweiligen Compare Output Mode.
Der Vergleich TCNT0=0 liefert der Logik das Ereignis "Bottom" - kann je nach WGM das Überlaufflag setzen.
Das Ereignis "TOP" kann je nach WGM durch unterschiedliche Quellen ausgelöst werden.
Erstmal Durch einen Vergleich TCNT0=fixed TOP (fixed TOP ist beim Tiny13 immer 0xFF, also 255) - der Timer nutzt also die vollen 8 bit
Oder den Vergleich TCNT0=OCR0A - wodurch sich die Reichweite des Timers einschränken läßt.
Der Timer bietet 6 Operationsmodi:
- nonPWM mit 0xFF als TOP, singleSlope (NormalMode)
- nonPWM mit OCR0A als TOP, singleSlope (CTC)
- fastPWM mit 0xFF also TOP, singleSlope
- fastPWM mit OCR0A als TOP, singleSlope
- phasenkorrektes PWM mit 0xFF als TOP, dualSlope
- phasenkorrektes PWM mit OCR0A als TOP, dualSlope
Die phasenkorrekten Modi (dual Slope) interessieren Dich erstmal nicht, die benötigt man, wenn man das ON/OFF-Verhältnis ändert, und die ONs/OFFs symmetrisch bleiben sollen.
Da Du einfach und ohne viel Software Deinen Carrier ausgeben lassen willst, sind auch die nonPWM raus. Also fastPWM. Da Du die 38kHz nur mit dem Prescaler nicht triffst, reduzierst Du die Reichweite des Timers. nur eben nicht mittels preload irgendeines Wertes, sondern indem Du das OCR0A als automatischen Überlaufpunkt festlegst. Warum eigentlich 'n Systemtakt von 4MHz?
Also Mode7 (Tabelle1-8 auf Seite 72). KanalA ist wegen der Begrenzung nicht nutzbar, also nimmst Du KanalB. Wenn der Timer bis OCR0A läuft, und Du ein 1:1 ON/OFF-Verhältnis haben willst, muß OCR0B die Hälfte von OCR0A erhalten.
Jetzt zum Compare Output Mode - für fastPWM von KanalB gilt Tabelle 11-6 auf Seite 71. Mode=0 (beide Bits=0) wäre der Pin normaler I/O, nicht an den Timer gekoppelt. COM=1 (also 01binär) ist reserviert, bei 2 (0b10)und 3 (0b11) kontrolliert der Timer den Pegel - PWM eben. Für Dich sind die identisch, da ON/OFF = 1:1...
Bascom unterstützt die komplexeren Möglichkeiten der Timer nicht unbedingt mit Config Timer...
Du kannst aber auch unter Bascom die entsprechenden I/O-Register direkt beschreiben. In vielen Fällen ist das einfacher, da man mit dem Controller-Datenblatt weiß, was die Bits im konkreten Register bewirken. Bei irgendwelchen Config-Befehlen ist das nicht immer unbedingt ganz klar.
Hast Du Denn mal 'ne Möglichkeit, das auszuprobieren, und mit 'nem Logikanalysator zu kontrollieren?
Andere Sache: Wie ist das mit der LED dann gedacht? Abstrahlwinkel, ok, aber letztendlich stört die doch dann (Reflektion etc) alle Empfänger die dieselbe Trägerfrequenz und Wellenlänge nutzen, oder? Und wie soll das auf den Robot ausgerichtet werden? Du leuchtest ja quasi mit 'ner (infraroten Stroboskop-) Lampe 'n Lichtkegel irgendwohin - wie soll damit jetzt die Grenze definiert werden?