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.
Mbel1 und Mbel2 stehen für die Merker des Ausgangs "Beleuchtung".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
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







Zitieren

Lesezeichen