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
Lesezeichen