Hallo Andi,

hatte erst jetzt Deinen Beitrag entdeckt...

Ein Beispiel kannst Du gerne haben:

Code:
'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Auswertung für Graupner Nautic Expert Baustein
'Ansteuerung von Servos über Schalterpositionen
'
'Version: 1.0
'
'Hardware:
'R/C-Kanal an D.2 (INT0)
'LED an C.0
'Servos an C.1...C.4
'
'15.01.2007 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 4000000

'======================================================
'Konfigurationen
'======================================================

'Konfiguration der I/O-Ports´s
Ddrc = 11111111
Ddrd = 11110000

'Konfiguration des Timer1
Config Timer1 = Timer , Prescale = 1

'Konfiguration des INT0
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change

'======================================================
'Deklarationen
'======================================================

Dim N As Byte
Dim N_old As Byte
Dim Location As Byte
Dim Signals As Byte
Dim Reading As Bit
Dim Rc_value(10) As Word
Dim Error As Bit
Dim Sync_detect As Bit
Dim X As Word
Dim Switch_up As Byte
Dim Switch_dn As Byte
Dim Sync_ok As Bit
Dim Cycle_done As Bit
Dim Switchhold As Byte
Dim Number As Byte
Dim Watchcat As Word
Dim Servowert_1 As Word
Dim Servowert_2 As Word
Dim Servowert_3 As Word
Dim Servowert_4 As Word

'======================================================
'Konstanten
'======================================================
Const Sync_lowlimit = 8000
Const Sync_highlimit = 9000
Const Switch_lowlimit = 4000
Const Switch_highlimit = 7900

Const Servo1_up_pos = 1000
Const Servo1_nt_pos = 1500
Const Servo1_dn_pos = 2000

Const Servo2_up_pos = 1200
Const Servo2_nt_pos = 1300
Const Servo2_dn_pos = 2000

Const Servo3_up_pos = 2000
Const Servo3_nt_pos = 1800
Const Servo3_dn_pos = 1000

Const Servo4_up_pos = 1500
Const Servo4_nt_pos = 2000
Const Servo4_dn_pos = 1000

'======================================================
'Initialisierungen
'======================================================

'Zuweisung der Interrupt-Service-Routinen
On Timer1 Rc_error
On Int0 Rc_read
'Timer-Freigabe
Enable Timer1
Stop Timer1

'Ports initialisieren
Portc = &B11111111

'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts

'======================================================
'Synchronisationsschleife
'======================================================
Syncronize:
Signals = 1
N = 1
Sync_detect = 0
X = 0

'Rücksetzen aller Schaltersignale
For X = 0 To 7
   Switch_up.x = 0
   Switch_dn.x = 0
Next X

X = 0

'Warten auf ersten Synchronisationswert
While Sync_detect = 0
Wend

N = 2
Sync_detect = 0

'Warten auf zweiten Synchronisationswert
'Begrenzt durch Zählschleife
While X < 5000 And Sync_detect = 0
   Incr X
Wend

'Auswertung des Synchronisationsergebnisses
If X < 5000 And Rc_value(1) > Sync_lowlimit And Rc_value(2) > Sync_lowlimit Then
   N = 3
   Signals = 10
Else
   Goto Syncronize
End If

Watchcat = 0

'======================================================
'Hauptprogramm-Schleife
'======================================================
Do

'Auswertung der gelesenen Werte (im Block)
If Cycle_done = 1 And Reading = 0 And Error = 0 Then
   Cycle_done = 0
   'Überprüfung der Synchronisationssignale
   If Rc_value(1) > 8000 And Rc_value(2) > 8000 And Error = 0 Then
      Sync_ok = 1
   Else
      Sync_ok = 0
      Goto Syncronize
   End If

   'Aktualisierung der Schaltersignale
   If Sync_ok = 1 Then
      For X = 3 To Signals
         Number = X - 3
         'Schalter nach oben betätigt
         If Rc_value(x) > 7000 And Rc_value(x) < 7900 Then
            If Switchhold.number = 0 Then
               Switchhold.number = 1
               Toggle Switch_up.number
            End If
         'Schalter nach unten betätigt
         Elseif Rc_value(x) > 4000 And Rc_value(x) < 5500 Then
            If Switchhold.number = 0 Then
               Switchhold.number = 1
               Toggle Switch_dn.number
            End If
         'Schalter in Mittelstellung
         Else
            Switchhold.number = 0
            Switch_up.number = 0
            Switch_dn.number = 0
         End If
      Next X

      'Zuweisen der Servopositionen
      If Switch_up.0 = 1 And Switch_dn.0 = 0 Then
         Servowert_1 = Servo1_up_pos
      Elseif Switch_up.0 = 0 And Switch_dn.0 = 1 Then
         Servowert_1 = Servo1_dn_pos
      Else
         Servowert_1 = Servo1_nt_pos
      End If
      If Switch_up.1 = 1 And Switch_dn.1 = 0 Then
         Servowert_2 = Servo2_up_pos
      Elseif Switch_up.1 = 0 And Switch_dn.1 = 1 Then
         Servowert_2 = Servo2_dn_pos
      Else
         Servowert_2 = Servo2_nt_pos
      End If
      If Switch_up.2 = 1 And Switch_dn.2 = 0 Then
         Servowert_3 = Servo3_up_pos
      Elseif Switch_up.2 = 0 And Switch_dn.2 = 1 Then
         Servowert_3 = Servo3_dn_pos
      Else
         Servowert_3 = Servo3_nt_pos
      End If
      If Switch_up.3 = 1 And Switch_dn.3 = 0 Then
         Servowert_4 = Servo4_up_pos
      Elseif Switch_up.3 = 0 And Switch_dn.3 = 1 Then
         Servowert_4 = Servo4_dn_pos
      Else
         Servowert_4 = Servo4_nt_pos
      End If

   End If
End If

'Watchdog
If N = N_old Then
   Incr Watchcat
   If Watchcat > 5000 Then Goto Syncronize
Else
   N_old = N
   Watchcat = 0
End If
Loop

'Programmende (nur formal)
End


'======================================================
'ISR für INT0 - Signalfolge lesen
'======================================================
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 And Pind.2 = 1 Then
   Start Timer1
   Reading = 1
'Den Timer stoppen mit fallender Flanke
Else
   Stop Timer1
   Rc_value(n) = Timer1
   Timer1 = 0
   Reading = 0
   'Setzen der Servopositionen
   If Sync_ok = 1 Then
      Pulseout Portc , 1 , Servowert_1
      Pulseout Portc , 2 , Servowert_2
      Pulseout Portc , 3 , Servowert_3
      Pulseout Portc , 4 , Servowert_4
   Else
      Portc.1 = 0
      Portc.2 = 0
      Portc.3 = 0
      Portc.4 = 0
   End If
   'Validierung des gelesenen Wertes
   If Rc_value(n) < 4000 Or Rc_value(n) > Sync_highlimit Then Goto Rc_error
   'Prüfung auf Sync-Signal
   If N < 3 And Rc_value(n) > Sync_lowlimit And Rc_value(n) < Sync_highlimit Then
      Sync_detect = 1
   End If
   '...wenn die Synchronisation fertig ist
   If Signals > 2 Then
      Incr N
   End If
   If N > Signals Then
      N = 1
      Cycle_done = 1
   End If
   'Statusanzeige an C.0
   Toggle Portc.0
End If
'Error-Bit rücksetzen
Error = 0
Return

'======================================================
'ISR für Timer1 - Fehlerhandling
'======================================================
Rc_error:
'Error-Bit setzen
Error = 1
Reading = 0
Stop Timer1

Return
Das Programm kommt aus dem Modellbau und wertet die Signale eines Graupner NauticExpert-Moduls aus. Damit werden dann vier Servos in vorgegebene Positionen gefahren.

Anwendung ist die Getriebe- und Sperrdifferentilansteuerung eines Allrad-Wedico-Trucks.

Die Hardware wird direkt am Empfänger angeschlossen, die ISR der Signalauswertung (rc_read) nutze ich gleichzeitig zur Aktualisierung der Pulseouts.

"Runterbrechen" auf ein einfaches Beispiel müsstest Du es Dir bitte selbst...

Grüße

Torsten