IR Sender ATTINY85

Gast #5378884
Lesenswert?

Hallo,

Ich versuche eine Simple Fernbedinung zu bauen,

Ich verwende dazu einen ATTINY 85 und eine IR LED

Hier der Code, am Oszi siehts gut aus, nur der Fernseher macht nix

void setup() {
 DDRB |= (1<<PB0); //Set pin PB0 as output
 TCNT0 = 0;
 TCCR0A=0;
 TCCR0B=0;

 TCCR0A |=(1<<COM0A0); //Timer0 in toggle mode Table 11-2
 TCCR0A |=(1<<WGM01); //Start timer 1 in CTC mode Table 11.5
 TCCR0B |= (1 << CS00);// Prescaler table 11.6
 OCR0A=105; //CTC Compare value

pinMode(1, INPUT); // Pin ist Eingang   //Taster

}

void loop() {

  int onoff[]={4500,4500,560 .. . .. . };
  int laenge = sizeof(onoff) / sizeof(onoff[0]);
  DDRB &= ~(1<<PB0);          // Pin PB0 auf low


  if (digitalRead(1) == HIGH) {
      for(int i=0; i<laenge;i=i+2){

        DDRB |= (1<<PB0);     // Pin PB0 auf high
        delayMicroseconds(onoff[i]);
        DDRB &= ~(1<<PB0);   // Pin PB0 auf low
        delayMicroseconds(onoff[i+1]);

      }
  }
}
Gast #5378933
Lesenswert?

delayMicroseconds() erzeugt nur mit konstanten Parametern halbwegs 
präzise Zeiten, was bei Dir nicht der Fall ist. Dazu funkt dir noch der 
Millisekunden-Systemtimer mit seinen Interrupts dazwischen, sie solltest 
du eventuell sperren.

Dann solltest du berücksichtigen, dass die "Farbe" IR ein weiter Bereich 
ist (nicht so eng definiert wie "grün"). Es ist also wichtig, dass die 
Wellenlänge deiner IR-LED zum Empfänger passt.

Du sendest offensichtlich mit 38 kHz. Bist du sicher, dass dein 
Empfänger diese Frequenz erwartet? Manche Geräte wollen 36kHz sehen, 
manche 40kHz.
#5379014
Lesenswert?

@Stefan Us (stefanus)

>> Die Trägerfrequenz vermisse ich auch, und das ...
>> sollte sicher PORTB ... heißen.

>Das ist schon richtig so. Die Trägerfrequenz erzeugt der Timer. Per
>Software schaltet aktiviert er lediglich den Ausgang zeitweise, so spart
>er sich ein Und-Gatter.

Mag sein, aber die Delays sind trotzdem Murks.

https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/

Ok, da steht nix explizit von konstanten Parametern. Hmm. Ein Blick in 
den Sourcecode von wiring.c verrät, daß die Funktion TATSÄCHLICH mit 
Variablen korrekt arbeitet! Siehe Anhang.
Angehängte Dateien:
Gast #5379104
Lesenswert?

Stefan U. schrieb:
> Dann solltest du berücksichtigen, dass die "Farbe" IR ein weiter Bereich
> ist (nicht so eng definiert wie "grün"). Es ist also wichtig, dass die
> Wellenlänge deiner IR-LED zum Empfänger passt.

Die Farbe Passt, hab die LED mit dem Arduino NANO verwendet und da 
funktioniert das schalten

Stefan U. schrieb:
> Du sendest offensichtlich mit 38 kHz. Bist du sicher, dass dein
> Empfänger diese Frequenz erwartet? Manche Geräte wollen 36kHz sehen,
> manche 40kHz.

Zur Frequenz die sollte auch passen siehe Bild
Angehängte Dateien:
Gast #5379413
Lesenswert?

> Ein Blick in den Sourcecode von wiring.c verrät, daß die
> Funktion TATSÄCHLICH mit Variablen korrekt arbeitet!

Das ist interessant. Ohne großartig nachzudenken war ich einfach davon 
ausgegangen, dass es sich einfach um ein Makro für _delay_us() handeln 
würde.

Richtig doof finde ich, dass diese Arduino Implementierung 
ausschließlich mit 8 und 16MHz funktioniert. Arduino ist eine ziemlich 
Beschränkte Welt. Scheint für Leute optimiert zu sein, die nicht lesen 
wollen.

Wobei: In diesem Fall ich derjenige, der nicht gelesen hat. Das ist mir 
echt unangenehm.

Zurück zur Frage: Nachdem nun die Trägerfrequenz, die Wellenlänge und 
die Delays geklärt sind, sehe ich in deinem Programm keinen Fehler mehr. 
Bleibt also nur die Hardware oder noch Banaler: Deine Codierung ist 
falsch.

Kontrolliere mal mit einer Videokamera (geht auch mit Smartphones), ob 
die IR-Led flackert, wenn du etwas sendest.

Bist du denn sicher, dass deine Codierung richtig ist?
Gast #5380347
Lesenswert?

Mario M. schrieb:

> Wenn das der Ausgang des ATTiny ist, dann hat S. Landolt doch Recht.

Genauso wäre das, keine Spur vom Träger zu sehen. Aber: Der Timer ist 
zumindest nicht so falsch initialisiert, dass garnix mehr herauskommen 
würde. Zumindest der tatsächlich generierte Träger müsste zu sehen sein. 
Also: dass kann eigentlich nicht am Pin 5 des Attiny gemessen sein.

Allerdings ist sehr fraglich, ob die Trägerfrequenz stimmt:
1
OCR0A=105; //CTC Compare value
2

3
36000 * 2 * 106 =  7632000

Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.

Zu dem dadurch generierten systematischen Fehler kommt ja u.U. auch noch 
ungünstig die Abweichung des RC-Oszillators hinzu, was u.U. zu einem 
Gesamtfehler des Trägers von deutlich mehr als 10% führen könnte.

Wenn es daran liegt: Sehr wahrscheinlich würde der TV trotzdem 
reagieren, wenn man nur nah genug rangeht.
Gast #5380379
Lesenswert?

> Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.

Doch, das passt. Wir haben oben anhand der delay Funktion egsehen, daß 
es nur 8MHz oder 16MHz sein können. Am Foto sehen wir, daß er den R/C 
Oszillator verwendet. Bleiben also nur die 8MHz übrig.

8Mhz  2  106 = 38kHz (ungefähr)

> 36000
Wo hast du diese Zahl her?

> Zu dem dadurch generierten systematischen Fehler kommt ja u.U. auch noch
> ungünstig die Abweichung des RC-Oszillators hinzu, was u.U. zu einem
> Gesamtfehler des Trägers von deutlich mehr als 10% führen könnte.

Dann hätte seine zweite Messung mit dem Oszilloskop am Ausgang des 
Empfängers kein so schönes Bild ergeben.

> Ähm, Arduino hat doch diesen 1 kHz Interrupt?
> Der wird Dir das Timing verhageln.

Das schrieb ich bereits. Ich hoffe doch sehr, dass der Andres inzwischen 
den Befehl zum Sperren der Interrupts hinzugefügt hat.... Andreas?
Gast #5380506
Lesenswert?

Stefan U. schrieb:

>> Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.
>
> Doch, das passt. Wir haben oben anhand der delay Funktion egsehen, daß
> es nur 8MHz oder 16MHz sein können.

Woran sieht man das anhand einer Delay-Funktion? Die ist doch typisch 
völlig blöd, kann nur um das "delayen", was ihr als Takt vorgegeben ist 
(Natürlich verrechnet mit dem angegeben Wert für das gewünschte Delay).

> Am Foto sehen wir, daß er den R/C
> Oszillator verwendet. Bleiben also nur die 8MHz übrig.

Nö, das ist definitiv falsch für den Tiny85. Der könnte nämlich z.B. 
auch mit ~16MHz laufen. PLL-Takt 64MHz und Clock-Prescaler 4.
Du kennst dich ganz offensichtlich in der Vielfalt der AVR8 nicht 
wirklich aus...

Genauso interessant: Der Timer könnte dann wirklich mit 64MHz betrieben 
werden...

>> 36000
> Wo hast du diese Zahl her?

Das allerdings ist eine wirklich gute Frage. Tatsächlich: Fast reine 
Spekulation. Geboren allein daraus, dass die überwiegende Mehrzahl der 
FBs heute tatsächlich genau diese Trägerfrequenz benutzt und der TO sich 
(idiotischerweise) in keinster Weise zu der tatsächlich 
gewünschten/erforderlichen geäußert hat, weil er das nämlich mit seinem 
Arduino-Equipment (und seinen Fähigkeiten) nicht messen kann...
Genau so wenig, wie er zum tatsächlichen Takt seines Babys aussagefähig 
ist.

Insgesamt: ein absolut typischer Arduidiot. Und ein schönes Beispiel 
dafür, warum der Arduino-Weg der falsche Weg ist.
Gast #5380766
Lesenswert?

Was du da zeigst, ist kein IR-Code von UE-Fernbedienungen.
Da wird kein TV drauf ansprechen! (Und das ist gut so!)

Bei den IR-Codes gibt es 3 Varianten:
Puls-Dauer variiert, Pausen-Dauer variert, oder Bit-Shift.
Auf jeden Fall sieht man als IR-Signal (oder Ansteuerungssignal
der LED) nur Bursts mit der Trägerfrequenz (mindestens 8, eher
mehr Trägerfrequenz-Perioden) und Pausen mit ähnlicher
Mindest-Dauer.

Auf deinen Oszillogrammen:
- ON-Zeiten > einige Trägerfrequenz-Perioden
- Pausen kürzer, als 8..12 Trägerfrequenzperioden
- Einzelpulse
Ales Mist!

Keine Ahnung, warum man dir alle Infos aus der Nase ziehen muss...
Schon deine µC-Clock "darf" der Helfer sich als 8 MHz selbst
zusammenreimen. (RC/Quarz???) Und der TV-Hersteller ist bestimmt
allergrößtes Geheimnis...
Gast #5381000
Lesenswert?

@c-hater

> Woran sieht man das anhand einer Delay-Funktion?

Augen auf! Ich zitiere aus dem Quelltext der Arduino Delay Funktion:
1
// for the 20 MHz clock on rare Arduino boards
2
...
3
// for the 16 MHz clock on most Arduino boards
4
...
5
// for the 8 MHz internal clock on the ATmega168
6
...

> Der könnte nämlich z.B. auch mit ~16MHz laufen.
> PLL-Takt 64MHz und Clock-Prescaler 4.

Siehst du hier irgendwo den dazu nötigen Code? Mit den Fuses kommt man 
nur auf 1MHz oder 8MHz. Nur bei 8MHz passt der Code. Außerdem liefert 
sein IR Empfänger im Fernseher ein Signal.

Des weiteren ist die Spannungsversorgung 3,7V. Das wäre für 16MHz und 
20MHz zu wenig.

Also hat er 8MHz. Das ergibt sich aus logischem Denken, eine Fähigkeit, 
die Programmierer beherrschen sollten. Wie ordnest du dich da ein?

Dass der TO deine Frage nach der Taktfrequenz nicht beantwortet, kann 
ich gut verstehen. Von Dir kann er keine sinnvolle Hilfe erwarten. Du 
meckerst nur an Punkten herum, die längst mehrfach geklärt sind!

Und höre bitte auf, Arduino User zu beleidigen. Du hast selbst keine 
Ahnung von dem System!
(Firma: matzetronics) #5554982
Lesenswert?

Andreas schrieb:
> Ich habe es nicht geschft die 8.8us 17.6us pulsdauer mit dem ATTINY
> alleine zu erzeugen,
>
> bin für vorschläge offen

Schaus dir bei IRMP/IRSND an. Frank benutzt logischerweise auch den CTC 
Modus.

Matthias S. schrieb:
> ohne zusätzliche Hardware

Stimmt nicht ganz. Man muss einen Basisvorwiderstand, einen NPN 
Treibertransistor und einen Vorwiderstand für die LED hinzufügen.

batman schrieb:
> Ich würde aber nach einigen
> Reinfällen den Code selbst lieber per Quarz takten oder zumindest den RC
> kalibrieren.

Habe ich bei IRMP/IRSND noch nie machen müssen. Läuft in allen möglichen 
Apparaten hier, allerdings meistens bei Zimmertemperatur.
(Firma: Flk Consulting UG) #5555650
Lesenswert?

Ich benutze einen Tiniy45 mit IRMP und zwei kleinen Knopfzellen. 
Funktioniert sauber die erste Variante hat knapp 1 Jahr gehalten. Mein 
Fehler war, dass ich die  Brown-out detection an hatte. Das konnte ich 
durch eine größere Kapazität für das Pulsen der Diode vermeiden. Jetzt 
ist der Ruhestrom im Sleep Mode mit meinen Mitteln nicht mehr messbar.
Mal sehen wie lange die Batterie jetzt hält.

Gruß
Frank
Gast #5558905
Lesenswert?

okay mein fehler

hier der code

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>


long unsigned int irSignal_Off     = 0xE0E040BF;
long unsigned int irSignal_volUp   = 0xE0E0E01F;
long unsigned int irSignal_volDown = 0xE0E0D02F;



IRsend irsend;

void setup() {

pinMode(3, OUTPUT);

}

void loop() {
   delay(5000);
    irsend.sendSAMSUNG(irSignal_Off, 32);// pin 3
    delay(5000);
}
Gast #5559128
Lesenswert?

Andreas schrieb:
> es geht einfach nicht, es macht nix

Heisst das, aus dem Mikrocontroller kommt kein Signal heraus?

Hast du die Fuses (insbesondere CLKDIV8) richtig eingestellt?

Ich würde Dir empfehlen, einen Logic Analyzer zu besorgen und das Signal 
damit aufzuzeichnen. Dann zeigt du hier einen Screenshot von dem 
Ergebnis, sowie den aktuellen Schaltplan.
Gast #5559166
Lesenswert?

habs jetzt hinbeommen :-)

#include <avr/io.h>
#include <util/delay.h>

unsigned long time_reset = 0;

  int 
onoff[]={1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1 
};
  int 
volUp[]={1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1 
};
  int 
volDown[]={1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,1,1 
,1};


  int laenge = 32;
  int Onoff   =  2;
  int VolUp   =  3;
  int VolDown   =  4;


void setup() {
  pinMode(1, OUTPUT); // Traegerfrequenz
  pinMode(0, OUTPUT); // LED

  pinMode(Onoff, INPUT); // onoff
  pinMode(VolUp, INPUT); // volUp
  pinMode(VolDown, INPUT); // volDown

  // erzeug an PIN 1 die Traegerfrequenz
  TCNT1 = 0;
  TCCR1 = 0;
  GTCCR |= (1 << PSR1); //section 13.3.2 reset the prescaler
  TCCR1 |= (1 << CTC1); // section 12.3.1 CTC mode
  TCCR1 |= (1 << COM1A0); //togle pin PB1 table 12-4
  TCCR1 |= (1 << CS10); //prescaler 1 table 12-5
  OCR1C = 104;
  OCR1A = 104;

}
(Firma: matzetronics) #5567014
Lesenswert?

Stefanus F. schrieb:
> da
> leider mehr Fehler als Bauteile drin.

Naja, man kann eben aus einem Transistor auch ein UND Gatter bauen und 
das kann auch funktionieren. Allerdings ist dann nur der Portpin als 
Stromlieferant da und deswegen kommt aus der LED nur mickriges Licht.

Man muss dem TE einfach mal sagen, das man so einen Timerausgang ganz 
einfach abschalten kann, indem man ihn auf Input stellt und dabei den 
Timer nicht mal stoppen muss. Wenn man dann wieder ein Signal braucht, 
schaltet man den Pin wieder auf Ausgang.
Das ist in der obigen Schaltung auch ganz einfach zu implementieren und 
man muss dann nur noch den Kollektor des Transistors auf Plus legen.
Die komplizierte Mimik, um sich um den Powerdownmodus des MC 
herumzudrücken, habe ich auch schon in kommerziellen Produkten gesehen, 
die Jungs haben dann allerdings Dioden zum Entkoppeln der Tasten 
benutzt.
Naja, wir haben alle mal angefangen und wenn der TE hier auch sämtliche 
Hinweise auf existierende Projekte geflissentlich übergangen hat - 
immerhin hat er geschafft, das die IR LED etwas ausstrahlt.
Gast #5567083
Lesenswert?

Sicher man kann nimmer noch was verbessern, aber das war mein erstes 
Projekt in die Richtung,

batman schrieb:
> Japp, gut ist, was funktioniert,


Stefanus F. schrieb:
> Das kann so nicht funktionieren. Da ist so ziemlich alles sinnlos und
> falsch, was man falsch machen kann.

und es funktioniert doch ;)
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren