
Zitat von
Sauerbruch
Und dann habe ich in manchen Threads gelesen, dass die GetRC5-Abfrage in einer ISR problematisch sein kann, weil die erste Synchronisationsflanke fehlt.
Da RC5 immer mindestens zweimal den Code sendet, geht der erste dabei zwar verloren, aber den zweiten bekommt die Routine dann mit. Der Bascom Befehl scheint da tolerant zu sein. Allerdings würde ich auch nur ein Flag in der ISR setzen und den GetRC5() Befehl dann in der Hauptschleife anwenden.

Zitat von
Sauerbruch
Nur mal so und zum Testen, ob es grundsätzlich funktioniert, würde ich mal einen Code probieren, bei dem der GetRC5-Befehl in der Hauptschleife steht.
Das auf jeden Fall. So minimal wie möglich, wenn man zweifel an Hard- und Software hat.
@luvat: Hier habe ich dir mal ein paar Zeilen zusammengeschrieben (ungetestet), falls du kein Oszi hast. Es sollten die High und Low Zeiten aller Intervalle ausgegeben werden.
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Ddrd.2 = 1 'hier wird das Signal eingelesen
Dim Interval(200) As Word
Dim Flanken_anzahl As Byte
Dim Print_flag As Byte
Dim I As Byte
Config Timer0 = Timer Prescale = 64
Load Timer0 , 25
On Timer0 Timer0_isr 'ergibt 10KHz Abtastfrequenz, also 100µs Zeitwerte
Enable Timer0
Config Int0 = Change
On Int0 Int0_isr
Enable Int0
Enable Interrupts
Flanken_anzahl = 1
Do
If Print_flag = 1 Then
Print_flag = 0
Print Flanken_anzahl; ":";
For I = 1 To Flanken_anzahl
Print Interval(i) ; " ";
Interval(i) = 0
Next I
Print ""
Flanken_anzahl = 1
End If
Loop
End
Timer0_isr:
Incr Interval(flanken_anzahl)
If Interval(flanken_anzahl) > 10000 Then 'Ausgabe nach 1 Sekunde ohne weitere Signale
Print_flag = 1
End If
Return
Int0_isr:
Incr Flanken_anzahl
If Flanken_anzahl > 200 Then
Flanken_anzahl = 200
Print_flag = 1
Print "Too many intervals"
End If
Return
Lesezeichen