Hallo,
wenn du schon einen externen Interrupt Pin benutzt, dann würde ich die Auswertung auch direkt selber machen.
Ich bin mir sehr sicher, dass GETRC5() das erste Paket nicht richtig erkennen kann, da die erste Flanke fehlt. Ist das Paket dann nach 25ms durch, kommt eine Pause von 114ms, bevor das zweite Paket gesendet wird.
Jetzt wird der Befehl in weiteren 25ms erkannt. Der µC hat bei 16MHz in der Zwischenzeit 2.500.000 Zyklen abgespult. Bleibt man einen Moment zu lange auf der Taste sind es wieder 2.500.000 Zyklen. Und auch bei Dirks Version findet das Ganze in einer ISR statt.
Hast du in der ISR die Zeiten der Flankenwechsel in einem kleinen Array mitgeloggt, brauchst du im Hauptprogramm nur diese paar Befehle um einen gültigen RC5 Befehl zu erkennen:
Code:
If Flanken_anzahl > 15 And Flanken_anzahl < 27 And Flanken_anzahl.0 = 0 Then
If Imp_array(2) > kurz_min And Imp_array(2) < kurz_max And Imp_array(3) > kurz_min And Imp_array(3) < kurz_max Then
I = 4
Daten = 1
While I < Flanken_anzahl
Shift Daten , Left
Daten.0 = Daten.1
If Imp_array(i) > kurz_min And Imp_array(i) < kurz_max Then
Incr I
If Imp_array(i) <= kurz_min Or Imp_array(i) >= kurz_max Then
Exit While 'fehlerhafter Empfang
End If
Elseif Imp_array(i) > lang_min And Imp_array(i) < lang_max Then
Toggle Daten.0
Else
Exit While 'fehlerhafter Empfang
End If
Incr I
Wend
If I >= Flanken_anzahl Then
If Imp_array(i) > lang_min And Imp_array(i) < lang_max Then
Shift Daten , Left
End If
Temp_daten = Daten
Rc5_befehl = Temp_daten And &B00111111
Shift Temp_daten , Right , 6
Rc5_adresse = Temp_daten And &B00111111
Print "Adresse=" ; Rc5_adresse ; ", Befehl=" ; Rc5_befehl
End If
End If
End If
Und das geht bestimmt 1000 mal so schnell, denn 2500 Zyklen braucht er sicher nicht dafür.
Gruß
Rolf
Lesezeichen