Forum: Mikrocontroller und Digitale Elektronik Attiny45/85 38 KHz Signal erzeugen


von Tony S. (tooony)


Lesenswert?

Hallo in die Runde,

aktuell benötige ich für ein Lichtschranken-Projekt ein einfaches 38 KHz 
Signal, welches einen IR-Emitter ansteuert. Zur Erzeugung möchte ich 
einen Attiny45 oder 85 verwenden. Eine Variante mit dem Arduino Nano 
(testweise für Empfänger) funktioniert bereits. Leider scheitert es 
momentan an der Umsetzung mit dem Attiny45/85... Andere Beiträge hier im 
Forum bzw. im Netz haben mir bisher nicht weitergeholfen.

Angesetzt habe ich mit einem Timer im CTC Mode. Wo liegt der Fehler bzw. 
was fehlt? Folgender Code bisher:

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

int main (void)
{
  DDRB |= (1<<PB0);
  TCNT0 = 0;
  TCCR0A=0;
  TCCR0B=0;

  TCCR0A |= (1 << WGM01) | (1 << COM0A0);
  TCCR0B |= (1 << CS00);
  OCR0A=104;

        sei ();

  while(1){
    // nothing to do
  }
}

Danke für eure Hilfe!

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Was passiert denn, bzw. was passiert nicht?

von Tony S. (tooony)


Lesenswert?

Stefan U. schrieb:
> Was passiert denn, bzw. was passiert nicht?

Nix. Am Ausgang passiert nix. Der Ausgangspin PB0 liegt mit einem 1 KOhm 
Widerstand an der Basis eines BC337. Im Emitter vom Transistor hängt die 
IR LED mit Vorwiderstand.

: Bearbeitet durch User
von bernd (Gast)


Lesenswert?

Programm ist richtig. Das sei() ist überflüssig. LED im Emitter ist 
ungewöhnlich. Skizze. Wo ist der Kollektor angeklemmt?

von Tony S. (tooony)


Lesenswert?

bernd schrieb:
> Wo ist der Kollektor angeklemmt?

Der Kollektor hängt an +5 Volt. Pull-Down an der Basis vom BC337 ist 
nicht verbaut.

von bernd (Gast)


Lesenswert?

Tony S. schrieb:
> Nix. Am Ausgang passiert nix. Der Ausgangspin PB0 liegt mit einem 1 KOhm
> Widerstand an der Basis eines BC337. Im Emitter vom Transistor hängt die
> IR LED mit Vorwiderstand.

Das Licht einer IR LED kann man nicht sehen.
Wie überprüfst du, das da nichts passiert?
Wie groß ist der LED Vorwiderstand?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tony S. schrieb:
> Nix. Am Ausgang passiert nix.
Da wäre jetzt ein Oszilloskop nicht schlecht...

> Der Ausgangspin PB0 liegt mit einem 1 KOhm
> Widerstand an der Basis eines BC337. Im Emitter vom Transistor hängt die
> IR LED mit Vorwiderstand.
Warum eine Kollektorschaltung?

von Thomas E. (thomase)


Lesenswert?

bernd schrieb:
> Das Licht einer IR LED kann man nicht sehen.

Mit einer Digitalkamera kann man das sichtbar machen.

Tony S. schrieb:
> #define F_CPU 8000000UL

Hast du die CLKDIV8-Fuse gelöscht? Sonst erzeugt dein Timer 4,7KHz.

von Jacko (Gast)


Lesenswert?

Ist das deine gedachte Timer-Konfiguration?

WGM0x = ?   sieht aus wie 010 = CTC
COM0Ax = ?  sieht aus wie  01 = Toggle OC0A on Compare Match
CS0x = ?    sieht aus wie 001 = full Clock

Sollte auf den ersten Blick passen.

Wie sind die Clock-Einstellungen? Auf extern gefused und nix
dran? Hättest du in der Richtung GARNIX gemacht, sollten
4,8 kHz rauskommen. (CKDIV8)

von Tony S. (tooony)


Lesenswert?

bernd schrieb:
> Das Licht einer IR LED kann man nicht sehen.
> Wie überprüfst du, das da nichts passiert?
> Wie groß ist der LED Vorwiderstand?

Dessen bin ich mir bewusst. Als Empfänger benutze ich einen TSSOP4838 
mit LED dahinter und Mikrocontroller. Beim Empfang von IR-Signalen (38 
KHz)  leuchtet die LED. Das funktioniert sowohl mit jeder Fernbedienung 
die ich hier habe, als auch mit einem IR Sender den ich mit dem Arduino 
testweise gebaut hatte. Die Arduino Lösung soll nun ein Attiny 
übernehmen.

Der Kollektor des BC337 hängt an +5 Volt. Die IR LED (TSAL 6200) ist mit 
einem 33 Ohm Widerstand am Emitter. An der Basis hängt ein 1 KOhm 
Widerstand. Die Basis geht zum PB0 des Attiny. Die Basis ist ohne 
Pull-Down Widerstand beschaltet.

Testweise hatte ich anstatt der IR Led eine normale sichtbare dran - da 
tat sich auch nix. Hab das ganze auf einem Breadboard aufgebaut.

von Tony S. (tooony)


Lesenswert?

Thomas E. schrieb:
> Hast du die CLKDIV8-Fuse gelöscht? Sonst erzeugt dein Timer 4,7KHz.

Das Häckchen bei CLKDIV8 ist aktuell gesetzt. Was hat es damit auf sich? 
Kannst du da mal aufklären?

Danke für den Hinweis :)

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Tony S. schrieb:
> OCR0A=104;

Bei 8MHz komme ich auf gute 30kHz, versuch Mal 210d / 0xD2
Wobei die normale LED so oder so leuchten muß.

Läuft der ATtiny korrekt an?
Lass Mal in der While(1)-Schleife die anderen Pins an/ausschalten, ggf. 
kannst Du dort auch ein delay einsetzen (kA, ob Das den Interrupt 
stört), damit man das Geblinke der Kontroll-LEDs auch sieht.

MfG

PS:
CLKDIV8-Fuse setzt den internen Teiler :8 - somit läuft der ATtiny mit 
1MHz statt 8MHz.

Trotzdem muß die LED blinken, halt nur nicht in der richtigen 
Geschwindigkeit.

MfG²

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Tony S. schrieb:
> Das Häckchen bei CLKDIV8 ist aktuell gesetzt. Was hat es damit auf sich?

Damit wird der 8-MHz-Takt durch 8 geteilt. Das ist der 
Auslieferungszustand.

von Thomas E. (thomase)


Lesenswert?

Patrick J. schrieb:
> Bei 8MHz komme ich auf gute 30kHz

Wie kommst du darauf?

8Mhz/105/2 = 38,095KHz

von Jacko (Gast)


Lesenswert?

Erster Test auf dem Breadboard:
Transistor abklemmen und eine sichtbare LED:
Anode über 1 kOhm direkt an PB0, Kathode an Masse.

Wenn sie leuchtet:
Sichtbare LED gegen IR-LED tauschen.
Sagt dann der IR-Empfänger (nahe der IR-LED) nix, hast du
keine 38 kHz. - Obwohl die in der Nähe des Empfängers auch
bei 38 +/- 2 kHz ansprechen. (CKDIV...4,8 kHz???)



Eine ordentliche LED-Ansteuerung wäre der zweite Schritt...

von Peter D. (peda)


Lesenswert?

Tony S. schrieb:
> Als Empfänger benutze ich einen TSSOP4838

Der hat eine AGC, d.h. einen konstanten Träger kann man damit nicht 
erkennen. Du mußt die PWM pulsen.

von Stefan F. (Gast)


Lesenswert?

Häufig ist die Fehlerursache auch ganz banal eine falsche Pinbelegung 
des Transistors. Hast du ihn falsch herum gedreht? Häufig werden 
Abblock-Kondensatoren vergessen.

Zeige mal ein Foto vom Aufbau.

von chris_ (Gast)


Lesenswert?

Du könntest einen Frequenzzähler nehmen, um die Frequenz zu überprüfen.

Wenn Du keinen hast, tut es vielleicht ein Arduino:
http://shelvin.de/frequenzzaehler-mit-dem-arduino-uno/

von Horst (Gast)


Lesenswert?

Peter D. schrieb:
> Tony S. schrieb:
>> Als Empfänger benutze ich einen TSSOP4838
>
> Der hat eine AGC, d.h. einen konstanten Träger kann man damit nicht
> erkennen. Du mußt die PWM pulsen.

Den TSSOP gibt es eh nicht. Es gibt den TSOP mit AGC für Fernbedienungen 
und den TSSP ohne AGC für Lichtschranken.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tony S. schrieb:
> Im Emitter vom Transistor hängt die IR LED mit Vorwiderstand.

Schau mal in den IRSND-Artikel. Dort findest Du nicht nur ein 
Schaltbild, wie Du die LED an den Transistor hängen musst, sondern auch 
den Source-Code, wie man eine 38kHz PWM mit dem ATtiny45/85 erzeugt.

von Axel R. (Gast)


Lesenswert?

LED im Kollektor? da halten ich die Variante als Emitterfolger
(Kollektorschaltung) für zielführender. die Variante ist schneller, aber 
- ehrlich gesagt - auch noch nicht probiert, beide Varianten gegenüber 
zu stellen. Na jedenfalls wird der Transistor so nicht in die Sättigung 
getrieben.

schalte zum Test noch eine rote LED in Reihe

Aber:
> Jacko (Gast) schrieb:
> Eine ordentliche LED-Ansteuerung wäre der zweite Schritt...


StromTuner

StromTuner

von Tony S. (tooony)


Lesenswert?

Hallo Leute,

entschuldigt die späte Antwort! Ich hatte jetzt die Gelegenheit weiter 
zu machen. Die Fuse CLKDIV8 hat weitergeholfen - Danke dafür :)

Jetzt liegt es aber noch an der Ausgangsstufe zum IR Emitter. Die 
Reichweite leidet darunter aktuell extrem.

Das IR-Signal geht aktuell über einen 4,7 KOhm Basiswiderstand an einen 
BC337. Die IR LED habe ich mit einem Vorwiderstand von 27 Ohm im 
Kollektor des BC337. Betriebsspannung liefern 3 AA Batterien.

Zum Vergleich: Auf dem Breadboard hatte ich testweise einen BC547 mit 1 
KOhm Basiswiderstand aufgebaut. Die Geschichte hatte wunderbar 
funktioniert. Auf Grund des "hohen" Stroms der IR LED soll aber nun ein 
BC337 eingesetzt werden.

Was sind eure Empfehlungen für die Ausgangsstufe und der Beschaltung des 
BC337?

von bernd (Gast)


Lesenswert?

Tony S. schrieb:
> funktioniert. Auf Grund des "hohen" Stroms der IR LED soll aber nun ein
> BC337 eingesetzt werden.

Was ist das für eine IR-LED? Wieviel Strom verträgt sie und wieviel 
Strom soll hindurch geschickt werden? Wie groß ist die Vorwärtsspannung 
Uf? Bei 3AA Betterien ogne Spannungsregler würde ich mit 5V Vcc rechnen.

von Tony S. (tooony)


Lesenswert?

bernd schrieb:
> Was ist das für eine IR-LED? Wieviel Strom verträgt sie und wieviel
> Strom soll hindurch geschickt werden? Wie groß ist die Vorwärtsspannung
> Uf? Bei 3AA Betterien ogne Spannungsregler würde ich mit 5V Vcc rechnen.

Es handelt sich um eine TSAL 6200.
- Uf: 1.35 V
- If: 100 mA

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tony S. schrieb:
> Das IR-Signal geht aktuell über einen 4,7 KOhm Basiswiderstand an einen
> BC337.

4,7K sind zuviel. Nimm 1K. Hättest Du aber auch sehen können, wenn Du 
mal in den empfohlenen IRSND-Artikel reingeschaut hättest. ;-)

von Tony S. (tooony)


Lesenswert?

Frank M. schrieb:
> 4,7K sind zuviel. Nimm 1K. Hättest Du aber auch sehen können, wenn Du
> mal in den empfohlenen IRSND-Artikel reingeschaut hättest. ;-)

Mit 1K habe ich es ursprünglich probiert. Mir scheint es aber so, als ob 
der Transistor nicht in die Sättigung kommt bei permanent anliegendem 38 
KHz Signal. Messe ich über dem Kollektorpfad die Spannung (Vorwiderstand 
LED + TSAL 6200), dann messe ich rund 2 Volt...

von Carsten R. (kaffeetante)


Lesenswert?

ändere mal

TCCR0B |= (1 << CS00);
OCR0A=104;

in
TCCR0B |= (1 << CS00);
TCCR0B |= (1 << CS02); (Prescaler 1024)
OCR0A=255;

Und schließe dann eine LED mit sichtbarem Licht an. Mit den 
Einstellungen kommst du auf Frequenzen die man mit dem Auge 
unterscheiden kann. Bei 8 MHz Grundtakt ist es ein Flimmern. Bei 1 MHz 
Grundtakt ist es ein Blinken. Wenn gar nichts passiert ist etwas anderes 
Grundlegendes falsch.

: Bearbeitet durch User
von Tony S. (tooony)


Lesenswert?

Carsten R. schrieb:
> ändere mal

Hab mal eine blaue LED eingebaut. 4,7KOhm Basisvorwiderstand hab ich so 
belassen. Die LED blinkt ganz schnell.

Kleiner Nachtrag: Grundlegend funktioniert das ganze ja. Aber die 
Entfernung liegt bei nur ca. einem Meter. Mit dem vorherigen 
Breadboardaufbau waren es mehrere Meter (10 Meter plus).

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?


von Tony S. (tooony)


Lesenswert?

Neue Erkenntnisse: Die Reichweite scheint in Ordnung zu sein, aber mit 
der Software nicht.

Im Attiny45 Sender mit der Ansteuerung wie hier bereits diskutiert und 
folgendem Code ist die Reichweite bei mehreren Metern. Jedoch ist es so, 
dass wenn ich das 38 KHz Signal permanent aussende, dass der Empfänger 
(TSOP4838) das Signal nur einmal erkennt. Halte ich die IR-Strecke kurz 
zu / unterbreche diese und nehme die Unterbrechung wieder heraus, 
erkennt der IR Empfänger wiederum einmal das Signal. Durch on / of 
schalten des Signals habe ich versucht dieses zu kompensieren. Dies 
funktioniert nur bedingt. Der Empfänger erkennt das Signal (LED togglet 
am Empfänger).

#define F_CPU 8000000UL

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

int main (void)
{
  DDRB |= (1<<PB0);
  TCNT0 = 0;
  TCCR0A=0;
  TCCR0B=0;

  TCCR0A |= (1 << WGM01) | (1 << COM0A0);
  TCCR0B |= (1 << CS00);
  OCR0A=104;
    sei ();

  while(1){

    TCCR0B &= ~(1 << CS00);
    _delay_ms(100);
    TCCR0B |= (1 << CS00);
    TCNT0 = 0;
    _delay_ms(10);

  }
}

Der Empfänger besteht ebenfalls aus einem Attiy45 und einem TSOP4838. 
Die Beschaltung ist gleich wie in diesem Beitrag: 
Beitrag "Re: Infrarot LED Lichtschranke"

Die Software dazu sieht aktuell so aus (ohne testweises toggeln der 
LED):

/*
 * IR_Receiver_Gateway.c
 *
 * Created: 12.03.2017 10:50:38
 * Author : Tony
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>

volatile int timerCount = 0;

int main(void)
{
  DDRB |= (1 << PB1);
  PORTB |= (1 << PB1);

  DDRB &= ~(1 << PB3);

  GIMSK = 1 << PCIE;
  PCMSK = 1 << PCINT0;
  PCMSK = 1 << PCINT3;

  TCCR0B = (1<<CS01)|(1<<CS00);
  TIMSK = 1 << TOIE0;

  sei();

    while (1)
    {
    }
}

ISR(PCINT0_vect) {

  TCNT0 = 0;
  TCNT1 = 0;
  PORTB &= ~(1 << PB1);
  //PORTB ^= (1 << PB1);
  timerCount = 0;

}

ISR(TIMER0_OVF_vect) {
  if(timerCount == 3){
    PORTB |= (1 << PB1);
    timerCount = 0;
  } else {
    timerCount++;
  }

}

Ziel ist es eine IR Lichtschranke zu bauen. Der Empfänger soll nix 
weiter machen, als bei anliegendem IR Signal vom Sender einen Low-Pegel 
auszugeben, bei Unterbrechung springt der Pegel auf High. Der Pegel wird 
dann weiterverarbeitet. Eine LED signalisiert am Empfänger die aktuelle 
Stellung des Ausgangs.

Lange Rede...Mein Ansatz am Empfänger (und Sender) scheint mir nicht 
praktikabel zu sein. Kann jemand weiterhelfen? Zur Anwendung kommt die 
Lichtschranke an der Ziellinie bei Sprints.

von Dieter F. (Gast)


Lesenswert?

Tony S. schrieb:
> dass der Empfänger
> (TSOP4838) das Signal nur einmal erkennt.

Datenblatt S. 5 oben.

von Falk B. (falk)


Lesenswert?

@Tony S. (tooony)

>dass wenn ich das 38 KHz Signal permanent aussende, dass der Empfänger
>(TSOP4838) das Signal nur einmal erkennt.

Das ist der Sinn DIESES Empfängers!

>Ziel ist es eine IR Lichtschranke zu bauen. Der Empfänger soll nix
>weiter machen, als bei anliegendem IR Signal vom Sender einen Low-Pegel
>auszugeben, bei Unterbrechung springt der Pegel auf High. Der Pegel wird
>dann weiterverarbeitet. Eine LED signalisiert am Empfänger die aktuelle
>Stellung des Ausgangs.

Dann brauchst du einen anderen Empfänger, nämlich den hier!

https://www.mikrocontroller.net/topic/goto_post/4652837

von Tony S. (tooony)


Lesenswert?

Falk B. schrieb:
> Dann brauchst du einen anderen Empfänger, nämlich den hier!
>
> https://www.mikrocontroller.net/topic/goto_post/4652837

Verstehe! Den TSOP4038 scheint es nirgends mehr zu geben. Könnt ihr eine 
Alternative empfehlen?

von Falk B. (falk)


Lesenswert?


von Peter D. (peda)


Lesenswert?

Tony S. schrieb:
> Jedoch ist es so,
> dass wenn ich das 38 KHz Signal permanent aussende, dass der Empfänger
> (TSOP4838) das Signal nur einmal erkennt.

Wie schon gesagt, der Empfänger ist für modulierte 38kHz ausgelegt.
Pulse einfach entsprechend dem Datenblatt und werte im Empfänger-MC 
Pulse oder keine Pulse aus.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

RTFM!!!

"Some examples which are suppressed are:

• DC light (e.g. from tungsten bulbs sunlight)
• Continuous signals at any frequency
• Strongly or weakly modulated patterns from fluorescent
lamps with electronic ballasts (see fig. 13 or fig. 14).
• 2.4 GHz and 5 GHz Wi-Fi"

: Bearbeitet durch User
von Tony S. (tooony)


Lesenswert?

Danke für eure Antworten. Bei TSSP4038 / TSOP 4038 hatte ich Tomaten auf 
den Augen...

Schalte ich die IR LED für 5 ms an und 10 ms kommt das gepulste Signal 
wunderbar am TSOP4838 an. Soweit erstmal gut. Von einer Lichtschranke 
ist das Ganze aber noch deutlich entfernt. Unterbreche ich den 
Lichtstrahl detektiert der Empfänger dennoch das Signal. Erst wenn ich 
die LED nahezu mit den Händen komplett zu halte, wird das Signal 
unterbrochen.

Hilft hier eine LED Optik oder gibt es noch andere Möglichkeiten?

von Falk B. (falk)


Lesenswert?

@ Tony S. (tooony)

>wunderbar am TSOP4838 an. Soweit erstmal gut. Von einer Lichtschranke
>ist das Ganze aber noch deutlich entfernt. Unterbreche ich den
>Lichtstrahl detektiert der Empfänger dennoch das Signal.

Wie sieht denn dein Aufbau aus? Abstand? LED-Treiber? Möglicherweise 
sieht dein Empfänger Reflektionen auf eine Wand oder so.

von Peter D. (peda)


Lesenswert?

Tony S. schrieb:
> Erst wenn ich
> die LED nahezu mit den Händen komplett zu halte, wird das Signal
> unterbrochen.

Den LED-Vorwiderstand soweit zu erhöhen, bis die gewünschte 
Empfindlichkeit erreicht ist.
Oder einen Tubus über den Empfänger, der seitliche Reflektionen 
abschirmt.

von Dieter F. (Gast)


Lesenswert?

Falk B. schrieb:
> Wie sieht denn dein Aufbau aus?

Falk B. schrieb:
> wunderbar am TSOP4838 an

Bezeichnung des Bauteils überlesen?

von Falk B. (falk)


Lesenswert?

@ Dieter F. (jim_quakenbush)

>Bezeichnung des Bauteils überlesen?

Nö, er testet das Ding jetzt mit einem modulierten Testsignal.

"Schalte ich die IR LED für 5 ms an und 10 ms kommt das gepulste Signal
wunderbar am TSOP4838 an."

Damit kann man auch eine Lichtschranke bauen, wenn gleich das nicht 
optimal ist. Für den TEST der Lichtunterbrechung reicht es allemal.

von Tony S. (tooony)


Lesenswert?

Falk B. schrieb:
> Wie sieht denn dein Aufbau aus? Abstand? LED-Treiber? Möglicherweise
> sieht dein Empfänger Reflektionen auf eine Wand oder so.

Der Aufbau sieht so aus:

Sender: wie bereits hier beschrieben:

- Attiny45
- BC337 mit IR LED plus Vorwiderstand im Kollektor
- BC337 Basiswiederstand 1 KOhm

Empfänger:

- Schaltung analog hierzu: 
Beitrag "Re: Infrarot LED Lichtschranke"
- Attiny45

Von der Distanz her habe ich einen kurzen Abstand (ca. 0,5 Meter), als 
auch 5 bis 7 Meter versucht. Das Signal kommt immer gleich gut an, aber 
bei Unterbrechung des Lichtstrahls (Hand oder Körper dazwischen) wird 
dennoch alles Empfangen.

von Falk B. (falk)


Lesenswert?

@ Tony S. (tooony)

>- Attiny45
>- BC337 mit IR LED plus Vorwiderstand im Kollektor
>- BC337 Basiswiederstand 1 KOhm

Schon mal was von einem Schaltplan gehört?

>- Schaltung analog hierzu:
>Beitrag "Re: Infrarot LED Lichtschranke"
>- Attiny45

Und wie erkennst du das Empfangssignal? Mit der LED? Oder per Software 
im AVR? Die LED ist einfacher, auch wenn sie gepulst wird, das sieht man 
aber nicht bei 10ms Periodendauer.

>Von der Distanz her habe ich einen kurzen Abstand (ca. 0,5 Meter), als
>auch 5 bis 7 Meter versucht. Das Signal kommt immer gleich gut an, aber
>bei Unterbrechung des Lichtstrahls (Hand oder Körper dazwischen) wird
>dennoch alles Empfangen.

Kaum zu glauben. Ist dein Zimmer rundherum verspiegelt?

von Tony S. (tooony)


Angehängte Dateien:

Lesenswert?

Hier mal das aktuelle Schaltbild.

Erkannt wird das ganze im AVR. Die LED nutze ich aktuell zum Toggeln des 
Signals des was vom Empfänger reinkommt. Später soll es aber den Status 
der Lichtschranke anzeigen, sprich unterbrochen oder nicht unterbrochen. 
Ein Timer (aktuell testweise nicht in Verwendung) behandelt das IR 
Signal.

Sender:

#define F_CPU 8000000UL

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

int main (void)
{
  DDRB |= (1<<PB0);
  TCNT0 = 0;
  TCCR0A=0;
  TCCR0B=0;

  TCCR0A |= (1 << WGM01) | (1 << COM0A0);
  TCCR0B |= (1 << CS00);
  OCR0A=104;
    sei ();

  while(1){

    TCCR0B &= ~(1 << CS00);
    _delay_ms(10);

    TCCR0B |= (1 << CS00);
    TCNT0 = 0;
    _delay_ms(5);

  }
}


Empfänger:

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>

volatile int timerCount = 0;

int main(void)
{
  DDRB |= (1 << PB1);
  PORTB |= (1 << PB1);

  DDRB &= ~(1 << PB3);

  GIMSK = 1 << PCIE;
  PCMSK = 1 << PCINT0;
  PCMSK = 1 << PCINT3;

  TCCR0B = (1<<CS01)|(1<<CS00);
  TIMSK = 1 << TOIE0;

  sei();

    while (1)
    {
    }
}

ISR(PCINT0_vect) {

  TCNT0 = 0;
  TCNT1 = 0;
  //PORTB &= ~(1 << PB1);
  PORTB ^= (1 << PB1);
  timerCount = 0;

}

ISR(TIMER0_OVF_vect) {
  // IR Toogle
  /*
  if(timerCount == 3){
    PORTB |= (1 << PB1);
    timerCount = 0;
  } else {
    timerCount++;
  }
  */

}

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tony S. schrieb:
> Das Signal kommt immer gleich gut an, aber
> bei Unterbrechung des Lichtstrahls (Hand oder Körper dazwischen) wird
> dennoch alles Empfangen.

Bei IR Fernbedienungen (und dafür ist dein Empfänger eigentlich gedacht) 
ist es wünschenwert, das möglichst breit empfangen wird. Für deine 
Anwendung musst du also mit einem abschirmenden Röhrchen und/oder Optik 
dafür sorgen, das der Empfänger nur aus einem schmalen Kegel empfängt.

von Falk B. (falk)


Lesenswert?

@Tony S. (tooony)

>Erkannt wird das ganze im AVR.

MÖÖP! Las das, klemm die LED zum Testen direkt an den Empfänger, das ist 
deutlich einfacher und weniger fehleranfällig.

von Tony S. (tooony)


Lesenswert?

Falk B. schrieb:
> MÖÖP! Las das, klemm die LED zum Testen direkt an den Empfänger, das ist
> deutlich einfacher und weniger fehleranfällig.

Jap, letztendlich soll die LED dann anzeigen (in Verbindung mit der 
Auswertung am Timer), ob die Lichtschranke unterbrochen ist oder nicht.

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> einem abschirmenden Röhrchen und/oder Optik
> dafür sorgen, das der Empfänger nur aus einem schmalen Kegel empfängt.

Eine Optik ist da schon verbaut - damit großflächig empfangen wird.

Tony S. schrieb:
> Von der Distanz her habe ich einen kurzen Abstand (ca. 0,5 Meter), als
> auch 5 bis 7 Meter versucht. Das Signal kommt immer gleich gut an,

Ob das bei einem "Röhrchen" wohl auch so sein wird?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter F. schrieb:
> Eine Optik ist da schon verbaut - damit großflächig empfangen wird.

Mit einer bündelnden Optik kann man den Effekt wieder rückgängig machen.

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Mit einer bündelnden Optik kann man den Effekt wieder rückgängig machen.

Ist ein Röhrchen eine "bündelnde Optik"?
Außerdem "bündelt" die "verbaute" (Standard-)Optik doch schon - oder?

von Tony S. (tooony)


Lesenswert?

Wenn die Rede von einem Röhrchen ist, meint ihr da irgendwas aus 
Kunststoff, oder viel mehr mit einer reflektierenden / spiegelnden 
Oberfläche?

Bei Conrad und Co findet man recht schnell LED Optik, z.B. mit 7° 
Winkel. Würde sowas genügen oder denkt ihr an was anderes?

https://www.conrad.de/de/led-reflektor-chrom-7-anzahl-leds-max-1-fuer-led-luxeon-rebel-dialight-lumidrives-opc1-1-col-sp-170206.html

von Falk B. (falk)


Lesenswert?

@Tony S. (tooony)

>Wenn die Rede von einem Röhrchen ist, meint ihr da irgendwas aus
>Kunststoff,

Ja, oder einfach aus Pappe etc.

> oder viel mehr mit einer reflektierenden / spiegelnden
>Oberfläche?

Nein.

>Bei Conrad und Co findet man recht schnell LED Optik, z.B. mit 7°
>Winkel. Würde sowas genügen oder denkt ihr an was anderes?

Braucht man nicht.

von Jacko (Gast)


Lesenswert?

Schwere Geburt!

* CDIV8 nicht beachtet
* TSOPs wollen IR-Pulsketten, kein Dauerlicht sehen:
  Falsche Vermutung, IR-Power zu gering
  Großer Blödsinn, die Dinger sind sauempfindlich,
  werden aber in den meisten Geräten (optisch) stark bedämpft.
* Mit IR-Pulsen: Die Lichtschranke sieht keine Unterbrechung.
  Logisch, das kleinste 7 mal um irgendwelche Ecken
  reflektierte Signal von der IR-Diode wird noch empfangen!

Lösung: Bei so kleinen Entfernungen reicht es oft, die
IR-LED über 1 kOhm direkt vom µC-Port anzusteuern!

Mal sehn, was als Nächstes nicht beachtet wurde...
(Z.B. Die Lichtführung bei funktionierenden Lichtschranken...)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter F. schrieb:
> Außerdem "bündelt" die "verbaute" (Standard-)Optik doch schon - oder?

Nein, wie du selber in deinem Beitrag geschrieben hast, ist die 
eingebaute Optik eher ein Weitwinkel. Wenn man nun davor eine 
Sammellinse setzt und z.B. mit einem Pappröhrchen Seitenlicht 
ausblendet, hat man die Charakteristik, die man für eine Lichtschranke 
braucht - das ist doch nun nicht so schwer zu verstehen. Evtl. reicht 
das schwarze Pappröhrchen auch alleine aus, das muss man ausprobieren.

von Tony S. (tooony)


Lesenswert?

Hallo nochmal in die Runde,

mein aktueller Stand sieht so, dass es mit einem moduliertem Signal 
grundlegend funktioniert, jedoch noch nicht zufriedenstellend.

Vorweg: meine Räumlichkeiten zu Hause scheinen stark zu reflektieren, 
sodass oftmals zu viel ankommt und die Schranke nicht reagiert (auch 
wenn ich Sender und Empfänger in entgegengesetzte Richtungen schauen 
lasse). Ich hatte die Gelegenheit in anderen Räumlichkeiten das ganze zu 
testen, da funktioniert es wesentlich besser.

Durch spielen mit den Timings habe ich den folgenden Stand. Dazu die 
Frage: Ist das so praktikabel oder bin ich (von der Programmierung her) 
auf dem falschen Weg.

Sender:
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
int main (void)
8
{
9
  DDRB |= (1<<PB0);
10
  TCNT0 = 0;
11
  TCCR0A=0;
12
  TCCR0B=0;
13
  
14
  TCCR0A |= (1 << WGM01) | (1 << COM0A0);
15
  TCCR0B |= (1 << CS00);
16
  OCR0A=104;
17
  
18
  uint16_t counter = 0;
19
  DDRB |= (1<<PB1);
20
  PORTB &= ~(1 << PB1);
21
  
22
  sei ();
23
24
  while(1){    
25
    
26
    TCCR0B &= ~(1 << CS00);
27
    _delay_ms(17);
28
    
29
    TCCR0B |= (1 << CS00);
30
    TCNT0 = 0;
31
    _delay_ms(3);
32
    
33
    if(counter == 50) {
34
      counter = 0;
35
      PORTB ^= (1 << PB1);
36
    }  else {
37
      counter++;
38
    }
39
    
40
  }
41
}
Empfänger:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 8000000UL
4
#include <util/delay.h>
5
6
volatile int timerCount = 0;
7
8
int main(void)
9
{
10
  DDRB |= (1 << PB1);
11
  DDRB |= (1 << PB4);
12
  PORTB |= (1 << PB1); //LED Off
13
  PORTB |= (1 << PB4); // LVL Low
14
  
15
  DDRB &= ~(1 << PB3);  
16
  
17
  GIMSK = 1 << PCIE;
18
  PCMSK = 1 << PCINT0;
19
  PCMSK = 1 << PCINT3;
20
  
21
  TCCR0B = (1<<CS02);//|(1<<CS00);
22
  TIMSK = 1 << TOIE0;
23
24
  sei();
25
  
26
    while (1) 
27
    {
28
    }
29
}
30
31
ISR(PCINT0_vect) {
32
  
33
  TCNT0 = 0;
34
  TCNT1 = 0;
35
  PORTB &= ~(1 << PB1);
36
  PORTB &= ~(1 << PB4);
37
  timerCount = 0;  
38
  
39
}
40
41
ISR(TIMER0_OVF_vect) {  // IR Toogle 
42
  
43
  if(timerCount == 3){
44
    PORTB |= (1 << PB1);
45
    PORTB |= (1 << PB4);
46
    timerCount = 0;
47
  } else {
48
    timerCount++;
49
  }
50
  
51
  
52
}
-------------------------
Edit Mod: Code in
1
 [c] .... [/c]
 eingefasst. Bitte daran halten. So wird das wesentlich lesbarer.

: Bearbeitet durch Moderator
von Dennis K. (scarfaceno1)


Lesenswert?

Ich hab mir den Code jetzt ganz oft angeschaut...

Aber müsste dort nicht noch beim Sender im TIMSK Register das OCIE1A Bit 
gesetzt werden, damit der Timer überhaupt auf den Interrupt reagiert?

Sonst macht der PortPin doch überhaupt nicht was er soll....

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dennis K. schrieb:
> Sonst macht der PortPin doch überhaupt nicht was er soll....

Doch, macht er, denn das ist ja eine Hardware PWM, die sonst keinerlei 
Softwareunterstützung mehr braucht, wenn sie einmal läuft. Dafür ist nur 
nötig, das du die COM0An Bits richtig setzt und OC0A als Ausgang gesetzt 
wurde.
OC0A toggelt dann mit der CTC Frequenz.

: Bearbeitet durch User
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.