Kleine Code-Bereinigung ...
Hallo,
ich hab mal ne kleine Code-Bereinigung durchgeführt.
also Einzüge aufeinander abgestimmt, Subs besser ersichtlich gemacht, ...
Hier als Download ...
Anhang anzeigen spa-temp-licht-mittel_dino.bas
und nochmal als Code ...
CodeBox BASCOM
'Mega8 intern 1Mhz
'KTY81-120 Temperaturfühler
$regfile = "M8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 30
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' LCD-Sonderzeichen
Const Zeitkonstante = 1200 ' zeitkonstante für Spannung
Const Zeitkonstante2 = 30 ' zeitkonstante für Licht
Const Adc_multi = 0.004887585533
Const Refer = 1.2080 'mit PT 81-210 1.9750 mit PT81-110 '1.2080 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc ' interen 5V
Cursor Off
Dim Ready As Bit
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 Pump_std_ein As Byte , Pump_min_ein As Byte
Dim Pump_std_aus As Byte , Pump_min_aus As Byte
Dim Zeit_uhr As Single
Dim Volt As Single
Dim Licht As Single
Dim Spannung As Single
Dim W0 As Word
Dim W1 As Word
Dim W2 As Word
Dim Wartezeit As Single
Dim Wartezeit2 As Single
Dim Zielzeit As Word
Dim Zielzeit2 As Word
Dim Minuten As Word
Dim Ueberspannung As Byte
Dim Unterspannung As Byte
Dim Ueberbelichtung As Byte
Dim Unterbelichtung As Byte
Mittelwert = 0
Ueberspannung = 0
Unterspannung = 0
Ueberbelichtung = 0
Unterbelichtung = 0
Config Portd = Output
Config Portb.1 = Output
Config Portb.2 = Output
Portd.0 = 1 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.1 = 1 'Taster2, Zahl hochzählen, PullUp ein, schaltet gegen Minus
Ddrc.0 = 0 'AD Eingang für Mess
Ddrc.1 = 0 'AD Eingang für Temp
Ddrc.2 = 0 'AD Eingang für Licht
Ddrb.1 = 1 'Ausgang für Solar Pumpe.
Ddrb.2 = 1 'Ausgang für 230V Pumpe.
Relais_1 Alias Portb.1 'Relais für 12V pumpe
Relais_2 Alias Portb.2 'Relais für 230V pumpe
Tast1 Alias Pind.0 'Taster1
Tast2 Alias Pind.1 'Taster2
Config Timer1 = Timer , Prescale = 256 '256
Const Timerwert = 34286 '59391 31250 34286 65535
On Timer1 Timer1_sprung
Enable Timer1
Enable Interrupts
Timer1 = Timerwert
Config Clock = Soft ', Gosub = Sectic
Config Date = Dmy , Separator = .
Readeeprom Pump_std_ein , 2
Readeeprom Pump_min_ein , 3
Readeeprom Pump_std_aus , 4
Readeeprom Pump_min_aus , 5
Time$ = "03:04:00"
Start Adc
Do '##### Anfang der Hauptschleife #####
Locate 2 , 1
Lcd Time$
If Tast1 = 0 Then Gosub Time '##### Sprung in Subroutine -Time/Analog- #####
Gosub Relaissteuerung '##### Sprung in Subroutine -Relaissteuerung- #####
W0 = Getadc(0) ' auslesen der Spann ADC0
W1 = Getadc(1) ' auslesen des Temp ADC1
W2 = Getadc(2) ' auslesen des Licht ADC2
If Ready = 1 Then Gosub Analog '##### Sprung in Subroutine -Time/Analog- #####
Volt = W0 * Adc_multi '5/1023 = 0.0048 Volt 10 Bit AD converter
Volt = Volt * 2.73 'bei 16V=3.205 -- 15,5 V teiler 3.069 -- 14,5 =2.911
Volt = W0 * 0.014298
Licht = W2
If _hour = Pump_std_ein And _min = Pump_min_ein Then 'Einschaltzeiten
Zeit_uhr = 1
Relais_2 = 1
End If
If _hour = Pump_std_aus And _min = Pump_min_aus Then 'Ausschaltzeiten
Zeit_uhr = 0
Relais_2 = 0
End If
'LCD ANZEIGE ###################################################################
Locate 1 , 1
Lcd "Volt= " ; Fusing(volt , "##.#")
Waitms 100
'anzeige nur um zu sehen was Timer macht
Locate 2 , 10
Lcd Zielzeit
Locate 2 , 15
Lcd Zielzeit2
Locate 2 , 18
Lcd W2
Loop '##### Ende der Hauptschleife #####
End
'Stunde#########################################################################
Time: '##### Einsprungpunkt der Subroutine -Time/Analog- #####
Waitms 200
Cls 'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:" 'Stunden setzen
Locate 2 , 1
Lcd _hour
If Tast2 = 0 Then 'Mit Taster 2
Incr _hour 'hochzählen
Locate 2 , 1
Lcd _hour
Waitms 100
End If
If _hour > 23 Then
Cls
_hour = 00
End If 'solange, bis Taster 1 gedrückt
Loop Until Tast1 = 0
Waitms 200
'Minute#########################################################################
Cls
Do
Locate 1 , 1
Lcd "Set Minute:"
Locate 2 , 1
Lcd _min
If Tast2 = 0 Then
Incr _min
Locate 2 , 1
Lcd _min
Waitms 100
End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls
'Pumpe Stunden ein##############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Std ein:"
Locate 2 , 1
Lcd Pump_std_ein
If Tast2 = 0 Then
Incr Pump_std_ein
Locate 2 , 1
Lcd Pump_std_ein
Writeeeprom Pump_std_ein , 2
Waitms 100
End If
If Pump_std_ein > 23 Then
Cls
Pump_std_ein = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls
'Pumpe Min ein###################################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Min ein :"
Locate 2 , 1
Lcd Pump_min_ein
If Tast2 = 0 Then
Incr Pump_min_ein
Locate 2 , 1
Lcd Pump_min_ein
Writeeeprom Pump_min_ein , 3
Waitms 100
End If
If Pump_min_ein > 59 Then
Cls
Pump_min_ein = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls
'Pumpe Stunden Aus###############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Std aus:"
Locate 2 , 1
Lcd Pump_std_aus
If Tast2 = 0 Then
Incr Pump_std_aus
Locate 2 , 1
Lcd Pump_std_aus
Writeeeprom Pump_std_aus , 4
Waitms 100
End If
If Pump_std_aus > 23 Then
Cls
Pump_std_aus = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls
'Pumpe Minuten Aus###############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Min aus:"
Locate 2 , 1
Lcd Pump_min_aus
If Tast2 = 0 Then
Incr Pump_min_aus
Locate 2 , 1
Lcd Pump_min_aus
Writeeeprom Pump_min_aus , 5
Waitms 100
End If
If Pump_min_aus > 59 Then
Cls
Pump_min_aus = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls
'Temperatur ####################################################################
Analog: '##### Einsprungpunkt in Subroutine ##### <=========================
Reset Ready
Incr Index
Value(index) = Getadc(1) 'in unserem Falle verwenden wir 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
Locate 1 , 14
Lcd Fusing(v , "#.#") ; Chr(0) ; "C" ' ANZEIGE am LCD= Temperatur
End If
Return '##### Ende der Subroutine -Time- und -Analog- #####
'Solar Relais Steuerung ########################################################
Relaissteuerung:
If Zielzeit > Zeitkonstante Then
Zielzeit = Zeitkonstante - 1
'End If '##### <================
Else
' Spannung berechnen
' Zunächst Prüfen ob Spannung auf Unterspannung ist
If Volt < 11.0 Then
' Ja, wir haben Unterspannung, dann Relais ausschalten
' Relais können aber sofort umschalten
Unterspannung = 1
Ueberspannung = 0
Spannung = 0
Zielzeit = 0
Else
' NEIN, wir haben keine Unterspannung, also weiter prüfen
' Prüfen ob Überspannung vorhanden
If Volt > 12.8 Then
' JA, wir haben Überspannung
' Beim Übergang von Überspannung auf Unterspannung soll Zähler zurückgesetzt werden
If Unterspannung = 1 And Ueberspannung = 0 Then
Zielzeit = 0
End If
Ueberspannung = 1
Unterspannung = 0
' Prüfen ob Zeitpunkt für Relaisschaltung erreiche
'Zeitkonstante = sekunden
If Zielzeit = Zeitkonstante Then
' JA, also Relais schalten
Spannung = 1 ' sachaltet Relais
End If
Else
' Nein, wir haben keine Überspannung, aber auch keine Unterspannung
Unterspannung = 0
Ueberspannung = 0
End If
End If
End If
'Licht überwachung #############################################################
If Spannung = 0 Or Zeit_uhr = 0 Then
Relais_1 = 0
If Zielzeit2 > Zeitkonstante2 Then
Zielzeit2 = Zeitkonstante2 - 5
End If
Else
' Zunächst Prüfen ob Spannung auf Unterbelichtung ist
If Licht < 890 Then
' Ja, wir haben Unterbelichtung, dann Relais ausschalten
' Relais können aber sofort umschalten
Unterbelichtung = 1
Ueberbelichtung = 0
Relais_1 = 0
Zielzeit2 = 0
Else
' NEIN, wir haben keine Unterbelichtung, also weiter prüfen
' Prüfen ob Ueberbelichtung vorhanden
If Licht > 900 Then
' JA, wir haben Ueberbelichtung
' Beim Übergang von Ueberbelichtung auf Unterbelichtung soll Zähler zurückgesetzt werden
If Unterbelichtung = 1 And Ueberbelichtung = 0 Then
Zielzeit2 = 0
End If
Ueberbelichtung = 1
Unterbelichtung = 0
' Prüfen ob Zeitpunkt für Relaisschaltung erreicht ist
If Zielzeit2 = Zeitkonstante2 Then '#####And Zeit_uhr = 1 Then
' JA, also Relais schalten
Relais_1 = 1
Zielzeit2 = 0
End If
Else
Unterbelichtung = 0
Ueberbelichtung = 0
End If
End If
End If
Return '##### Ende der Subroutine -Relaissteuerung- #####
'Timer #########################################################################
Timer1_sprung:
Incr Zeit_zaehler ' Jede Sekunde um +1
' Zielzeit soll nur erhöht werden wenn auch Überspannung existiert
' Damit stelle ich sicher, dass die Zeit nur zählt, wenn auch wirklich Leistung ankommt
' Auf diese weise hält er an, wenn man zwischen Unterspannung und Ueberspannung ist,
' zählt aber weiter wenn man wieder auf Überspannung kommt.
If Ueberspannung = 1 And Unterspannung = 0 Then
Incr Zielzeit
If Spannung = 1 Then
If Ueberbelichtung = 1 And Unterbelichtung = 0 And Zeit_uhr = 1 Then
Incr Zielzeit2
End If
End If
End If
Timer1 = Timerwert ' Jede Sekundeum +1 Timer 34286
If Zeit_zaehler = 5 Then ' 60 = 1 Min-120 = 2 Min usw.
Set Ready
Zeit_zaehler = 0
End If
Return '##### Ende der Subroutine -Timer1_sprung- #####
und schon mal ein paar Analysen ...
- Die IF/ELSE/ENDIFs scheinen zusammen zu passen.
- genau wie die DO/LOOPs
- Die GOSUB/RETURNs scheinen auch zu passen
Was mir aufgefallen ist ...
- sehr tiefe Verschachtelung von IF-Anweisungen
- Die Sub "Time/Analog" ist nur eine Sub mit 2 Einsprungpunkten
- In der Sub "Time" summieren sich die Wait zu ner ganz schönen Zeit ...
Ich hoffe mal, die Aufarbeitung des Quellcodes hilft etwas weiter
Gruß
Dino