Tido
12.12.2008, 15:38
Sorry Leute,
aber ich stehe seit gestern mit meinem Programm auf Kriegsfuß.
Es wertet das Summensignal eines RC-Empfängers aus.
Das Problem ist, dass sich die Variable Offset(1) im laufenden Programm ändert, obwohl diese im Code gar nicht vorkommt.
Die Variable nimmt bei jedem Aus- und Wiedereinschalten der Fernsteuerung einen anderen Wert ein. Hier mal der Code:
$regfile "m32def.dat"
$framesize = 42
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Timer0 = Timer , Prescale = 256 'Timer0 auf 16µs/Takt, Überlauf bei ca. 4ms
On Timer0 Sync
Config Int0 = Falling
Enable Interrupts
On Int0 Flankenerkennung
Dim Dummy As Byte 'enthält die Sync-Zeit
Dim Kanal(8) As Byte 'muss direkt hinter Dummy dimensioniert werden!
Dim Offset(7) As Byte
Dim Channel As Byte
Dim Fehler As Byte
Dim Pruefsumme As Word
Offset(1) = 0
Do
Gosub Messen
Ausgabe:
If Fehler > 0 Then
Print "Datenfehler " ; Fehler
Else
Print " " ; Kanal(1) ; " " ; Kanal(2) ; " " ; Kanal(3) ; " " ; Kanal(4) ; " " ; Kanal(5) ; " " ; Kanal(6) ; " " ; Kanal(7) ; " Offset(1): " ; Offset(1)
End If
Waitms 25
Loop
Flankenerkennung: 'fallende Flanke erkannt
Kanal(channel) = Timer0 'Timerwert in Kanalvariable speichern
Timer0 = 0 'und Timer zurücksetzen
Incr Channel 'auf den nächsten Kanalspeicher wechseln
Return
Sync: 'Überlauf des Timers durch die Pause im Signal
Channel = 0 'das Sync-Signal vor dem ersten Kanal
Fehler = 0 'Fehlerspeicher löschen
Return
Messen:
Timer0 = 0 'Timer (Sync) zurücksetzen
Enable Timer0 'und einschalten
Enable Int0 'Interrupt (Flanke) einschalten
Waitms 40 'Zeit für 2 Messungen
Disable Int0 'Interrupt ausschalten
Disable Timer0 'Timer ausschalten
Channel = 0
Fehlerpruefung:
Pruefsumme = 0
For Channel = 1 To 7
If Kanal(channel) < 52 Or Kanal(channel) > 132 Then Fehler = Channel 'nur Kanalwerte von 52-132 gültig
Pruefsumme = Pruefsumme + Kanal(channel) 'alle Kanäle addieren
Next Channel
Pruefsumme = Pruefsumme + Dummy 'Sync-Zeit zu der Kanalsumme addieren
If Pruefsumme < 565 Then Fehler = 8 'nur größere Prüfsumme gültig
Return
Ich hänge mal einen Screenshot der Ausgabe an. Bei Datenfehler 8 ist die Fernsteuerung ausgeschaltet.
Weiß jemand, warum sich der Wert ändert?
aber ich stehe seit gestern mit meinem Programm auf Kriegsfuß.
Es wertet das Summensignal eines RC-Empfängers aus.
Das Problem ist, dass sich die Variable Offset(1) im laufenden Programm ändert, obwohl diese im Code gar nicht vorkommt.
Die Variable nimmt bei jedem Aus- und Wiedereinschalten der Fernsteuerung einen anderen Wert ein. Hier mal der Code:
$regfile "m32def.dat"
$framesize = 42
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Timer0 = Timer , Prescale = 256 'Timer0 auf 16µs/Takt, Überlauf bei ca. 4ms
On Timer0 Sync
Config Int0 = Falling
Enable Interrupts
On Int0 Flankenerkennung
Dim Dummy As Byte 'enthält die Sync-Zeit
Dim Kanal(8) As Byte 'muss direkt hinter Dummy dimensioniert werden!
Dim Offset(7) As Byte
Dim Channel As Byte
Dim Fehler As Byte
Dim Pruefsumme As Word
Offset(1) = 0
Do
Gosub Messen
Ausgabe:
If Fehler > 0 Then
Print "Datenfehler " ; Fehler
Else
Print " " ; Kanal(1) ; " " ; Kanal(2) ; " " ; Kanal(3) ; " " ; Kanal(4) ; " " ; Kanal(5) ; " " ; Kanal(6) ; " " ; Kanal(7) ; " Offset(1): " ; Offset(1)
End If
Waitms 25
Loop
Flankenerkennung: 'fallende Flanke erkannt
Kanal(channel) = Timer0 'Timerwert in Kanalvariable speichern
Timer0 = 0 'und Timer zurücksetzen
Incr Channel 'auf den nächsten Kanalspeicher wechseln
Return
Sync: 'Überlauf des Timers durch die Pause im Signal
Channel = 0 'das Sync-Signal vor dem ersten Kanal
Fehler = 0 'Fehlerspeicher löschen
Return
Messen:
Timer0 = 0 'Timer (Sync) zurücksetzen
Enable Timer0 'und einschalten
Enable Int0 'Interrupt (Flanke) einschalten
Waitms 40 'Zeit für 2 Messungen
Disable Int0 'Interrupt ausschalten
Disable Timer0 'Timer ausschalten
Channel = 0
Fehlerpruefung:
Pruefsumme = 0
For Channel = 1 To 7
If Kanal(channel) < 52 Or Kanal(channel) > 132 Then Fehler = Channel 'nur Kanalwerte von 52-132 gültig
Pruefsumme = Pruefsumme + Kanal(channel) 'alle Kanäle addieren
Next Channel
Pruefsumme = Pruefsumme + Dummy 'Sync-Zeit zu der Kanalsumme addieren
If Pruefsumme < 565 Then Fehler = 8 'nur größere Prüfsumme gültig
Return
Ich hänge mal einen Screenshot der Ausgabe an. Bei Datenfehler 8 ist die Fernsteuerung ausgeschaltet.
Weiß jemand, warum sich der Wert ändert?