Hallo Jörg

...und vielen lieben Dank für Antwort und Verständnis.

Ja, korrekt. 2 Klappen, 2 Servos. Die letzte "If" kann ich jedoch nicht heraus nehmen - habe ich schon mehrfach probiert. Wenn ich diese voran setze, dann wird der Merker zeitgleich auf Null gesetzt und das Servo bleibt in der Position des davor stehenden Punktes (Anlaufpunkt nach ersten Tasten) stehen, da der Frequenzwechsel weitaus schneller von statten geht, als das Servo anlaufen kann (zu träge halt).
So funktioniert es prima und bleibt es nun auch.

Habe heute zudem die anderen Befehle für die PWM-Kanalabfrage und das Setzen von 3 zusätzlichen Ausgängen in das Programm implementiert.
Es funktionierte prima, bis zu dem Punkt, an dem ein Ausgang durch 2 Bedingungen gesetzt wird:

1.) Durch das Erfassen eines PWM-Eingangssignals und entsprechend festgelegter Schaltroutine

2.) Durch einen Taster per Debounce-Befehl.

Das Problem war, dass der Debounce den Ausgang setzte, dieser jedoch durch den PWM-Input (bei PWM 1ms, also im Grunde "aus") nach 1-2 Sekunden wieder ausgeschaltet wurde.
Und das Problem kannte ich (nach ein wenig Ausprobieren) noch aus meiner Zeit als Lehrling, wo ich mit SPS-Steuerungen zu tun hatte: Signalüberschneidung am Ausgang.

Also habe ich für beide Bedingungen statt des direkten Ausgangs einen Merker als Schaltkontakt gesetzt und später in der Hauptschleife als IF-(OR)-Then Bedingung definiert.


Hier das File - ist allerdings nicht ganz so gut beschrieben.

Code:
$regfile = "m8def.dat"
$crystal = 3686411


Config Portb = Output
Config Portc = Input
Config Portd = Input


'*** Konfiguriere Inputs ***

Taster1 Alias Pinc.0
Taster2 Alias Pinc.1
Taster3 Alias Pinc.2
Taster4 Alias Pinc.3



' *** Konfiguriere Outputs ***

Pumpe Alias Portb.0
Beleuchtung Alias Portb.1
Scheinwerfer Alias Portb.2

Pumpe = 1
Beleuchtung = 1
Scheinwerfer = 1


'*** Konfiguriere Servos ***

Config Servos = 2 , Servo1 = Portb.3 , Servo2 = Portb.4 , Reload = 10
Enable Interrupts


'*** Setze Servos für Startup auf Mittelstellung ***
Dim Pos1 As Byte
Pos1 = 124       ' 124 = Mittelstellung, 48 = rechter Anschlag, 210 = linker Anschlag, Servo 1
Servo(1) = Pos1
Dim Pos2 As Byte
Pos2 = 130       ' 130 = Mittelstellung, 48 = rechter Anschlag, 215 = linker Anschlag, Servo 2
Servo(2) = Pos2


'*** Konfiguriere Variablen ***

Dim Kanal5 As Byte
Dim Kanal6 As Byte
Dim M1 As Byte
Dim M2 As Byte
Dim M3 As Byte
Dim M4 As Byte
Dim Mbel1 As Bit
Dim Mbel2 As Bit
Dim Mschein1 As Bit
Dim Mschein2 As Bit
Dim Mpmp1 As Bit
Dim Mpmp2 As Bit
M1 = 0
M2 = 0
M3 = 0
M4 = 0
Mbel2 = 0
Mschein2 = 0
Mpmp2 = 0



'  *****************************
'    ***** Hauptprogramm *****
'  *****************************

Do


Pulsein Kanal5 , Pind , 2 , 1
Pulsein Kanal6 , Pind , 3 , 1


   If Kanal5 > 10 Then
      If Kanal5 >= 60 Then
         Mpmp1 = 1
      Else
         Mpmp1 = 0
      End If
      End If

   If Kanal6 > 10 Then
      If Kanal6 >= 50 Then
         Mbel1 = 1
      Else
         Mbel1 = 0
      End If
      If Kanal6 >= 70 Then
         Mschein1 = 1
      Else
         Mschein1 = 0
      End If
      End If



Debounce Taster1 , 0 , Sub_taster1 , Sub
Debounce Taster2 , 0 , Sub_taster2 , Sub
Debounce Taster3 , 0 , Sub_taster3 , Sub
Debounce Taster4 , 0 , Sub_taster4 , Sub


   If Mpmp1 = 1 Or Mpmp2 = 1 Then
      Pumpe = 0
   Else
      Pumpe = 1
   End If


   If Mbel1 = 1 Or Mbel2 = 1 Then
      Beleuchtung = 0
   Else
      Beleuchtung = 1
   End If

   If Mschein1 = 1 Or Mschein2 = 1 Then
      Scheinwerfer = 0
   Else
      Scheinwerfer = 1
   End If


Loop



' *************************
'   *** Unterprogramme ***
' *************************


'  Klappensteuerung
' ******************

Sub_taster1:

   If Taster1 = 0 Then
      M1 = M1 + 1       'Wenn Taster 1 gedrückt, zählt Merker1 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt eine neue Positionsausgabe per PWM an Servo1.
   Waitms 20
   End If

   If M1 = 1 Then
      Pos1 = 48
   Elseif M1 = 2 Then
      Pos1 = 210
   End If
   If M1 = 2 Then       'Wenn M1 den Wert 2 erreicht, wird M1 auf Null zurück gesetzt
      M1 = 0
   End If
   Servo(1) = Pos1

Return


'Wenn Taster 2 gedrückt wird, zählt Merker2 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt neue Positionsausgabe an Servo2.

Sub_taster2:

   If Taster2 = 0 Then
      M2 = M2 + 1
   Waitms 20
   End If

   If M2 = 1 Then
      Pos2 = 48
   Elseif M2 = 2 Then
      Pos2 = 210
   End If
   If M2 = 2 Then       ' Wenn M2 den Wert 2 erreicht, wird M2 auf Null zurück gesetzt
      M2 = 0
   End If
   Servo(2) = Pos2

Return




' Handbedienung Beleuchtung
' *************************

Sub_taster3:

   If Taster3 = 0 And Mbel1 = 0 Then
      M3 = M3 + 1
   End If

   If M3 = 1 Then
      Mbel2 = 1
   Elseif M3 = 2 Then
      Mschein2 = 1
   End If
   If M3 = 3 Then
      Mbel2 = 0
      Mschein2 = 0
      M3 = 0
   End If

Return



' Handbedienung Pumpe
' *******************

Sub_taster4:

      If Taster4 = 0 And Mpmp1 = 0 Then
         M4 = M4 + 1
      End If

      If M4 = 1 Then
         Mpmp2 = 1
      End If
      If M4 = 2 Then
         Mpmp2 = 0
         M4 = 0
      End If

Return

End
Mbel1 und Mbel2 stehen für die Merker des Ausgangs "Beleuchtung".
Mschein1 und Mschein2 sind die Ausgangsmerker für den Scheinwerfer und
Mpmp1 und Mpmp2 stehen für die Ausgangsmerker der Pumpe.


Die Frequenz habe ich nun intern auf 3,2MHz festgelegt, weil so die Servos etwas besser arbeiten.

Ich bin gespannt, ob das Programm auch in meinem Boot so gut funktioniert wie auf meinem STK-500 ^^.



MFG - Maik