Forum: Mikrocontroller und Digitale Elektronik 38kHz mit uC ausgeben


von Rüdiger (Gast)


Lesenswert?

Hey Leute, ich hab folgendes Problem und hoffe ihr könnt mir helfen. Ich 
wollte mir ne Lichtschranke bauen... Hab noch 950nm Infrarot-Dioden hier 
rumfliegen und ein par TSOP1738 IR-Empfänger. Die IR-Empfänger laufen 
auf 38kHz. Das heißt um ne Vernünftige Lichtschranke zu bauen,muss die 
LED mit 38Khz "flimmern". Hab son Beispiel Programm für nen Arduino 
gefunden,mit dem das auch super läuft. Ich würde das aber gern mit nem 
Attiny13 realisieren. Jetzt hab ich folgenden Code geschrieben, der aber 
nicht funzt... Vielleicht wisst Ihr ja wieso?!
1
#include <avr/io.h> 
2
3
#ifndef F_CPU
4
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1200000"
5
#define F_CPU 1200000UL 
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
11
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);
12
13
while(1)
14
{
15
16
PORTB = 0b00000100;   /*Bit 2 an PortB auf 1 */
17
_delay_us(13);
18
PORTB = 0b00000000;   /*Bit 2 wieder löschen*/
19
_delay_us(13);
20
21
}
22
  
23
}

bei 38kHz sollte ein Impuls doch ungefähr 26 Mikrosekunden sein. Also 
ungefähr 13uS High und 13uS Low, oder verstehe ich das Falsch? Naja, ich 
hoffe ihr habt nen Rat. Mfg Rüdiger

von Error (Gast)


Lesenswert?

Was will der Empfänger für einen duty-cycle? Evtl. kannst Du da noch 
Energie sparen.

> PORTB = 0b00000000;   /*Bit 2 wieder löschen*/

Du setzt da alles auf 0, irgendwo gibt's einen "Artikel" Bitmanipulation 
oder Bitmanipulationen ..

von Error (Gast)


Lesenswert?

Ich dachte, das wird erkannt.
hier: http://www.mikrocontroller.net/articles/Bitmanipulation

von holger (Gast)


Lesenswert?

Der TSOP1738 mag keine Dauersendung. Du wirst dein Signal
schon modulieren müssen damit der damit was anfangen kann.

von Walter (Gast)


Lesenswert?

aha, der Code funzt also net.

Ich als Fachmann kann Dir sagen, da ist mit Sicherheit irgendwo ein 
Fehler

von spess53 (Gast)


Lesenswert?

Hi

Es soll auch µCs mit Timern geben.

MfG Spess

von Rüdiger (Gast)


Lesenswert?

Erstmal Danke für die schnellen Antworten. Dass ich beim Bit löschen 
alles auf null setzte, ist doch egal oder? Ich brauch den uC einzig und 
allein um die LED zu "pulsen". Der Empfänger hängt an nem anderen uC...
Ich sollte vlt. noch dazu sagen, dass ich sowas vorher noch nie gemacht 
habe, daher kann ich mit der Aussage, dass ich das Signal modulieren 
muss,leider nicht viel anfangen. Vieleicht habt ihr ja noch ein paar 
Tips, in dieser Richtung. Vielen Dank, Rüdiger

von Rüdiger (Gast)


Lesenswert?

Kann als Gast, leider nicht editieren,daher muss ich Spess53 leider so 
antworten...
Ich weiß das es Timer gibt, aber ich wollte es halt möglichst einfach 
machen.... Mfg Rüdiger

von Error (Gast)


Lesenswert?

könnte gehen.

von holger (Gast)


Lesenswert?

1
while(1)
2
{
3
  for(uint8_t i=0; i<38; i++)
4
  {
5
    PORTB = 0b00000100;   /*Bit 2 an PortB auf 1 */
6
    _delay_us(13);
7
    PORTB = 0b00000000;   /*Bit 2 wieder löschen*/
8
    _delay_us(13);
9
  }
10
11
  _delay_ms(1);
12
  
13
}

Das sollte den Ausgang vom TSOP im 500Hz Takt pulsen lassen.

von spess53 (Gast)


Lesenswert?

Hi

>Ich weiß das es Timer gibt, aber ich wollte es halt möglichst einfach
>machen.... Mfg Rüdiger

Was ist einfacher, als ein paar Register zu setzen?

Ausserdem solltest Holgers Rat befolgen: Der TSOP verträgt kein 
Dauersignal. Da macht nach kurzer Zeit die AGC dicht. Also ist es mit 
deinem einfachen Programm nicht getan.

MfG Spess

von Magnetus (Gast)


Lesenswert?

Rüdiger schrieb:
1
#ifndef F_CPU
2
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1200000"
3
#define F_CPU 1200000UL 
4
#include <util/delay.h>
5
6
int main(void)

Mal so ganz nebenbei bemerkt: Hast du auch einmal in Erwägung gezogen 
ein #endif dran zu setzen?

von Rüdiger (Gast)


Lesenswert?

Nochmals Danke für die Zahlreichen Antworten. Das #endif hab ich drin, 
ist nur irgendwie hier beim kopieren "verloren" gegangen...
@Holger,vielen Dank für den Code, werd ich morgen sofort testen. Aber 
Ehrlich gesagt hab ich noch nicht genau verstanden warum man sowas 
"moduliert".
@Spess,hab noch nie mit Timern gearbeitet und da da wahrscheinlich zig 
neue Fragen auftauchen, wollte ich das erstmal umgehen. Was meinst du 
mit "Da macht nach kurzer Zeit die AGC dicht"? Was ist ne AGC? Vielen 
Dank, Rüdiger

von spess53 (Gast)


Lesenswert?

Hi

>@Spess,hab noch nie mit Timern gearbeitet

Dann wird es langsam Zeit. Oder willst du ewig im Sandkasten spielen.

>Was meinst du mit "Da macht nach kurzer Zeit die AGC dicht"? Was ist ne
>AGC?

AGC = Automatic Gain Control (Automatische Verstärkungsreglung).

Datenblatt: 'After each burst which is between 10 cycles and 70
             cycles a gap time of at least 14 cycles is neccessary'

Oder einfach gesagt: Wenn du das Teil mit einem Dauersignal beleuchtest, 
hast du nach kurzer Zeit kein Ausgangssignal mehr.

MfG Spess

von Rüdiger (Gast)


Lesenswert?

Guten Morgen, der Code von Holger funktioniert bei mir einwandfrei! Und 
dadurch dass er nach den 38 cyclen 1ms wartet, sollte der AGC doch dann 
keine Probleme machen,oder?!
@Spess53, nee ewig im Sandkasten spielen,wollte ich nicht, aber ich muss 
Rom ja auch nich an einem Tag aufbauen... Über kurz oder lang wird 
natürlich trotzdem kein weg an Timern vorbei gehen... und dann werden 
wir uns hier bestimmt wieder hören :-).
 Nochmals vielen Dank euch allen, Mfg Rüdiger

von Anja (Gast)


Lesenswert?

Hallo,

üblicherweise wird bei der Modulation mit 25% Pulsbreite gearbeitet um 
Strom zu sparen bzw. bei gleichem mittleren Strom die Reichweite zu 
erhöhen. (zumindest beim RC5-Code).

von Rüdiger (Gast)


Lesenswert?

Hey Anja, bist du zufällig dieselbe Anja,die hier auch schonmal nen 
Thread aufgemacht hat über 38kHz? Falls ja.. du hättest nicht noch 
irgendwo deinen Atmega8 Code rumfliegen? Dann könnte ich mich direkt mit 
dem Timer vertraut machen... Das mit der 25% Pulsbreite ist dann,das ich 
nur ein viertel der Zeit auf High bin und die restlichen 3/4 auf 
Low,oder?
Ich nutzte ja im Moment noch Holgers Code und wenn ich den IR-Empfänger 
an ein Mulitmeter anschließe sieht das auch wunderbar aus. Wenn ich den 
IR-Empfänger aber an nen Analogen Eingang von nem anderen uC 
hänge,bekomm ich folgendes raus:
1
1010
2
1013
3
0
4
1011
5
1010
6
0
7
0
8
0
9
1013
10
1011
11
0
12
1010
13
1010
14
1010
15
0
16
0
17
1010
18
1014
19
0
20
0
21
0
22
0
23
1011
24
0
25
0
26
0
27
1011
28
1011
29
1013
30
1012
31
1010
32
0
33
0
34
usw.

Der IR-Empfänger bleibt also nicht konstant bei 0. Für ne Lichtschranke 
ist das natürlich doof. Vielleicht hat da ja noch jemand nen Tip. Vielen 
Dank, Rüdiger

von Stephan (Gast)


Lesenswert?

Bei einem PIC macht man das mit dem PWM-Modul. Frequenz einstellen, 
Duty-Cycle einstellen, starten, siehe 
http://www.sprut.de/electronic/pic/grund/pwm.htm

von Anja (Gast)


Lesenswert?

>bist du zufällig dieselbe Anja,
nee bin ich nicht, wenn dann mache ich RC5-Code (36kHz)
ganz hardcore-mässig mit einem PIC12C508 in Assembler.

@Stephan: ganz freihändig ohne Timer, Quarz oder PWM-Modul

@Rüdiger: Eigentlich müßtest Du die 500 Hz detektieren die aus holgers 
Code resultieren. -> Du hast sogar bei entsprechender Auswertung noch 
einen Vorteil falls jemand versucht mit einer gewöhnlichen Fernbedienung 
die Lichtschranke auszutricksen.
Bei Empfängermodulen wie den TSOP1738 geht kein Dauer-Low. Die Teile 
sind für Bi-Phasen-Modulation optimiert.

von Rüdiger (Gast)


Lesenswert?

Hey Leute, hab jetzt ein paar Tage rum-probiert und bekomme es einfach 
nicht hin...
@Anja, wie meinst du das mit dem detektieren? Ich geh ja von dem 
IR-Empfänger in nen anderen uC. Um genau zu sein in nen Arduino. Wie 
kann ich denn da 500hz detektieren? Ich steh echt aufm Schlauch... Wie 
gesagt im Moment lese ich den Wert des Analogen Eingangs am Arduino ein 
und der ist halt nicht sauber. Wie du schreibst liegt das ja daran das 
kein Dauer-Low funzt. Naja, wie gesagt,steh aufm Schlauch und hoffe ihr 
könnte mir nochmal nen Schups in die richtige Richtung geben. Vielen 
Dank, Rüdiger
Ps: Bin nicht zwingend an Attiny13 gebunden. Könnte auch mit nem Atmega8 
etc. arbeiten, Hauptsache es würd laufen.

von Anja (Gast)


Lesenswert?

>Wie kann ich denn da 500hz detektieren?

Mittels Capture-Modul beide Flanken abspeichern und jeweils die 
Differenz zwischen 2 Steigenden oder 2 fallenden Flanken rechnen (sollte 
2000us ergeben). Falls Toleranz zu 2000us über/unterschritten wird
-> Fremdlicht-Alarm

Die Abstände steigender zu fallender Flanke sind abhängig von der 
Entfernung zum Sender (Signalstärke) mehr oder weniger unsymmetrisch. 
Können aber mit entsprechend größeren Toleranzen auch ausgewertet 
werden.

Zusätzlich z.B. mit einem 1ms-Interrupt ein Timeout nach ca 4-5ms 
generieren falls keine Flanke kommt (Lichtschranke unterbrochen). -> 
Lichtschranken-Alarm.

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.