www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 38kHz mit uC ausgeben


Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!
#include <avr/io.h> 

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1200000"
#define F_CPU 1200000UL 
#include <util/delay.h>

int main(void)
{

DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);

while(1)
{

PORTB = 0b00000100;   /*Bit 2 an PortB auf 1 */
_delay_us(13);
PORTB = 0b00000000;   /*Bit 2 wieder löschen*/
_delay_us(13);

}
  
}


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

Autor: Error (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ..

Autor: Error (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha, der Code funzt also net.

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Es soll auch µCs mit Timern geben.

MfG Spess

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Error (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte gehen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(1)
{
  for(uint8_t i=0; i<38; i++)
  {
    PORTB = 0b00000100;   /*Bit 2 an PortB auf 1 */
    _delay_us(13);
    PORTB = 0b00000000;   /*Bit 2 wieder löschen*/
    _delay_us(13);
  }

  _delay_ms(1);
  
}

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rüdiger schrieb:
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1200000"
#define F_CPU 1200000UL 
#include <util/delay.h>

int main(void)

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

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
1010
1013
0
1011
1010
0
0
0
1013
1011
0
1010
1010
1010
0
0
1010
1014
0
0
0
0
1011
0
0
0
1011
1011
1013
1012
1010
0
0
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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.