PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Signal richtig auswerten



MelMan
26.06.2008, 19:53
Guten abend zusammen

Hab hier ein Problem was mich schon länger beschäftigt:
Ich hab einen TSOP-38 an einen MEGA8 gepackt (an Port C.4). Nun wollte ich das IR-Signal meiner TV-Fernbedienung aufnehmen. Soweit so gut hab ein Programm mit einem Timer geschrieben, der mir immer die High- oder Lowpegelzeiten übermittelt. Nun habe ich irgendetwas von RC5 aufgegabelt und Manchestercode. Wenn ich das Signal meiner Austaster (TV-Fernbedienung) aufnehme, bekomme ich folgendes:

WertL:314
WertH:668
WertL:314
WertH:5732
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:314
WertH:5680
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:314
WertH:5680
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:314
WertH:5681
WertL:314
WertH:5680
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:314
WertH:5680
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5681
WertL:313
WertH:5684
WertL:314

(Taste ca. 3 Sek. gedrückt)



Mein Programm dazu sieht folgendermaßen aus:

$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 16000000
$baud = 9600

Dim B As Integer
Dim A As Integer

Config Pinc.4 = Input

Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Isr_von_timer0
Enable Interrupts

B = 0
Print "da"

Do
If Pinc.4 = 1 Then
If B = 0 Then
Print "WertL:" ; A
A = 0
B = 1
End If
End If


If Pinc.4 = 0 Then
If B = 1 Then
Print "WertH:" ; A
A = 0
B = 0
End If
End If
Loop
End

Isr_von_timer0:
Timer0 = 0
A = A + 1
Return



Wie kann ich das Signa jetzt wieder so ausgeben, dass ich mit dem µC den Fernseher bedienen kann??? Könnt ihr mir da helfen oder hilfreiche Links geben?

Mfg Mel

for_ro
26.06.2008, 22:57
Hallo,
ich kann zwar so auf Anhieb keinen Fehler in deinem Code sehen, aber das was du da ausgibst ist jedenfalls kein FB Code und schon gar nicht RC5.
Bei deinen 60KHz Abtastrate müssten die High/Low Zeiten zwischen 50 und 200 sein. Da stimmt noch was nicht.

Gruß

Rolf

guenter1604
26.06.2008, 23:15
Hallo,

vor einiger Zeit hab ich mal ein RC5 Projekt gemacht.
Daraus habe ich folgenden Code rausgeschnitten...

Getrc5(address , Command)
If Command > 127 Then Command = Command - 128

der Rest unter:

http://www.gerold-online.de/cms/index.php?id=136

Günter

MelMan
27.06.2008, 07:41
Gut werd ich mir zuhause noch mal anschauen. Was ich nur gehört habe ist, dass der TSOP38 immer nur Impulse rausgibt, also nicht die volle Länge eines anstehenden Pegels ausgibt. Aber werd es mal mit dem RC5 probieren. Melde mich dann heute mittag noch mal. Thx schon mal

oberallgeier
27.06.2008, 09:26
Also die TSOP´s die ich mir in Datenblättern angesehen hatte, machten die Datenübertragung etwa so: brauchen für ein "aktives" Bit einen Burst von mindestens 10 Pulsen oder mehr und nach einigen zig Pulsen MUSS der Sender auf low gehen, damit sich der TSOP wieder erholen/beruhigen/odersonstwas kann. Klartext: der TSOP kommt mir wegen des Timings etwas pflegebedürftig vor. Ich wollte die mal für andere Zwecke verwenden weil sie so schnell sind . . . . das kann halt ihr Vorteil sein.

sechsrad
27.06.2008, 11:12
hier habe ich einen rc5-code-empfänger für einen tsop in c.
vielleicht kann den mal ein findiger bascom-programmer umsetzen.
läuft nur mit timer ohne interrupt:




XTAL=8000000
TCCR0 = 1<<CS02; //divide by 256
TIMSK = 1<<TOIE0; //enable timer interrupt

#define RC5TIME 1.778e-3 // 1.778msec
#define PULSE_MIN (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
#define PULSE_1_2 (uchar)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
#define PULSE_MAX (uchar)(XTAL / 512 * RC5TIME * 1.2 + 0.5)

#define xRC5_IN PIND
#define xRC5 PD7 // IR input low active

uchar rc5_bit; // bit value
uchar rc5_time; // count bit time
uint rc5_tmp; // shift bits in
uint rc5_data; // store result


SIGNAL (SIG_OVERFLOW0)
{
uint tmp = rc5_tmp; // for faster access

TCNT0 = -2; // 2 * 256 = 512 cycle

if( ++rc5_time > PULSE_MAX ){ // count pulse time
if( !(tmp & 0x4000) && tmp & 0x2000 ) // only if 14 bits received
rc5_data = tmp;
tmp = 0;
}

if( (rc5_bit ^ xRC5_IN) & 1<<xRC5 ){ // change detect
rc5_bit = ~rc5_bit; // 0x00 -> 0xFF -> 0x00

if( rc5_time < PULSE_MIN ) // to short
tmp = 0;

if( !tmp || rc5_time > PULSE_1_2 ){ // start or long pulse time
if( !(tmp & 0x4000) ) // not to many bits
tmp <<= 1; // shift
if( !(rc5_bit & 1<<xRC5) ) // inverted bit
tmp |= 1; // insert new bit
rc5_time = 0; // count next pulse time
}
}

rc5_tmp = tmp;
}

MelMan
27.06.2008, 16:31
Ok habe festgestellt meine Fernbedienung senden keinen RC5 Code. Es handelt sich um die "TelePilot 910C" von Grundig. Kennt sich da jemand mit aus?