Jump to content
Schiffsmodell.net

Schaltkanalfunktion an FX30 analysieren


JL

Recommended Posts

Hallo,

 

nachdem das Auslesen eines RC-Signals klappt, steht jetzt eine sinnvolle Anwendung an. Ich möchte die in meiner FX30 vorhandene Schaltkanal-Funktion auf der Empfängerseite auswerten. Es gibt zwar von robbe/Futaba den dazugehörigen Dekoder, aber da mir niemand sagen konnte, ob dieser auch mit dem 2,4 GHz-System von ACT funktioniert, mache ich das jetzt auf diese Art zu Fuß.

Zunächst fange ich bei 40 MHz an; diese Systeme sind meines Wissens alle ähnlich aufgebaut: Nach einem oder zwei Synchonisationspulsen werden die Informationen für die in der Regel 8 Schalt- oder auch Proportionalfunktionen nacheinander übertragen. Ob das auch bei der FX30 so ist, soll das nachfolgende Programm zeigen. Bitte nicht wundern, dass es dann doch zwei Programme sind. Ich habe es einmal mit der schon erwähnten Funktion und ein anderes mal mit den Interrupts gelöst. Weil auf meinem kleinen (2*8 Zeichen) LC Display nicht genug Platz ist, gebe ich die Ergebnisse auf dem Terminal aus. Das hat dann auch noch den Vorteil, dass man diese Werte speichern und in anderen Programmen weiterverarbeiten kann.

Hier die Lösung mit der Funktion:

'----- Titel -------------------------------------------------------------------
' Module.......: SchaltkanalStart.bas
' Purpose......: Reads pulses of a Rx channel controled by Tx switch function
'                and displays measured values on Bascom's terminal emulation
'                To store readings open terminal log file before reading
'                Number of reads in constant LoopRead
' Author.......: Jürgen Laakmann
' Version......: 0.1
' MCU..........: ATmega16 using Pollin evaluation board
' Started......: 17.12.2012
'-------------------------------------------------------------------------------

'----- Change History ----------------------------------------------------------
' dd.mm.yyyy:
'-------------------------------------------------------------------------------

'----- Function ----------------------------------------------------------------
' Parameter..: PulseLength
' Return.....: Measured Tx signal pulse length
'-------------------------------------------------------------------------------
'----- Settings ----------------------------------------------------------------
$regfile = "m16DEF.Dat"
$crystal = 1000000
$baud = 4800
$hwstack = 32
$swstack = 10
$framesize = 40

'----- Functions ---------------------------------------------------------------
Declare Sub Getpulse(PulseLength As Word )

'----- Constants ---------------------------------------------------------------
Const LoopRead = 20                                         'defines number of RC signal read cycles
Const Timer0PreSet = 158                                    'gives interrupt after 65 ms with prescale=1024

'----- Variables ---------------------------------------------------------------
Dim PulseLength As Word
Dim PulseNumber(LoopRead) As Word                           'stores readings of RC signal
Dim PulseError As Byte                                      'stores errors, given by Timer0
Dim Count As Byte                                           'used as loop counter

'----- Ansteuerung Pollin Evaluation Board -------------------------------------
Dim KeyPressed as Bit
ddrd = &B11100000                                           'PinD5-7 output, PinD0-4 input
'   portD = &B11111111                                       'PullUp PinD0-7 active
Key1 Alias Pind.2
Key2 Alias Pind.3
Key3 Alias Pind.4
LED1 Alias Portd.5
LED2 Alias Portd.6
Buzzer Alias Portd.7
'-------------------------------------------------------------------------------

'----- Initialization ----------------------------------------------------------
'RS232-Communikation: I/O-Puffer
Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 20
'LCD configuration
Config LCD = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Cls

Config Pina.0 = Input                                       'used for RC signal
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 1
LED1 = 0
LED2 = 0

On Timer0 Mispulse

For Count = 1 to LoopRead Step 1
   PulseNumber(Count) = 0
Next Count
PulseError = 0

'===== Program =================================================================
'----- Part 1 ------------------------------------------------------------------
' Waits until Key1 is pressed

Cls
Upperline : Lcd "Ready?"
Lowerline : Lcd "Press K1"

Bitwait Key1 , Set
Reset Key1                                                  ' key bounces, re-sets key for next stop point
Cls
Upperline : Lcd "Running"

'----- Part 2 ------------------------------------------------------------------
Enable Timer0
Enable Timer1
Enable Interrupts
Timer0 = Timer0PreSet

Do
  For Count = 1 to LoopRead Step 1
     Call GetPulse(PulseLength)
     PulseNumber(Count) = PulseLength
  Next Count

  Cls
  Upperline : Lcd "Done"
  Lowerline : Lcd "Press K1"
  Bitwait Key1 , Set
  Reset Key1
  Upperline : Lcd "See term"
  Lowerline : Lcd "inal    "
  Waitms 500

  Print "Gemessene Pulslängen"
  For Count = 1 to LoopRead Step 1
     If Count < 10 Then
        Print " " ; Count ; ";";
     Else
         Print Count ; ";" ;
     End If
     Print PulseNumber(Count)
  Next Count

  Upperline : Lcd "New run?"
  Lowerline : Lcd "Press K1"
  Bitwait Key1 , set
  Cls
  Reset Key1
  Upperline : Lcd "Running"
Loop

'===== End of program ==========================================================
End                                                         'end program

'----- Subroutines -------------------------------------------------------------
Sub GetPulse(PulseLength As Word)
  PulseLength = 0
  Bitwait Pina.0 , Set
  Timer1 = 0
  Start Timer1
  Bitwait Pina.0 , Reset
  Stop Timer1
  PulseLength = Timer1
  Timer0 = Timer0PreSet
End Sub

'----- Interrupts --------------------------------------------------------------
Mispulse:
  Incr PulseError
  If PulseError > 10 Then
     Stop Timer0
     LED1 = 1
     Waitms 200
     PulseError = 0
     LED1 = 0
     Start Timer0
  End If
  Return

Und jetzt die Variante mit den Interrupts

'----- Titel -------------------------------------------------------------------
' Module.......: SchaltkanalStart_Int0.bas
' Purpose......: Reads pulses of a Rx channel controled by Tx switch function
'                and displays measured values on Bascom's terminal emulation
'                To store readings open terminal log file before reading
'                Number of cycles to read in constant LoopRead
' Author.......: Jürgen Laakmann
' Version......: 0.1
' MCU..........: ATmega16 using Pollin evaluation board
' Bascom.......: V2.0.7.5
'-------------------------------------------------------------------------------

'----- Change History ----------------------------------------------------------
' 27.12.2012 V0.1: Created
'-------------------------------------------------------------------------------

'----- Function ----------------------------------------------------------------
' Parameter..: PulseLength
' Return.....: Measured Tx signal pulse length
'-------------------------------------------------------------------------------
'----- Settings ----------------------------------------------------------------
$regfile = "m16DEF.Dat"
$crystal = 1000000
$baud = 4800
$hwstack = 32
$swstack = 10
$framesize = 40

'----- Constants ---------------------------------------------------------------
Const LoopRead = 20                                         'defines number of RC signal read cycles
Const Timer0PreSet = 6                                      'gives interrupt after 255 ms with prescale = 1024
Const ErrorTolerance = 10                                   'number of errors before showing error condition

'----- Variables ---------------------------------------------------------------
Dim PulseLength As Word
Dim PulseNumber(LoopRead) As Word                           'stores readings of RC signal
Dim PulseError As Byte                                      'stores errors, given by Timer0
Dim Count As Byte                                           'used as loop counter
Dim ErrorFlag as Bit
Dim RC_Read as Bit
RC_In alias Pind.2

'----- Ansteuerung Pollin Evaluation Board -------------------------------------
Dim KeyPressed as Bit
ddrd = &B11100000                                           'PinD5-7 output, PinD0-4 input
'   portD = &B11111111                                       'PullUp PinD0-7 active
'   Key1 Alias Pind.2                                       'used to read RC signal
Key2 Alias Pind.3
Key3 Alias Pind.4
LED1 Alias Portd.5
LED2 Alias Portd.6
Buzzer Alias Portd.7

'----- Initialization ----------------------------------------------------------
'RS232-Communikation: I/O-Puffer
Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 20
'LCD configuration
Config LCD = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Cls

Config int0 = Change                                        'used for RC signal
Config Timer0 = Timer , Prescale = 1024
Stop Timer0
Config Timer1 = Timer , Prescale = 1
Stop timer1
Timer0 = Timer0PreSet
On Timer0 Mispulse
On INt0 GetPulse

For Count = 1 to LoopRead Step 1
   PulseNumber(Count) = 0
Next Count
PulseError = 0
Reset ErrorFlag
Set RC_Read
LED1 = 0 : LED2 = 0                                         'LED's on board off
Timer0 = Timer0PreSet
timer1 = 0

'===== Program =================================================================
' Waits until Key2 is pressed
Cls
Upperline : Lcd "Ready?"
Lowerline : Lcd "Press K2"
Bitwait Key2 , Set
Reset Key2                                                  ' key bounces, re-sets key for next stop point
Cls
Upperline : Lcd "Running"

Enable Timer0 : Enable Timer1
Start timer0

Enable Interrupts

Do
  Count = 1
  Enable Int0
  While Count <= LoopRead
'      PulseNumber(Count) = PulseLength
  Wend
  Disable INT0

  Cls
  Upperline : Lcd "Done"
  Lowerline : Lcd "Press K2"
  Bitwait Key2 , Set
  Reset Key2
  Upperline : Lcd "See term"
  Lowerline : Lcd "inal    "
  Waitms 200

  Print "Gemessene Pulslängen"
  For Count = 1 to LoopRead Step 1
     If Count < 10 Then
        Print " " ; Count ; ";";
     Else
         Print Count ; ";" ;
     End If
     Print PulseNumber(Count)
  Next Count

  Upperline : Lcd "New run?"
  Lowerline : Lcd "Press K2"
  Bitwait Key2 , set
  Cls
  Reset Key2
  Upperline : Lcd "Running"
Loop

'===== End of program ==========================================================
End                                                         'end program

'----- Interrupts --------------------------------------------------------------
GetPulse:
  If RC_Read = 1 then                                      'AND RC_In = 1 Then                        'start Timer1 if positive signal on input
     Start Timer1
     Reset RC_Read
  Else                                                     'stop Timer1 if no positive signal
     Stop Timer1
     PulseNumber(Count) = Timer1
     Set RC_Read
     Incr Count
     Timer1 = 0
  End If
  Timer0 = Timer0PreSet
  Return

Mispulse:
  Set ErrorFlag
  Incr PulseError
  If PulseError > ErrorTolerance Then
     Stop Timer0
     LED1 = 1
     Waitms 200
     LED1 = 0
     PulseError = 0
     Reset ErrorFlag
     Start Timer0
  End If
  timer0 = Timer0PreSet
  Timer1 = 0
  Return

Die gemessenen Werte habe ich in eine Tabellenkalkulation übertragen http://jl.schiffsmodell.net/SchaltkanalMessung.ods

In beiden Fällen gibt es einen Synchonisationsimpuls, dem dann die 8 Werte der einzelnen Kanäle folgen. Erstaunlich finde ich nur, dass die verwendete Messmethodik einen Einfluss hat; beim Lesen mittels Funktion ist der SyncImpuls der längste, beim Lesem mit den Interrupts ist es der kürzeste Messwert.

Hat jemand eine Idee, warum das so ist?

Link to comment
  • 2 months later...

Nachdem jetzt das Auslesen des RC-Signals funktioniert, geht es jetzt in Richtung einer ersten Problemlösung.

 

Bei meiner FX30 gibt es die Möglichkeit, maximal zwei Proportionalkanäle senderseitig in 8 Schaltkanäle zu ändern. Dabei wird nicht nur ein Schalterzustand übertragen, sondern ein Stellbereich von 0 bis 100%. Ich habe den originalen Dekoder nicht, der bei Futaba dazugehört; sondern wollte diese Funktionalität für ein Soundmodul von Beier-Elektronik nutzen. Das hat nicht so recht geklappt, so dass ich jetzt mit dem Testaufbau versuchen will, mir das Signal eines solcherart umgestellten Kanals einmal näher anzusehen.

Dazu dient das foglende Programm. Es liest die in der Variablen LoopRead festgelegte Anzahl von Zyklen und gibt die gemessenen Impulswerte auf dem Terminal aus (auf meinem kleinen LCDisplay macht eine solche Ausgabe absolut keinen Sinn).

 

Programm mit der "GetPulse"-Funktion:

'----- Titel -------------------------------------------------------------------
' Module.......: SchaltkanalStart.bas
' Purpose......: Reads pulses of Futaba FX30 Rx channel controled by switch function
'                and displays measured values on Bascom's terminal emulation
'                To store open terminal log file before reading
'                Number of reads in constant LoopRead
' Author.......: Jürgen Laakmann
' Version......: 0.1
' MCU..........: ATmega16 using Pollin evaluation board
' Started......: 17.12.2012
'-------------------------------------------------------------------------------

'----- Change History ----------------------------------------------------------
' dd.mm.yyyy:
'-------------------------------------------------------------------------------

'----- Function ----------------------------------------------------------------
' Parameter..: PulseLength
' Return.....: Measured Tx signal pulse length
'-------------------------------------------------------------------------------
'----- Settings ----------------------------------------------------------------
$regfile = "m16DEF.Dat"
$crystal = 1000000
$baud = 4800
$hwstack = 32
$swstack = 10
$framesize = 40

'----- Functions ---------------------------------------------------------------
Declare Sub Getpulse(PulseLength As Word )

'----- Constants ---------------------------------------------------------------
Const LoopRead = 8                                          'defines number of RC signal read cycles
Const Timer0PreSet = 158                                    'gives interrupt after 65 ms with prescale=1024
Const SyncPulse = 1000                                      'length of synchonization pulse
                                                            ' 2050 for 40 MHz Tx
                                                            ' 1000 for 2.4 GHz Tx

'----- Variables ---------------------------------------------------------------
Dim PulseLength As Word
Dim PulseNumber(LoopRead) As Word                           'stores max. 20 readings of RC signal
Dim PulseError As Byte                                      'stores errors, given by Timer0
Dim Count As Byte                                           'used as loop counter
Dim LoopMax As Byte

'----- Ansteuerung Pollin Evaluation Board -------------------------------------
Dim KeyPressed as Bit
ddrd = &B11100000                                           'PinD5-7 output, PinD0-6 input
'   portD = &B11111111                                       'PullUp PinD0-7 active
Key1 Alias Pind.2
Key2 Alias Pind.3
Key3 Alias Pind.4
LED1 Alias Portd.5
LED2 Alias Portd.6
Buzzer Alias Portd.7
'-------------------------------------------------------------------------------

'----- Initialization ----------------------------------------------------------
'RS232-Communikation: I/O-Puffer
Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 20
'LCD configuration
Config LCD = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Cls

Config Pina.0 = Input                                       'used for RC signal
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 1
LED1 = 0
LED2 = 0

On Timer0 Mispulse

For Count = 1 to LoopRead Step 1
   PulseNumber(Count) = 0
Next Count
PulseError = 0
LoopMax = LoopRead

'===== Program =================================================================
'----- Part 1 ------------------------------------------------------------------
' Waits until Key1 is pressed

Cls
Upperline : Lcd "Ready?"
Lowerline : Lcd "Press K1"

Bitwait Key1 , Set
Reset Key1                                                  ' key bounces, re-sets key for next stop point
Cls
Upperline : Lcd "Running"

'----- Part 2 ------------------------------------------------------------------
Enable Timer0
Enable Timer1
Enable Interrupts
Timer0 = Timer0PreSet

Do
 PulseLength = 0
 Do
    Call GetPulse(Pulselength)
'  Loop Until PulseLength > SyncPulse                        'for 40 MHz Tx
 Loop Until PulseLength < SyncPulse                        'for 2.4 GHz Tx

 For Count = 1 to LoopRead Step 1
    Call GetPulse(PulseLength)
    PulseNumber(Count) = PulseLength
 Next Count

 Cls
 Upperline : Lcd "Done"
 Lowerline : Lcd "Press K1"
 Bitwait Key1 , Set
 Reset Key1
 Upperline : Lcd "See term"
 Lowerline : Lcd "inal    "
 Waitms 500

 Print "Gemessene Pulslängen"
 For Count = 1 to LoopRead Step 1
     If Count < 10 And LoopMax > 9 Then
        Print " " ; Count ; "  ";
     Else
         Print Count ; "  " ;
     End If
     Print PulseNumber(Count) ; "| ";
 Next Count
 Print

 Upperline : Lcd "New run?"
 Lowerline : Lcd "Press K1"
 Bitwait Key1 , set
 Cls
 Reset Key1
Loop

End                                                         'end program
'===== End of program ==========================================================

'----- Subroutines -------------------------------------------------------------
Sub GetPulse(PulseLength As Word)
  PulseLength = 0
  Bitwait Pina.0 , Set
  Timer1 = 0
  Start Timer1
  Bitwait Pina.0 , Reset
  Stop Timer1
  PulseLength = Timer1
  Timer0 = Timer0PreSet
End Sub

'----- Interrupts --------------------------------------------------------------
Mispulse:
  Incr PulseError
  If PulseError > 10 Then
     Stop Timer0
     LED1 = 1
     Waitms 200
     PulseError = 0
     LED1 = 0
     Start Timer0
  End If
  Return

Programm mit Messung über Int0:

'----- Titel -------------------------------------------------------------------
' Module.......: SchaltkanalStart_Int0.bas
' Purpose......: Reads pulses of a Rx channel controled by Tx switch function
'                and displays measured values on Bascom's terminal emulation
'                To store readings open terminal log file before reading
'                Number of cycles to read in constant LoopRead
' Author.......: Jürgen Laakmann
' Version......: 0.1
' MCU..........: ATmega16 using Pollin evaluation board
' Bascom.......: V2.0.7.5
'-------------------------------------------------------------------------------

'----- Change History ----------------------------------------------------------
' 27.12.2012 V0.1: Created
'-------------------------------------------------------------------------------

'----- Function ----------------------------------------------------------------
' Parameter..: PulseLength
' Return.....: Measured Tx signal pulse length
'-------------------------------------------------------------------------------
'----- Settings ----------------------------------------------------------------
$regfile = "m16DEF.Dat"
$crystal = 1000000
$baud = 4800
$hwstack = 32
$swstack = 10
$framesize = 40

'----- Constants ---------------------------------------------------------------
Const LoopRead = 2                                          'defines number of RC signal read cycles
Const Timer0PreSet = 6                                      'gives interrupt after 255 ms with prescale = 1024
Const ErrorTolerance = 10                                   'number of errors before showing error condition

'----- Variables ---------------------------------------------------------------
Dim PulseNumber(LoopRead) As Word                           'stores readings of RC signal
Dim PulseError As Byte                                      'stores errors, given by Timer0
Dim Count As Byte                                           'used as loop counter
Dim ErrorFlag as Bit
Dim RC_Read as Bit
RC_In alias Pind.2

'----- Ansteuerung Pollin Evaluation Board -------------------------------------
Dim KeyPressed as Bit
ddrd = &B11100000                                           'PinD5-7 output, PinD0-4 input
'   portD = &B11111111                                       'PullUp PinD0-7 active
'   Key1 Alias Pind.2                                       'used to read RC signal
Key2 Alias Pind.3
Key3 Alias Pind.4
LED1 Alias Portd.5
LED2 Alias Portd.6
Buzzer Alias Portd.7

'----- Initialization ----------------------------------------------------------
'RS232-Communikation: I/O-Puffer
Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 20
'LCD configuration
Config LCD = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Cls

Config int0 = Change                                        'used for RC signal
Config Timer0 = Timer , Prescale = 1024
Stop Timer0
Config Timer1 = Timer , Prescale = 1
Stop timer1
Timer0 = Timer0PreSet
On Timer0 Mispulse
On INt0 GetPulse

For Count = 1 to LoopRead Step 1
   PulseNumber(Count) = 0
Next Count
PulseError = 0
Reset ErrorFlag
Set RC_Read
LED1 = 0 : LED2 = 0                                         'LED's on board off
Timer0 = Timer0PreSet
timer1 = 0

'===== Program =================================================================
' Waits until Key2 is pressed
Cls
Upperline : Lcd "Ready?"
Lowerline : Lcd "Press K2"
Bitwait Key2 , Set
Reset Key2                                                  ' key bounces, re-sets key for next stop point
Cls
Upperline : Lcd "Running"

Enable Timer0 : Enable Timer1
Start timer0
Enable Int0
Enable Interrupts

Do
  Count = 0
  'Enable Int0
  While Count < LoopRead : Wend
  'Disable INT0

  Cls
  Upperline : Lcd "Done"
  Lowerline : Lcd "Press K2"
  Bitwait Key2 , Set
  Reset Key2
  Upperline : Lcd "See term"
  Lowerline : Lcd "inal    "
  Waitms 200

  Print "Gemessene Pulslängen"
  For Count = 1 to LoopRead Step 1
     If Count < 10 Then
        Print " " ; Count ; ";";
     Else
         Print Count ; ";" ;
     End If
     Print PulseNumber(Count)
  Next Count

  Upperline : Lcd "New run?"
  Lowerline : Lcd "Press K2"
  Bitwait Key2 , set
  Cls
  Reset Key2
  Upperline : Lcd "Running"
Loop

'===== End of program ==========================================================
end                                                         'end program

'----- Interrupts --------------------------------------------------------------
GetPulse:
  if RC_Read = 1 AND RC_In = 1 then                        'start Timer1 if positive signal on input
     start Timer1
     reset RC_Read
  else                                                     'stop Timer1 if no positive signal
     stop Timer1
     Incr Count
     PulseNumber(Count) = Timer1
     set RC_Read
     Timer1 = 0
  end if
  Timer0 = Timer0PreSet
  return

Mispulse:
  set ErrorFlag
  incr PulseError
  if PulseError > ErrorTolerance then
     stop Timer0
     LED1 = 1
     waitms 200
     LED1 = 0
     PulseError = 0
     reset ErrorFlag
     start Timer0
  end if
  timer0 = Timer0PreSet
  Timer1 = 0
  return

Das Ergebnis bei 40 MHz ist auf Seite 1 wiedergegeben: Der Sender schickt nach einem längeren Synchronisationsimpuls die 8 Kanaleinstellungen nacheinander auf die Reise. Veränderungen der Schalter bzw. von Potis lassen sich dort auch einfach erkennen.

 

Leider ist das dann nicht mehr so schön, wenn ich die Übertragung mit dem 2,4 GHz-System von ACT versuche. Das Ergebnis steht auf Seite 2. Irgendwelche Gesetzmäßigkeiten lassen sich da für mich nicht mehr erkennen; das hat dann auch die Erkennung im Beier-Soundmodul überfordert. Zumindest habe ich jetzt ein gleiches Ergebnis mit meinem Programm erzielt. Also läßt sich zumindest ein gewisser Lerneffekt verbuchen.

Da ich aber doch noch die Schaltkanalfunktionalität meiner FX30 bei 2,4 GHz nutzen möchte, jetzt die Frage an die Mitleser: Hat jemand eine Idee, wie ich hier weiterkommen kann?

SchaltkanalMessung.pdf

Link to comment
Time Bandit

Ich habe 2 Vermutungen, mit dem getpulse-Befehl hab ich übrigens keine guten Erfahrungen gemacht.

Der blockiert die restliche Programmabarbeitung und liefert zumindest bei mir manchmal sehr sinnfreie Messergebnisse.

 

Deswegen arbeite ich selber nur noch mit INT0 bzw. INT1.

Da funktioniert dein Programm irgendwie nicht so richtig sauber.

 

Bei 1Mhz und 1-2ms Impulsdauert sollte der Timer 1 eigentlich Werte zwischen 1000 und 2000 annehmen. (1000000 Hz * 0,002s = 2000).

Insofern würd ich mal vermuten, dass du im Moment die Zeit misst, wie lange der Kanal low ist, also die Pause zwischen den eigentlichen Impulsen.

Deswegen sind auch immer die ersten Werte je Run so kurz (du steigst natürlich irgendwo in der Pause ein).

 

Ich schieb dir nachher mal mein Programm rein, mit dem ich meinen Multiswitch zu Diagnosezwecken ausgelesen hab.

Da kannst du online erkennen, was sich ändert wenn du einen Schalter drückst. Die "Schwelle" für den Syncimpuls musst du eben anpassen (und Fuses auf 8Mhz stellen).

Das funktioniert bei mir einwandfrei, ich brauch nur manchmal ne "Entstörung" am INT0 (einfach nen 100N Kondensator).

 

 

Sonstige Auffälligkeiten, Schalter 7 und 8 funktionieren nicht, oder?

 

 

Warum das an 2,4 Ghz nicht funktioniert kann ich nur erahnen.

- Widerholrate des ACT-Systems dürfte höher sein, da wird die Synchronisation mit dem PPM Signal der Funke einfach nicht mehr passen

- es werden irgendwelche Zwischenzustände übertragen

- Der Empfänger bildet einen "gleitenden" Mittelwert (so wie es z.B. FRsky auch tut) damit die Servos nicht zucken.

Link to comment

Hallo Tobias,

 

Getpulse ist eine Funktion, die ich definiert habe. Da passiert nichts anderes als dass auf die positive Flanke des Signals (Bitwait Pina.0 , Set) gewartet wird. Meintest Du die Funktion "PulseIn" von Bascom?

Die Ergebnisse (Seite 1 oben der *.pdf-Datei) stimmen mit Deinem Rechenbeispiel doch gut überein und liegen zwischen 1 und 2 ms. Dass die erste Messung nicht immer suaber ausgeführt ist, schiebe ich auf den (mehr oder weniger) zufälligen Start des Programms; deshalb messe ich ja auch mehrere Durchläufe. Wenn das Programm einmal läuft, sind die Messungen durchaus reproduzierbar.

Es ist schon klar, dass sich diese Variante nicht empfiehlt, wenn der Controller noch etwas anderes machen soll (hier soll er aber nur am Empänger lauschen und erst am Ende mitteilen, was er gelesen hat). Da ist die Interrupt-Variante sicher besser; das Teil werde ich mir mit Deinen Hinweisen noch einmal ansehen.

Link to comment
Guest LostInSpace

Hi,

 

unterstützt ACT überhaupt dieses Robbe-Protokoll?

 

So wie ich dein Problem verstanden habe liegt es an der Übertragung im 2G4 Bereich. Das aber bedeutet, das Du senderseitig das Multikanal/Nautic Signal umformen müsstest und am Empfänger vor dem Beier-Modul wieder "zurück" wandeln musst. Das ist aber ein Thema für Fortgeschrittene :lovl:

 

Das Multikanal-Protokoll arbeitet streng sequentiell. Das passt grundsätzlich nicht mit der 2G4 oder PCM Technik zusammen. Daher haben einige Hersteller Graupner, Jeti, .. extra Anpassungen an ihren 2G4 System gemacht.

 

Also. Willkommen im 2G4 Dilemma

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.