38kHz für IR mit Attiny13 erzeugen

Gast #2951286
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
Gast
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?
Gast
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.
Gast
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.
(Firma: TravelRec.) Persönliche Seite
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.
Gast
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.
Gast
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
Gast
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
Gast
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".
Gast
@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?
Gast
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.
Gast
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
Gast
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
Gast
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.
Gast
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
Gast
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.
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.