PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage: Summensignal auswerten



Tido
09.12.2008, 13:31
Hallo,

ich habe mir mit Code aus dem Forum folgendes Programm zum Auslesen des Summensignal meines RC-Empfängers zusammengebastelt:



$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
Enable Timer0
On Timer0 Sync
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Signalmessung

Dim Kanal(7) As Byte
Dim Channel As Byte

Do

Print " " ; Kanal(1) ; " " ; Kanal(2) ; " " ; Kanal(3) ; " " ; Kanal(4) ; " " ; Kanal(5) ; " " ; Kanal(6) ; " " ; Kanal(7)

Loop


Signalmessung:
Kanal(channel) = Timer0
Timer0 = 0
Incr Channel
Return


Sync:
Channel = 0
Return


Das Auslesen der 7 Kanäle klappt wunderbar, allerdings verstehe ich einen Teil im Code nicht.



Sync:
Channel = 0
Return


Das ist noch klar. Bei einem Überlauf des Timers (verursacht durch die Pause im Signal) wird channel auf 0 gesetzt.



Signalmessung:
Kanal(channel) = Timer0
Timer0 = 0
Incr Channel
Return


Auf die Pause folgt der 1. Kanal, dieser endet mit einer fallenden Flanke (die erste nach der Pause) und löst den Int0 aus. Dann wird doch dort der Timer an Kanal(0) übergeben, da channel ja durch den vorhergehenden Sync-Aufruf auf 0 steht.

1.) Kanal(0) ist aber doch gar nicht im Array Kanal(7) enthalten.
2.) Warum finde ich den Wert von Kanal 1 in Kanal(1) und nicht (s.o) in Kanal(0)?

PicNick
09.12.2008, 15:01
Irrtum vorbehalten:
die fallende Int0 sagt aus, das der Kanal vorher zu ende ist UND der nächste beginnt.
Beim ersten Impuls gibt's keinen Vorgänger, daher schreibt er den Timer0 nach Kanal(0) (= Nirwana)
erst der zweite impuls/flanke definiert die breite des ersten Kanals, und der landet ja dann in Kanal(1)



edit: das programm ist allerdings tricky, denn
kanal(0) ist eigentlich das Byte VOR dem array

wenn da was anderes definiert ist, kann es krachen

Tido
09.12.2008, 17:16
Ja,

ich sehe gerade, dass die Pause "High-Signal" hat, dann stimmt es.
Wie bekomme ich heraus, was vor dem Array definiert ist? Ist es automatisch das vorher definierte Byte?

Andererseits definiere ich das Array als Kanal( 8 ), setze channel beim Sync auf 1 und ignoriere diesen Wert ---> Problem behoben.

PicNick
09.12.2008, 18:24
Du hast sonst eigentlich nix definiert, also beginnt dein Array vermutlich bei &H60 (genaueres in der .RPT-file)
auf &H5F ist beim m32 das SREG (statusregister), welches er überschreibt.
--> Glück: das wird sowieso bei vielen Befehlen frisch gesetzt, also kann die Sache klappen.

Sauber wäre, ein "buffer" byte davor zu definieren


DIM Buffer AS BYTE ' da kann er reinpinseln, wenn er mag
Dim Kanal(7) As Byte
Dim Channel As Byte

Tido
09.12.2008, 18:28
Hi,

ich hatte vor diesem Post bereits weiter an dem Programm gebastelt (Fehlererkennung). Obwohl die (vorher definierte) Variable im Programm nicht gesetzt/geändert wird, änderte sich der Wert (testweise ausgegeben) trotzdem.
Jetzt weiß ich ja, warum...