Meine Testversion
Hallo Neuuser,
leider werde ich aus dem letzten von Dir geposteten Test1.bas nicht ganz so schlau. Sprich, ich sitze wie der Ox vor dem Berg und ich schaffe es nicht ganz nachzuvollziehen, was Du Dir wie gedacht hast.
Aus diesem Grund habe ich mir Deine Version vom 23. hergenommen und dort mal das eingebaut, was ich so gemeint habe. Ich erhebe keinen Anspruch darauf, dass es Fehlerfrei ist da mir das Zieltarget fehlt und ich bei meinen Entwicklungen auch manchmal ausprobieren muss bis es funktioniert.
Im Trockendock ohne HW zu implementieren ist immer schwieriger.
So, nun aber ein paar Worte zu dem Code:
CodeBox Bascom
$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 32
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' LCD-Sonderzeichen
Deflcdchar 1 , 32 , 32 , 4 , 2 , 31 , 2 , 4 , 32 ' replace ? with number (0-7)
Const Adc_multi = 0.004887585533
Const Refer = 1.2080 'mit PT 81-210 1.9600 mit PT81-110 '1.2080 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc ' interen 5V
'##Ma##
Dim Ueberwachungsflag As Byte
Dim Verriegelungsflag As Byte
Dim Ueberwachungscounter As Word
Const Zeitfenster = 60 ' zunächst für eine Minute
Ueberwachungsflag = 0 ' inaktiv
Verriegelungsflag = 0 ' inaktiv
Ueberwachungscounter = 0 ' Vorinitialisieren
'##Ma##
Dim V As Single 'AD Eingang für Temp
Dim Mittelwert As Word
Dim Value(5)as Word 'Array für 10 Werte hier kommen die Werte rein
Dim Index As Byte 'Der index ist ein hilfs zähler und ersetzt die zahlen für
Dim Rettedenmittelwert As Word
Dim Zeit_zaehler As Word
Dim Ready As Bit
Dim I As Word , Ii As Byte , A As Word
Dim Au As Byte
Dim Aus As Single
Dim Ein As Single
Dim Umsch_aus As Single
Dim Umsch_an As Single
Dim Vorkomma As Byte
Dim Nachkomma As Byte
Dim Volt_chk As Single
Dim W0 As Word
Dim W2 As Word
Dim Volt As Single
Config Portb = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portd.0 = Input
Config Portd.1 = Input
Config Debounce = 50
Tast1 Alias Pind.0 'Taster1
Tast2 Alias Pind.1 'Taster2
Gruen Alias Portd.2 'Diode grün an
Rot Alias Portd.3 'Diode rot aus
Relais1 Alias Portd.6 'Relais für Netz
Relais2 Alias Portd.7 'Relais für Umformer
Irf Alias Portd.4 'irf schaltung für ladegerät, umformer usw.
Licht_an Alias Portd.5 'licht
Ddrc.0 = 0 'AD Eingang für Mess
Ddrc.1 = 0 'AD Eingang für Temp
Portd.0 = 1 'Taster1, schaltet gegen Minus
Portd.1 = 1 'Taster2
Portd.2 = 0 'Diode grün
Portd.3 = 0 'Diode rot
Portd.4 = 0 'IRF schalter
Portd.5 = 0 'licht
Portd.6 = 0 'Relais1
Portd.7 = 0 'Relais2
Config Timer1 = Timer , Prescale = 256 '256
Const Timerwert = 34286 '59391 31250 34286 65535
On Timer1 Timer1_sprung
Enable Timer1
Enable Interrupts
Timer1 = Timerwert
I = 0
A = 0
Mittelwert = 0
Locate 1 , 1
Lcd "Solarumschalter "
Locate 2 , 1
Lcd "Version V1.0"
Waitms 2000
Cls
Umsch_aus = 1
Do
Start Adc
W0 = Getadc(0) ' auslesen des Span ADC0
'W1 = Getadc(1) ' auslesen des Temp ADC1
'W2 = Getadc(2)
If Tast2 = 0 Then
Licht_an = 1
A = 0
End If
Volt = W0 * Adc_multi '5/1023 = 2.73 Volt 10 Bit AD converter
Volt = Volt * 2.911
If Ready = 1 Then Gosub Analog
'If Tast1 = 0 Then Gosub Schritt1 'Taster 1 zum Stellen der
Debounce Tast1 , 0 , Schritt1 , Sub
'Volt_chk = Volt * 10
If Volt_chk > Aus And Umsch_aus = 1 Then Gosub Schritt2
If Volt_chk < Ein And Umsch_aus = 1 Then Gosub Schritt3
If Aus < 115 Then Aus = 125
If Ein < 110 Then Ein = 110
If Umsch_aus = 0 Then 'schaltet komplett aus wen in menue auf 0 gesetzt
Relais1 = 0
Relais2 = 0
End If
'------- LCD ANZEIGE------------------------------------------------------------
Locate 1 , 1
Lcd "Volt " ; Fusing(volt , "##.#")
Waitms 100
Volt_chk = Volt * 10
If Volt_chk < Ein Then
Locate 2 , 1
Lcd "Accu Leer"
Elseif Volt_chk > Aus Then
Locate 2 , 1
Lcd "Accu Voll"
End If
If Umsch_aus = 0 Then
Locate 2 , 13
Lcd ; Chr(1) ; "AUS"
End If
Loop
Stop Adc
End
'-------------------------------------------------------------------------------
Schritt1:
Waitms 100
Cls
Do
Locate 1 , 1
Lcd "ACCU Ueberspann:" 'Stunden setzen
Locate 2 , 8
Au = Int(aus)
Vorkomma = Aus / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma
'lösche Zeilen
If Tast2 = 0 Then
Incr Aus
If Aus > 145 Then Aus = 125
Waitms 100
Au = Int(aus)
Vorkomma = Aus / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma
End If
Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt
Waitms 200
Cls
Locate 1 , 1
Lcd "ACCU Unterspann:" 'Stunden setzen
Locate 2 , 8
Au = Int(ein)
Vorkomma = Ein / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma 'lösche Zeilen
Do
If Tast2 = 0 Then
Incr Ein 'Mit Taster 2
If Ein > 145 Then Ein = 110
Au = Int(ein)
Vorkomma = Ein / 10
Nachkomma = Au Mod 10
Waitms 100
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma
End If
Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Umsch 0-AUS 1-AN"
Locate 2 , 8
Lcd Umsch_aus
If Tast2 = 0 Then
Incr Umsch_aus
If Umsch_aus > 1 Then Umsch_aus = 0
Locate 2 , 8
Lcd Fusing(umsch_aus , "#.")
Waitms 200
End If
Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt
Waitms 200
Cls
'-------------------------------------------------------------------------------
Schritt2:
Volt_chk = Volt * 10
If Volt_chk > Aus And Volt_chk > Ein Then ' wen die abschalt volt erreischt ist
'##Ma##
' hier muss Du auch noch prüfen ob die verriegelung aktiv ist oder nicht
' wenn Verriegelung aktiv darfst du nicht einschaltne
If Verriegelungsflag = 0 Then
Irf = 0
Waitms 200 ' sachaltet Relais 1 u.2 mit zeitverzögerung ein
Relais1 = 1
Waitms 200
Relais2 = 1
' Zur Sicherheit Verriegelung hier bereits aktiv, somit wird Relais nur einmal angefahren
Verriegelungsflag = 1
End If
Elseif Volt_chk < Ein Then ' an sonsten an
Schritt3:
Relais2 = 0 ' sachaltet Relais 1 u.2 mit zeitverzögerung aus
Waitms 200
Relais1 = 0
Waitms 200
Irf = 1
'##Ma##
' nachdem Du ja nicht sofort wieder einschalten möchtest wenn du ausgeschaltet hast
' würde ich hier die Überwachung starten
Ueberwachungsflag = 1
Ueberwachungscounter = Zeit_zaehler + Zeitfenster
End If
If Relais1 = 1 Then
Gruen = 1
Rot = 0
Elseif Relais1 = 0 Then
Gruen = 0
Rot = 1
End If
Return
'-------------------------------------------------------------------------------
Analog:
Reset Ready
Incr Index
Value(index) = Getadc(1) ' AD-Eingang 1
If Index = 5 Then 'erkennen wann das Array voll ist
For Index = 1 To 5
Mittelwert = Value(index) + Mittelwert 'Die For next schleife zählt alle 5 werte zusammen
Next
Mittelwert = Mittelwert / 5 'Hier werden alle wert durch 5 geteilt.
Rettedenmittelwert = Mittelwert
Index = 0
Mittelwert = 0
V = Rettedenmittelwert * 0.004887585533
V = V - Refer
V = V / 0.0077125
V = V + 2
If V > 100 Then
Locate 1 , 11
Lcd "noTemp"
Else
Locate 1 , 11
Lcd Fusing(v , "#.#") ; Chr(0) ; "C" ' ANZEIGE am LCD= Temperatur
End If
End If
Return
'-------------------------------------------------------------------------------
Timer1_sprung:
Timer1 = 34286 'Dieser Wert bestimmt die Sample Frequenz
Incr Zeit_zaehler ' Jede Sekunde um +1
Incr I
Incr A
Timer1 = Timerwert ' Jede Sekunde um +1
If Zeit_zaehler = 5 Then 'Dieser Wert bestimmt die Sample Frequenz
Set Ready ' 60 = 1 Min -120 = 2 Min usw.
Zeit_zaehler = 0
End If
'##Ma##
' prüfen ob Überwachung aktiv und ob Zaheler abgelaufen
If Ueberwachungsflag = 1 Then
' Ja, Ueberwachung aktiv
' Prüfen ob Zaehler abgelaufen
If Zeit_zaehler = Ueberwachungscounter Then
' JA
Ueberwachungsflag = 0
Verriegelungsflag = 0
End If
End If
'(If I = 30 Then '3600= 1 Stunde in sec.
Incr Ii
I = 0
End If
If Ii = 1 Then = 0 '24 =1 Tag in Stunden 96= 4 tage
')
If A = 30 Then
Licht_an = 0 'Licht in sekunden
A = 0
End If
Return
Ich habe entsprechende Verriegelungsflags und Zeitüberwachungen eingebaut. Habe aber zunächst auf eine Gosubg-Routine in Do-LOOP verzichtet sondern mache die entsprechenden Abprüfungen in der Timer-Routine.
Alle meine Änderungen habe ich mit ##Ma## gekennzeichnet damit Du die Stellen im Code besser sehen kannst.
Was habe ich überhaupt getan:
- Ich habe entsprechende Arbeitsvariablen eingebaut
- In der Routine Schritt2 und Schritt3 habe ich an den Stellen die für das Einschalten / Ausschalten relevant sind die Verriegelunge und Überwachungen eingebaut.
- Beim Einschalten wird eine Verriegelung gegen erneutes Einschalten gesetzt. Ausserdem wird geprüft ob überhaupt erneu eingeschaltet werden darf.
- Beim Ausschalten setzte ich die Zeitüberwachung die aktuell mit einer Minute defineirt ist. Erst danach wird in der Timer-Routine die Verriegelung wieder freigegeben und man kann die Relais erneut einschalten.
Ich hoffe, dass Du damit eine Vorlage erhältst welche dem Entspricht was Du Dir vorgestellt hast. Und ich hoffe, das es auch funktioniert da ich selbst es nicht testen kann.
Grüße,
Markus