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. 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
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?
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
intmain()
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.