PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 12 Kanal Summensignal



MiniMax
18.12.2010, 19:14
Hallo Zusammen,
ich habe im wiki folgendes Gefunden:

$baud = 9600
$crystal = 16000000
$regfile "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling , Noise Cancel = 1
Enable Timer0
On Timer0 Pausedetected
Config Int1 = Falling 'Summensignal an int1 (am Mega32: Port D3), Reaktion auf fallende Flanke
Enable Interrupts
Enable Int1 'einschalten Int1
On Int1 Measure 'springe zum Interrupt von Timer0
Dim Empf(6) As Word
Dim Channel As Byte

Do 'Main Loop gibt Signale per UART aus
Print Empf(1) ; " CH1"
Print Empf(2) ; " CH2"
Print Empf(3) ; " CH3"
Print Empf(4) ; " CH4"
Print Empf(5) ; " CH5"
Print Empf(6) ; " CH6"
Print " "
Waitms 500
Loop

Measure: 'Reaktion auf fallende Flanke

If Channel > 0 And Channel < 6 Then
Empf(channel) = Timer0
End If

Timer0 = 6 'preload für 4ms
Incr Channel
Return

Pausedetected:
Channel = 0
Return

End


Der Code kann so wie ich es sehe ja nur 6 Kanäle aus dem Summensignal Filter?

Da ich den Simprop Gigascan 5 Nehme, möchte ich gerne alle 12 Kanäle auslesen. Kann ich jetzt einfach den Zähler von <6 auf <12 erhöhen?

Oder kann ich das anders Lösen?

MiniMax
19.12.2010, 10:54
keiner ne Idee?

Sauerbruch
19.12.2010, 12:26
Kann ich jetzt einfach den Zähler von <6 auf <12 erhöhen?

Im Prinzip ja - nur musst Du diese Änderung an allen anderen Stellen auch vornehmen. Also z.B. Dim Empf(12) as Word, etc., etc.


Einiges an dem Code scheint mir seltsam:


If Channel > 0 And Channel < 6 Then
Empf(channel) = Timer0
End If

Damit wirst Du niemals einen Wert für Empf(6) bekommen.

Und außerdem ist es bei meinen Summensignalen immer so, dass die Summe aus High- und Low-Zeiten eines Impulses immer gleich bleibt - es verändert sich nur das Verhältnis von High- zu Low-Zeit. Wenn Du also die Zeiten zwischen zwei fallenden Flanken misst, dürfte immer das gleiche herauskommen, unabhängig von der Dauer des einzelnen High-Impulses.

Allerdings weiß ich nicht, ob die Summensignale der heutigen mondphasenadjustierten, menügeführten, polyredundanten GHz-Hightech-Anlagen noch genauso aussehen wie bei meiner guten alten Multiplex Cockpit MM :-)

MiniMax
19.12.2010, 12:49
20ms sind 20ms und die beleiben auch so (außer FASST da sind es 16ms :D)
Wieso bekomme ich nie nen wert für 6? Du meinst weil weniger als 6 richtig?
Dann müsste man ja sagen <=6? richtig? also dann für 12 Kanäle auch <=12 ?

Sauerbruch
19.12.2010, 13:08
Dann müsste man ja sagen <=6? richtig? also dann für 12 Kanäle auch <=12 ?

...genau, oder < 13. Ich weiß nicht, ob das auf ASM-Ebene einen Unterschied macht.


20ms sind 20ms und die beleiben auch so (außer FASST da sind es 16ms)

Den hab´ ich allerdings nicht vertanden. Macht aber auch nix :-)

Ich hab das mit den Summensignalen immer mit einem auf Change konfigurierten Interrupt gemacht. In der ISR wird dann abgefragt, ob die Flanke steigend (Eingang High) oder fallend war. Je nachdem wurde der Timer entweder gestartet, oder aber angehalten, ausgelesen, zurückgesetzt und der Kanalzähler um 1 erhöht. Und bei einem Timer-Überlauf wurde der Kanalzähler auf 1 zurückgesetzt.

Also etwa so:



Config INTX = change
On INTX Flanke
Enable INTX
Enable Interrupts

Config timer0=timer, prescale = XX
On timer0 Synchronimpuls
enable timer0

Dim Impuls(12) as word
Dim Channel as Byte
Channel =1

Do
...
...
Loop

Flanke:
If PINX.Y = 1 then
Start Timer0
Else
Stop Timer0
Impuls(Channel) = Timer0
Timer0=0
Channel = Channel + 1
End if
Return

Synchronimpuls:
Stop timer0
Timer0=0
Channel = 1
Return


Hat eigentlich immer bestens funktioniert...