Forum: Mikrocontroller und Digitale Elektronik 38kHz für IR mit Attiny13 erzeugen


von spambefreiter neuer Name ;) (Gast)


Lesenswert?

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

von avr (Gast)


Lesenswert?

1. Kann der Timer einen bestimmten Pin selbst toggeln
2. Ist der interne RCO recht ungenau

von spambefreiter neuer Name ;) (Gast)


Lesenswert?

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?

von avr (Gast)


Lesenswert?

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)

von Herr M. (herrmueller)


Lesenswert?

+/- 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.

von spambefreiter neuer Name ;) (Gast)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von neuer Name (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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 ;-)

von Spess53 (Gast)


Lesenswert?

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

von neuer Name (Gast)


Lesenswert?

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".

von Paul Baumann (Gast)


Lesenswert?

@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

von F. F. (foldi)


Lesenswert?

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?

von neuer Name (Gast)


Lesenswert?

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.

von troll (Gast)


Lesenswert?

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

von ...Name (Gast)


Lesenswert?

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

von iwnm (Gast)


Lesenswert?

...Name schrieb:
> Ocr0a = 131
> Timsk0.ocie0a = 1

Ocr0a = 131: erreicht nur 36,363 kHz
Timsk0.ocie0a = 1: warum Interrupts enablen?

von Ulrich (Gast)


Lesenswert?

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.

von ...Name (Gast)


Lesenswert?

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?

von iwnm (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von ...Name (Gast)


Lesenswert?

Ah ja, Danke für eure Ausführungen.

von Cheater (Gast)


Lesenswert?

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.

von Cheater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.