Mit nem 555er wollte ich nicht erst anfangen. Also nen Tiny13 genommen und mal schnell was getestet.. Funktioniert soweit, nur irgendwie ist das Signal etwas "zappelig" aufm Oszi. Es weicht ca. +/- 100Hz ab. Ist das ein Messfehler oder stimmt am Code etwas nicht? Verbesserungsvorschläge? $regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 16 $swstack = 5 $framesize = 16 Config Portb.3 = Output Config Timer0 = Timer , Prescale = 1 On Ovf0 Toggle_isr Enable Timer0 Start Timer0 Enable Interrupts Do Loop End Toggle_isr: Timer0 = 192 Toggle Portb.3 Return
1. Kann der Timer einen bestimmten Pin selbst toggeln 2. Ist der interne RCO recht ungenau
1. Ist das nicht Wurscht welcher Pin? 2. Der Tiny läuft soviel ich weiss nicht mit externen Quarzen. Muss ich nen anderen µC nehmen?
1. Man braucht keine Interrupts, alles geht in HW. 2. Entweder man nimmt einen Quarzoszillator oder einen Tiny25 3. Man könnte auch den RCO kalibrieren (soweit es geht für eine bestimmte Temperatur und Vcc)
+/- 100 Hz bei 38kHz ist eine gute Genauigkeit und stört einen IR Empfänger nicht im Geringsten. Der Attiny 13 reicht für IR Fernbedienung allemal. Aber ich würde mir nochmal den Timer anschauen, da der den OC0A (PB0) automatisch toggeln kann.
Herr Mueller schrieb: > Aber ich würde mir > nochmal den Timer anschauen, da der den OC0A (PB0) automatisch toggeln > kann. Das werd ich morgen mal tun.. Hab sonst halt noch nicht viel mit dem Tiny gemacht, sonst nur PWM und alles in Bascom. Er soll ja auch nur das Rechtecksignal machen und nicht mehr.
Schau Dir mal den CTC-Mode an, stelle den OC-Pin auf "Toggle on compare". Damit kannst Du Dir den Timer so einstellen, dass er nahezu 38kHz abgibt. Um Pulse zu erzeugen, brauchst Du dann nur noch das DDR-Register des OC-Pins auf Ausgang/Eingang zu schalten oder die COMA/B-Bits im Timer-Control-Register entsprechend zu beeinflussen. Einen Interrupt zur Generierung einer stabilen Pulslänge brauchst Du auch, um die Bits zu kodieren. Dieser Interrupt kann von dem 38kHz-Timer abgeleitet werden, wenn Du diesen durchlaufen lässt.
Ich bin mit dem Timer nicht vorangekommen. Keine Ahnung wie das mit dem CTC funktionieren soll (braucht es da Assembler?). Wäre nett wenn mir da jemand mit nem Codeschnipsel auf die Sprünge helfen könnte. Obwohl hier der Schnipsel wohl gleich das ganze Programm darstellen wird ;) Danke im voraus.
neuer Name schrieb: > braucht es da Assembler? Nein. Steht doch alles im Datenblatt ganz ausführlich erklärt: 11. 8-bit Timer/Counter0 with PWM 11.9 Register Description Table 11-8. Waveform Generation Mode Bit Description Peter
neuer Name schrieb: > Ich bin mit dem Timer nicht vorangekommen. Wie sieht denn dein bisheriger CTC-Versuch aus? Vielleicht hast du irgendein Bit in einem der TCCR0-Register übersehen?
Hi >Obwohl hier >der Schnipsel wohl gleich das ganze Programm darstellen wird ;) Wenn das Signal für einen Integrierten Empfänger (z.B. TSOPxyz) Sein soll, dann reicht es nicht. Die Teile vertragen kein Dauersignal. MfG Spess
Spess53 schrieb: > Wenn das Signal für einen Integrierten Empfänger (z.B. TSOPxyz) Sein > soll, dann reicht es nicht. Die Teile vertragen kein Dauersignal. Davon spricht doch auch gar niemand. Die 38kHz dienen als Träger. Dieser wird dann von einer Unterroutine gepulst. Soweit sind wir aber noch nicht ;-)
Hi >Davon spricht doch auch gar niemand. Die 38kHz dienen als Träger. Dieser >wird dann von einer Unterroutine gepulst. Soweit sind wir aber noch >nicht ;-) Davon war aber bisher nicht die Rede: >Er soll ja auch nur das Rechtecksignal machen und nicht mehr. MfG Spess
Wie in meinem Code oben soll der Attiny13 NUR ein Rechtecksignal machen. Die Frage ist wie das jetzt besser geht. Ich weiss nicht wie man in Bascom die Bits in den Timer Registern manuell setzt. Habe das nur mit Config Timer usw.. gemacht. In der Bascom Hilfe finde ich auch nix wie ich das Registerzeugs aus dem Datenblatt ins Bascom "übersetze".
@neuer Name Du kannst direkt im Quelltext in die Register schreiben, so wie sie im Datenblatt heißen. Als Beispiel: Timsk.ocie1b = 1 Das bedeutet: Setze das Bit OCIE1B im Register TIMSK. Du mußt jetzt im Datenblatt alle Register und die Bits darin heraussuchen, die mit dem Timer 0 und dessen Betriebsart zusammenhängen. MfG Paul
neuer Name schrieb: > Wie in meinem Code oben soll der Attiny13 NUR ein Rechtecksignal machen. > Die Frage ist wie das jetzt besser geht. Ich weiss nicht wie man in > Bascom die Bits in den Timer Registern manuell setzt. Habe das nur mit > Config Timer usw.. gemacht. In der Bascom Hilfe finde ich auch nix wie > ich das Registerzeugs aus dem Datenblatt ins Bascom "übersetze". Oben schreibst du, dass du das nicht mit nem 555 machen willst. Wieso nicht, wenn du dir hier doch den Arsch brichst? Dir schien es doch nur um das Signal zu gehen und nicht darum den Tiny zu bändigen. Manchmal ist einfach halt einfach. Oder nicht?
Frank O. schrieb: > Oder nicht? Nein. Erstens läuft das Programm, nur geht es wahrscheinlich besser. Zweitens ist der 555 out. @Paul: die Schreibweise WGM02 = 2 COM0A1 = 1 erzeugt den Fehler 46. Keinen Plan was das wieder ist, aber so geht es nicht.
neuer Name schrieb: > @Paul: die Schreibweise > > WGM02 = 2 > COM0A1 = 1 > > erzeugt den Fehler 46. Keinen Plan was das wieder ist, aber so geht es > nicht. Guck mal genau was unser Dichter geschrieben hat: > Timsk.ocie1b = 1 Also REGISTERName PUNKT Bitname
Hab gerade noch etwas herumprobiert und folgender Code funktioniert. Gibts da von den Fachleuten noch was zu meckern? $regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 16 $swstack = 5 $framesize = 16 Config Portb.0 = Output 'Ausgang Rechtecksignal Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1 Ocr0a = 131 Timsk0.ocie0a = 1 Tccr0a.com0a1 = 0 Tccr0a.com0a0 = 1 Do Loop End 'Ende des Programms
...Name schrieb: > Ocr0a = 131 > Timsk0.ocie0a = 1 Ocr0a = 131: erreicht nur 36,363 kHz Timsk0.ocie0a = 1: warum Interrupts enablen?
Für ein IR Signal wäre ein Tastverhältnis um 25 % besser geeigent. Auch das lässt sich als PWM Signal herstellen - zur Not sogar einfach mit 8 bit PWM ohne veränderte obere Grenze. Das gibt dann zwar 37, 5kHz, aber auch das passt noch. Das sollte auch mit BASCOM noch einzustellen sein. Mit variabler oberer Grenze kommt man dann auch noch genauer auf 38 kHz, so dass dann der RC Takt die Genauigkeit begrenzt.
iwnm schrieb: > Ocr0a = 131: erreicht nur 36,363 kHz Hast Recht, es muss 124 heissen. Durch die Ungenauigkeit des RCO ergeben sich 122-126, je nach Chip (habe es bei 4 Stück getestet). Ulrich schrieb: > Für ein IR Signal wäre ein Tastverhältnis um 25 % besser geeigent. Warum?
Obwohl nicht explizit erwähnt geht, zumindest im Simulator, auch: COMPARE0A = 124 '(OCR0A = 124) CONFIG TIMER0 = TIMER , PRESCALE = 1 , COMPARE A = TOGGLE , CLEAR TIMER = 1
Beim IR Signal ist das 50% Tastverhältnis nicht optimal, weil im Vergleich zum erzeugten IR Signal relativ viel Strom verbraucht wird. Bei festem Spitzenstrom ist der Stromverbrauch ist proportional zum Tastverhältnis. Das Signal, also die 38 kHz Fourierkomponenten von der IR Intensität verhält sich aber etwa wie der Sinus von (PWM * pi). Im Vergleich zu 50% Tastverhältnis hat man mit 25% den halben Stromverbauch, aber rund 70% der Signalstärke. Alternativ könnte man durch mehr Spitzenstrom bei gleichem Stromverbrauch etwa 40% mehr Signal erzeugen.
Hallo Ich habe leider ein ähnliches Problem... starke schwankungen (bis 3KHz). Ich benötige das Signal für IR, wenn ich dann ein Signal sende schwankt der Pegel des IC's immer zwischen high/low. Code hätte ich hier:
1 | |
2 | #include <avr/io.h> |
3 | #define F_CPU 1000000UL
|
4 | #include <util/delay.h> |
5 | |
6 | |
7 | int main() |
8 | {
|
9 | OSCCAL = 173; |
10 | TCCR0A |= (1<<COM0A0) | (1<<WGM01); |
11 | TCCR0B |= (1<<CS00); |
12 | OCR0A = 108; |
13 | DDRB |= (1<<0); |
14 | while(1) |
15 | {
|
16 | }
|
17 | }
|
Folgendes bereits versucht: * Frequenz per Interrupt oder Overflow - keine veränderung * Controller gegen baugleichen ausgetauscht - kein Erfolg * Taktung des MC geprüft - soweit i.O. ~8MHz. (+/- 150KHz. seltene Ausreisser) * Kondensator an +/- für Glättung der Betriebsspannung - kein Ergebnis * Mit Timern kann ich nicht besser als 38.45 KHz. einstellen - ist das schlimm? * Manuell per _delay versucht - Frequenz sehr gut (38 Khz. +/- 0.15KHz.) Fazit: Manuell (_delay) geht es, aber sobald Timer ins Spiel kommen geht es so gut wie nicht mehr... was ist da los? Evtl. sogar Oszilloskopfehler? Danke schonmal für die Tipps.
Kleiner Nachtrag zu später Stunde: Der Vorwiderstand der IR Diode war falsch gewählt, das Signal an sich nicht genug abweichend um die Sendung zu manipulieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.