Hallo, habe in meinem Programm ein Problem, das ich leider nicht erkenne Zuerst einmal stelle ich den Schaltplan und den Code ein.
'Aquarien - Pumpensteuerung
'Aktuellste Version V 2.0
'Steuerung für das Target - Projekt aqua-pu5.t3
'230V Ausgang ist mit PWM-Pumpenansteuerung ausgerüstet
'Signalisierung:Tag - Nachterkennung mit zeitlicher Laufzeitreduzierung
'Trockenlaufschutz mittels externer Elektrode, Maximal - Geschwindigkeitsregulierung über Poti
'über Poti und 3 Sensoren in Abhängigkeit des Wasserstandes in der Pumpenkammer eines Außenfilters
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100
'BPW42 - Tag-Nacht-Erkennung
'Pullup ausgeschaltet D.2=0 Tag, D.2=1 Nacht
Config Portd.2 = Input
Pind.2 = 0
Bpw42 Alias Pind.2
'Ic4 Ansteuerung mit PWM
Config Portb.1 = Output
Ic4_ansteuerung Alias Portb.1
'Einschaltzeit IC4
Config Portb.3 = Output
Ic4_ansteuerzeit Alias Portb.3
'LED für Trockenlauf
Config Portb.0 = Output
Led_trockenlauf Alias Portb.0
'LED für Tagbetrieb
Config Portb.2 = Output
Led_tag Alias Portb.2
'LED für Nachtbetrieb
Config Portd.7 = Output
Led_nacht Alias Portd.7
'Trockenlaufsensor
' Pullup ausgeschaltet D.3=0 Trockenlauf. D.3=1 Normalbetrieb
Config Portd.3 = Input
Pind.3 = 0
Trockenlaufsensor Alias Pind.3
'Automatikgeschwindigkeit ein - aus
Config Portd.6 = Output
Led_automatik Alias Portd.6
'höchster Geschwindigkeitswert, der mit Poti eingestellt worden ist
Config Portd.5 = Output
Led_auto_geschwindigkeit_hoch Alias Portd.5
'höchster Geschwindigkeitswert -30
Config Portb.4 = Output
Led_auto_geschwindigkeit_mittel Alias Portb.4
'höchster Geschwindigkeitswert - 60
Config Portb.5 = Output
Led_auto_geschwindigkeit_niedrig Alias Portb.5
'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config Portc.4 = Input
Pinc.4 = 0
Taster_automatik Alias Portc.4
'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert
Config Portd.4 = Input
Pind.4 = 0
Geschw_sensor_hoch Alias Pind.4
Config Portd.1 = Input
Pind.1 = 0
Geschw_sensor_mittel Alias Pind.1
Config Portd.0 = Input
Pind.0 = 0
Geschw_sensor_niedrig Alias Pind.0
'Debounce auf 50 ms festlegen
Config Debounce = 50
'A/D-Wandler wir konfiguriert
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'Tmer 1 wird konfiguriert
Config Timer1 = Timer , Prescale = 8
On Timer1 500ms_interrupt
Timer1 = 3036
Enable Timer1
Enable Interrupts
'PWM wird Konfiguriert
Config Timer2 = Pwm , Prescale = 1 , Compare = Clear
Enable Timer2
Timer2 = 0
Start Timer2
'Variable des PWM-Wertes wird auf 16 bit festgelegt
Dim Analogwert As Word
'Flag für OC2
Dim Flag_ic4_ansteuerung As Word
Flag_ic4_ansteuerung = 0
'Flag für Trockenlauf
Dim Flag_trockenanzeige As Word
Flag_trockenanzeige = 0
'Flag für Automatikprogramm
Dim Flag_automatik As Byte
Flag_automatik = 0
Dim Geschwindigkeit As Byte
'*********** MAINLOOP *************
Do
'Bei Tasterwechsel 1 auf Null soll Subroutine Automatic angesprungen werden
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
End If
'PWM
'Analogwert wird in 10-bit-Länge digitalisiert, Kanal 1 wird festgelegt
'die anderen Pins des Port C sind frei verfügbar
Analogwert = Getadc(1)
'Anpassung der 10-bit des ADC auf byte-Größe des Timer 2
Analogwert = Analogwert / 4
'Höchstmöglicher Analogwert
If Analogwert > 255 Then
Analogwert = 255
Else
'Ansonsten eingestellter Wert zwischen 0 und 255
Ocr2 = Analogwert
End If
'*** Auswertung Trockenlaufsensor
If Trockenlaufsensor = 0 Then
Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0
Flag_trockenanzeige = 0
'Anzeige Trockenlauf bereits gestartet?
If Flag_trockenanzeige = 0 Then
Incr Flag_trockenanzeige
End If
'nach xx Interrupts Blinken
If Flag_trockenanzeige >= 480 Then '4 Minuten
If Trockenlaufsensor = 1 Then
Ic4_ansteuerung = 1
Else
Ic4_ansteuerung = 0
End If
End If
End If
'*** Auswertung Lichtsensor
If Bpw42 = 0 Then
Gosub Tag
If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If
Else
Gosub Nacht
'Starte Nachtmodus
If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If
'IC4-Ansteuerung Auszeit (xx * 500ms)
'10 Minuten ausgeschaltet
If Flag_ic4_ansteuerung <= 1200 Then 'Auszeit = 10 Minuten 1200:2:60= 10 Minuten
Ic4_ansteuerung = 0
'Relais Anzeit (xx * 500ms)
'3 Minuten eingeschaltet
Elseif Flag_ic4_ansteuerung <= 1560 Then 'Anzeit =Auszeit + 4 Minuten = 1200+360 !!!!
Ic4_ansteuerung = 1
'
Else
Flag_ic4_ansteuerung = 0
End If
End If
'Taster wird entprellt und beim Wechsel von 1 auf 0 zur Sub Automatik gesprungen
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If
Loop
End
500ms_interrupt:
Timer1 = 3036
If Flag_trockenanzeige > 0 Then
Incr Flag_trockenanzeige
Toggle Led_trockenlauf
End If
If Flag_trockenanzeige > 0 Then
If Flag_trockenanzeige <= 480 Then
Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
Flag_trockenanzeige = 0
Led_trockenlauf = 0
End If
End If
If Flag_ic4_ansteuerung > 0 Then
Incr Flag_ic4_ansteuerung
End If
'Incr Flag_automatik
If Flag_automatik > 0 Then
Led_automatik = 1
Toggle Led_automatik
End If
If Flag_automatik = 0 Then
Led_automatik = 0
End If
Return
'Sub Tag
Tag:
If Flag_trockenanzeige > 0 Then
Ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
End If
Led_tag = 1
Led_nacht = 0
Return
'Sub Nacht
Nacht:
Led_tag = 0
Led_nacht = 1
Return
'Sub Automatik
Automatik:
Incr Flag_automatik
If Taster_automatik = 0 Then
Flag_automatik = 1
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If
If Geschw_sensor_hoch = 1 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert
Led_auto_geschwindigkeit_hoch = 1
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If
If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 30
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If
If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 0 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 60
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 1
End If
'Abschalten der Automatik
If Taster_automatik = 0 And Flag_automatik > 1 Then
Led_automatik = 0
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 0
Flag_automatik = 0
Geschw_sensor_hoch = 1
Geschw_sensor_mittel = 1
Geschw_sensor_niedrig = 1
Geschwindigkeit = Analogwert
End If
Return
Der größte Teil des Codes funktioniert sehr gut, den gekennzeichneten Bereich bekomme ich nicht gebacken. Und zwar hatte ich Folgendes vor:
Mit dem Taster Ta2, Pin 27, möchte ich eine Art Automatik ein- als auch wieder ausschalten können. Diese Automatik sollte darin bestehen , drei fest vorgegebene Pumpengeschwindigkeiten in Abhängigkeit des Wasserstandes meines Außenfilters zu steuern. Die jeweiligen Wasserstände werden über unterschiedlich lange Edelstahlelektroden erfasst, die an K8, 12, 13, 14 angeschlossen werden. K7 liefert das "Pluspotential". Die Einzelnen Geschwindigkeiten sollen über die LEDs 6, 7, 8 signalisiert werden, wobei die LED 5 den "Automaticbetrieb" blinkend darstellen soll. So sehen jedenfalls meine Wünsche aus, leider noch nicht die Realität. Hat eventuell jemand einen Tipp für mich?
Für Eure Bemühungen bedanke ich mich an dieser Stelle vorab schon einmal!
Schöne Grüße
robin
'Aquarien - Pumpensteuerung
'Aktuellste Version V 2.0
'Steuerung für das Target - Projekt aqua-pu5.t3
'230V Ausgang ist mit PWM-Pumpenansteuerung ausgerüstet
'Signalisierung:Tag - Nachterkennung mit zeitlicher Laufzeitreduzierung
'Trockenlaufschutz mittels externer Elektrode, Maximal - Geschwindigkeitsregulierung über Poti
'über Poti und 3 Sensoren in Abhängigkeit des Wasserstandes in der Pumpenkammer eines Außenfilters
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100
'BPW42 - Tag-Nacht-Erkennung
'Pullup ausgeschaltet D.2=0 Tag, D.2=1 Nacht
Config Portd.2 = Input
Pind.2 = 0
Bpw42 Alias Pind.2
'Ic4 Ansteuerung mit PWM
Config Portb.1 = Output
Ic4_ansteuerung Alias Portb.1
'Einschaltzeit IC4
Config Portb.3 = Output
Ic4_ansteuerzeit Alias Portb.3
'LED für Trockenlauf
Config Portb.0 = Output
Led_trockenlauf Alias Portb.0
'LED für Tagbetrieb
Config Portb.2 = Output
Led_tag Alias Portb.2
'LED für Nachtbetrieb
Config Portd.7 = Output
Led_nacht Alias Portd.7
'Trockenlaufsensor
' Pullup ausgeschaltet D.3=0 Trockenlauf. D.3=1 Normalbetrieb
Config Portd.3 = Input
Pind.3 = 0
Trockenlaufsensor Alias Pind.3
'Automatikgeschwindigkeit ein - aus
Config Portd.6 = Output
Led_automatik Alias Portd.6
'höchster Geschwindigkeitswert, der mit Poti eingestellt worden ist
Config Portd.5 = Output
Led_auto_geschwindigkeit_hoch Alias Portd.5
'höchster Geschwindigkeitswert -30
Config Portb.4 = Output
Led_auto_geschwindigkeit_mittel Alias Portb.4
'höchster Geschwindigkeitswert - 60
Config Portb.5 = Output
Led_auto_geschwindigkeit_niedrig Alias Portb.5
'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config Portc.4 = Input
Pinc.4 = 0
Taster_automatik Alias Portc.4
'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert
Config Portd.4 = Input
Pind.4 = 0
Geschw_sensor_hoch Alias Pind.4
Config Portd.1 = Input
Pind.1 = 0
Geschw_sensor_mittel Alias Pind.1
Config Portd.0 = Input
Pind.0 = 0
Geschw_sensor_niedrig Alias Pind.0
'Debounce auf 50 ms festlegen
Config Debounce = 50
'A/D-Wandler wir konfiguriert
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'Tmer 1 wird konfiguriert
Config Timer1 = Timer , Prescale = 8
On Timer1 500ms_interrupt
Timer1 = 3036
Enable Timer1
Enable Interrupts
'PWM wird Konfiguriert
Config Timer2 = Pwm , Prescale = 1 , Compare = Clear
Enable Timer2
Timer2 = 0
Start Timer2
'Variable des PWM-Wertes wird auf 16 bit festgelegt
Dim Analogwert As Word
'Flag für OC2
Dim Flag_ic4_ansteuerung As Word
Flag_ic4_ansteuerung = 0
'Flag für Trockenlauf
Dim Flag_trockenanzeige As Word
Flag_trockenanzeige = 0
'Flag für Automatikprogramm
Dim Flag_automatik As Byte
Flag_automatik = 0
Dim Geschwindigkeit As Byte
'*********** MAINLOOP *************
Do
'Bei Tasterwechsel 1 auf Null soll Subroutine Automatic angesprungen werden
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
End If
'PWM
'Analogwert wird in 10-bit-Länge digitalisiert, Kanal 1 wird festgelegt
'die anderen Pins des Port C sind frei verfügbar
Analogwert = Getadc(1)
'Anpassung der 10-bit des ADC auf byte-Größe des Timer 2
Analogwert = Analogwert / 4
'Höchstmöglicher Analogwert
If Analogwert > 255 Then
Analogwert = 255
Else
'Ansonsten eingestellter Wert zwischen 0 und 255
Ocr2 = Analogwert
End If
'*** Auswertung Trockenlaufsensor
If Trockenlaufsensor = 0 Then
Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0
Flag_trockenanzeige = 0
'Anzeige Trockenlauf bereits gestartet?
If Flag_trockenanzeige = 0 Then
Incr Flag_trockenanzeige
End If
'nach xx Interrupts Blinken
If Flag_trockenanzeige >= 480 Then '4 Minuten
If Trockenlaufsensor = 1 Then
Ic4_ansteuerung = 1
Else
Ic4_ansteuerung = 0
End If
End If
End If
'*** Auswertung Lichtsensor
If Bpw42 = 0 Then
Gosub Tag
If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If
Else
Gosub Nacht
'Starte Nachtmodus
If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If
'IC4-Ansteuerung Auszeit (xx * 500ms)
'10 Minuten ausgeschaltet
If Flag_ic4_ansteuerung <= 1200 Then 'Auszeit = 10 Minuten 1200:2:60= 10 Minuten
Ic4_ansteuerung = 0
'Relais Anzeit (xx * 500ms)
'3 Minuten eingeschaltet
Elseif Flag_ic4_ansteuerung <= 1560 Then 'Anzeit =Auszeit + 4 Minuten = 1200+360 !!!!
Ic4_ansteuerung = 1
'
Else
Flag_ic4_ansteuerung = 0
End If
End If
'Taster wird entprellt und beim Wechsel von 1 auf 0 zur Sub Automatik gesprungen
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If
Loop
End
500ms_interrupt:
Timer1 = 3036
If Flag_trockenanzeige > 0 Then
Incr Flag_trockenanzeige
Toggle Led_trockenlauf
End If
If Flag_trockenanzeige > 0 Then
If Flag_trockenanzeige <= 480 Then
Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
Flag_trockenanzeige = 0
Led_trockenlauf = 0
End If
End If
If Flag_ic4_ansteuerung > 0 Then
Incr Flag_ic4_ansteuerung
End If
'Incr Flag_automatik
If Flag_automatik > 0 Then
Led_automatik = 1
Toggle Led_automatik
End If
If Flag_automatik = 0 Then
Led_automatik = 0
End If
Return
'Sub Tag
Tag:
If Flag_trockenanzeige > 0 Then
Ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
End If
Led_tag = 1
Led_nacht = 0
Return
'Sub Nacht
Nacht:
Led_tag = 0
Led_nacht = 1
Return
'Sub Automatik
Automatik:
Incr Flag_automatik
If Taster_automatik = 0 Then
Flag_automatik = 1
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If
If Geschw_sensor_hoch = 1 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert
Led_auto_geschwindigkeit_hoch = 1
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If
If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 30
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If
If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 0 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 60
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 1
End If
'Abschalten der Automatik
If Taster_automatik = 0 And Flag_automatik > 1 Then
Led_automatik = 0
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 0
Flag_automatik = 0
Geschw_sensor_hoch = 1
Geschw_sensor_mittel = 1
Geschw_sensor_niedrig = 1
Geschwindigkeit = Analogwert
End If
Return
Der größte Teil des Codes funktioniert sehr gut, den gekennzeichneten Bereich bekomme ich nicht gebacken. Und zwar hatte ich Folgendes vor:
Mit dem Taster Ta2, Pin 27, möchte ich eine Art Automatik ein- als auch wieder ausschalten können. Diese Automatik sollte darin bestehen , drei fest vorgegebene Pumpengeschwindigkeiten in Abhängigkeit des Wasserstandes meines Außenfilters zu steuern. Die jeweiligen Wasserstände werden über unterschiedlich lange Edelstahlelektroden erfasst, die an K8, 12, 13, 14 angeschlossen werden. K7 liefert das "Pluspotential". Die Einzelnen Geschwindigkeiten sollen über die LEDs 6, 7, 8 signalisiert werden, wobei die LED 5 den "Automaticbetrieb" blinkend darstellen soll. So sehen jedenfalls meine Wünsche aus, leider noch nicht die Realität. Hat eventuell jemand einen Tipp für mich?
Für Eure Bemühungen bedanke ich mich an dieser Stelle vorab schon einmal!
Schöne Grüße
robin