Hi

nicht ganz - Modellflieger steuert man ja nicht mit dem PC...
Habe eine alte Fernsteuerung genommen, alles rausgeschmissen und eine neue Elektronik eingebaut, die die Steuerknüppel einliest und diese Werte an dem Prozessor im Modell sendet, der damit die Servos für die Ruder steuert...
Übertragung war auf 256 Schritte / Servoweg reduziert und wurde dann im Empfänger mit möglichen 1024 Schritten / Servoweg ausgegeben - so war Trimmung etc dann etwas feiner abgestuft.

Leider liegt der ganze Kram nun in der Ecke, da ich im vergangenen Sommer dort eine Fehlfunktion im Sender hatte, und noch keine Zeit da mal nach der Ursache zu suchen. Außerdem hab ich jetzt ja auch 1 gekaufte 2,4GHz Fernsteuerung, die ausgezeichnet funktioniert und auch diverse einstellbare Mischerfunktionen hat, an deren Programmierung in meiner eigenen Steuerung ich total gescheitert war...

Wie gesagt - eine PN und ich schick dir mal den Bascom-Code, mit dem du dann nur noch 1 Prozessor für die 18 Servos brauchst - wird nur 1 * 16 Bit Timer benötigt dafür.

Edith: für 18 Servos hab ich die Routine jetzt umgeschrieben - aber dafür wird dann der Mega 16 benötigt - Da du ja eh auf SMD gehen willst, ist das ja kein Problem, denn da ist er ja nur minimalst größer als der M8.
RS232 und I2C-Pins bleiben dabei auch noch frei benutzbar.
Code:
$regfile = "m16def.dat"
$crystal = 8000000


Config Porta = Output                                       'alle Pins voll belegt
Config Portc = Output                                       'Pin 0 und 1 bleiben frei belegbar (I2C Bus)
Config Portd = Output                                       'Pin 0 und 1 bleiben frei belegbar (RS232) ebenso Pin 6 und 7 sind noch frei


Config Timer1 = Timer , Prescale = 8
Start Timer1
On Timer1 _timer1
Enable Timer1
Enable Interrupts


Dim Aktservo As Byte                                        'Aktuelles Servo (ISR)
Dim _aktservo As Byte                                       'Aktuelles Portpin für Servo (ISR)
Dim Sk(18) As Word                                          'Servowertearray
Dim Tempw(18) As Word                                       'temporären-Array mit den Werten für die 18 Servokanäle aus deinem Programm.
Dim A As Byte


'*init der Vars*
Aktservo = 1



'***Hauptschleife***
Do

 For A = 1 To 18                                            'hier wird dem Servokanal (SK) der Wert übergeben
    Sk(a) = Tempw(a)                                        'mögliche Werte sind von 0 bis 1024;  512 ist Mitte
 Next

Loop





'*Interruptroutinen*
_timer1:
     If Aktservo < 9 Then                                   'Servo 1-8
       _aktservo = Aktservo - 1                             'Pindefinition berechnen
       Porta._aktservo = 0                                  'dann Pin ausschalten
      Elseif Aktservo < 15 Then                             'Servo 9-14
       _aktservo = Aktservo - 7                             'Pindefinition berechnen
       Portc._aktservo = 0                                  'dann Pin ausschalten
      Else                                                  'Servo 15-18
       _aktservo = Aktservo - 13                             'Pindefinition berechnen
       Portd._aktservo = 0                                  'dann Pin ausschalten
     End If
     Incr Aktservo                                          'aktuelles Servo um 1 erhöhen
     If Aktservo = 19 Then                                  'Wenn alle 18 Servos durch sind
        Aktservo = 1                                        'aktuelles Servo auf 1 zurücksetzen
     End If
     If Aktservo < 9 Then                                   'Servo 1-8
       _aktservo = Aktservo - 1                             'neue Pindefinition berechnen
       Porta._aktservo = 1                                  'neues Pin anschalten
      Elseif Aktservo < 15 Then                             'Servo 9-14
       _aktservo = Aktservo - 7                             'neue Pindefinition berechnen
       Portc._aktservo = 1                                   'neues Pin anschalten
      Else                                                  'Servo 15-18
       _aktservo = Aktservo - 13                            'neue Pindefinition berechnen
       Portd._aktservo = 1                                  'neues Pin anschalten
     End If
     Timer1 = Sk(aktservo) + 63523                          'Timer laden mit neuem Wert
Return
Für alle anderen hier der Code mit 5 Servos und 7 "Dummykanälen" als Word Variable:
Code:
$regfile = "m8def.dat"
$crystal = 8000000


Config Portb = Output

Config Timer1 = Timer , Prescale = 8
Start Timer1
On Timer1 _timer1
Enable Timer1
Enable Interrupts


Dim Aktservo As Byte                                        'Aktuelles Servo (ISR)
Dim _aktservo As Byte                                       'Aktuelles Portpin für Servo (ISR)
Dim Servo As Word                                           'Dummy für verarbeitung der 7 Dummyservokanäle für die Pausenzeit
Dim Sk(12) As Word                                          'Servowertearray
Dim Tempw(5) As Word                                        'temporären-Array mit den Werten für die 5 Servokanäle aus deinem Programm.
Dim A As Byte



'*init der Vars*
Aktservo = 1
_aktservo = 0
For A = 6 To 12                                             'Dummykanäle der Pausenzeit auf 0 setzen
  Sk(a) = 0
Next



'***Hauptschleife***
Do

 For A = 1 To 5                                               'hier wird dem Servokanal (SK) der Wert übergeben
    Sk(a) = Tempw(a)                                            'Werte sind von 0 bis 1024 wenn ich mich jetzt nicht total irre...
 Next                                                       'ich glaube aber, daß ich nur bis 1020 übergeben habe

Loop





'*Interruptroutinen*
_timer1:
     If Aktservo < 6 Then                                   'aktuelles Servo <6 ist noch der pin vom letzten einschalten... (wenn ausgaben an pins sollen)
       Portb._aktservo = 0                                  'dann Pin ausschalten
       Incr Aktservo                                        'aktuelles servo um 1 erhöhen
      Else                                                  'wenn keine Pins mehr ( Pausenzeit ab servo 6)
       Servo._aktservo = 0                                  'Dann bit im Variable Servo ausschalten
       Incr Aktservo                                        'aktuelles servo um 1 erhöhen
       If Aktservo = 13 Then                                'Wenn bei durchlauf 13 sind
         Aktservo = 1                                       'Aktuelles Servo Auf 1 Setzen
       End If
     End If
     _aktservo = Aktservo - 1                               'da mit Portpin 0 anfangen - diese Variable eins niedriger
     If Aktservo < 6 Then                                   'Wenn im Bereich der Pins arbeiten
       Portb._aktservo = 1                                  'neues Pin anschalten
      Else                                                  'ansonsten
       Servo._aktservo = 1                                  'Bit in Dummyvariable anschalten
     End If
     Timer1 = Sk(aktservo) + 63523                          'Timer laden mit neuem Wert
Return