$regfile = "m8def.dat"
$crystal = 8000000 ' Interner Takt - kein Quarz....
$hwstack = 32
$swstack = 32
$framesize = 32
'------------------------------------------------------------------------------------------------------------------------
Ddrb = 195
Ddrc = 32
Ddrd = 251
Portc = 16
Portd = 4
Portb = 0
'------------------------------------------------------------------------------------------------------------------------
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Menue_isr Saveall ' SAVEALL da ich noch nicht genau weiss wo die Reise hingeht....
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim W(4) As Word ' Variable fuer die ADC-Werte
Dim V(3) As Single ' Variable fuer die Spannungen der einzelnen Phasen
Dim Zw As Single ' Variable fuer Zwischenwerte
Dim Cnt As Byte ' Variable fuer Zaehler
Dim Avg(3) As Dword ' Variable fuer die Durchschnittswerte des ADC's
Dim P As Byte ' Variable fuer Phasen-Zaehler
Dim Ve As Byte ' Variable fuer Spannungsfehler-Zaehler
Dim Vemax As Byte ' Variable fuer max. Spannungsfehler
Dim T As Byte ' Variable Schleife um Durchschnittswert zu ermitteln
Dim Tt As Byte
Dim Pm As Byte ' Variable fuer max. Phasen (1 oder 3)
Dim State As Eram Byte ' Status als EEPROM variable
Dim Menuid As Byte ' Variable um den Inhalt von State aufzunehmen, bzw. uebergeben
Dim Lok As Byte ' Variable fuer alle Phasen OK
Dim Vmax As Single ' Variable fuer maximale Spannung
Dim Vmin As Single ' Variable fuer minimale Spannung
Dim Wz As Word ' Variable fuer Wartezeit-Schleife
'------------------------------------------------------------------------------------------------------------------------
Vmax = 264 ' Maximale Spannung
Vmin = 150 ' Minimale Spannung
Vemax = 5 ' Maximale Anzahl Fehler bis zur Abschaltung
'------------------------------------------------------------------------------------------------------------------------
Open "comd.1:250,8,n,1" For Output As #1 ' Zum Monitoring, Wert etwas abstrakt, da interne Taktquelle...Terminal auf 260!!!
' Alle Print #1 - Anweisungen sind gehoeren zum Monitoring und werden im fertigen Progr. entfernt.
'------------------------------------------------------------------------------------------------------------------------
Menuid = State ' Status aus EEPROM lesen und in Menuid ablegen
If Menuid < 1 Or Menuid > 3 Then ' Wenn die ID nicht innerhalb Parameter - setze ID auf 1
Menuid = 1 ' 1 = Automatic, 2 = Main, 3= GenSet
State = Menuid ' Speichere ID ins EEPROM
End If ' Dies ist um beim ersten Start einen definierten Zustand zu haben
'------------------------------------------------------------------------------------------------------------------------
Phaseselect Alias Pinc.4 ' Jumper J1 auf dem Board
Relais Alias Portc.5 ' Relais fuer Autostart-Option
1pled Alias Portd.0 ' LED zur Signalisierung 1-Phasen Betrieb
3pled Alias Portd.1 ' LED zur Signalisierung 3-Phasen Betrieb
Menu Alias Pind.2 ' Menu-/Wahl-Taster, wird aber eigentlich durch INT0 abgehandelt...evtl. entfernen!
Auto Alias Portd.6 ' LED zur Signalisierung Automatik-Betrieb
Main Alias Portd.7 ' LED zur Signalisierung Main-Input Manual Betrieb
Genset Alias Portb.6 ' LED zur Signalisierung GenSet-Input Manual Betrieb
L1ok Alias Portd.3 ' LED zur Signalisierung Phase 1 (L1) ist OK
L2ok Alias Portd.4 ' LED zur Signalisierung Phase 2 (L2) ist OK
L3ok Alias Portd.5 ' LED zur Signalisierung Phase 3 (L3) ist OK
Online Alias Portb.7 ' LED zur Signalisierung das ADC Sampleing und Auswertung laeuft
Con_main Alias Portb.0 ' Ausgang an Treiber fuer Schuetz "Main"
Con_genset Alias Portb.1 ' Ausgang an Treiber fuer Schuetz "GenSet"
'------------------------------------------------------------------------------------------------------------------------
W(1) = 0 ' Einfach mal alles zu Beginn auf NULL setzen
W(2) = 0 ' Wahrscheinlich uberfluessig, aber Sicher ist Sicher ;-)
W(3) = 0
W(4) = 0 ' W(4) ist fuer den ADC-Wert des Poti fuer die Rueckfallzeit
V(1) = 0
V(2) = 0
V(3) = 0
Avg(1) = 0
Avg(2) = 0
Avg(3) = 0
Ve = 0
Con_genset = 0
Con_main = 0
'------------------------------------------------------------------------------------------------------------------------
Hauptschleife:
Do
If Ve > Vemax Then
Gosub Check_error
End If
Ve = 0 : Tt = Vemax + 1
For T = 1 To Tt
Print #1 , "Error-Counter = " ; Ve
Gosub 1_or_3_phase
If Menuid = 1 Then
Gosub Automatic
End If
If Menuid = 2 Then
Gosub Mainsply
End If
If Menuid = 3 Then
Gosub Gensetsply
End If
Next T
Loop
'------------------------------------------------------------------------------------------------------------------------
Automatic:
Print #1 , "AUTOMATIC"
Gosub Mainsply
Gosub Check_adc
Gosub Check_lok
Return
'------------------------------------------------------------------------------------------------------------------------
Check_lok:
Lok = 0
Cnt = 0
P = 1
Do
Cnt = P + 2
Print #1 , "V(" ; P ; ") = " ; V(p)
If V(p) > Vmin And V(p) < Vmax Then
Incr Lok
Print #1 , "Phase " ; P ; " is OK!, LOK = " ; Lok
Portd.cnt = 1
Else
Print #1 , "Phase " ; P ; " is NOT OK!, LOK = " ; Lok
Portd.cnt = 0
End If
Incr P
Loop Until P > 3
If Lok < Pm Then
Incr Ve
End If
Return
'------------------------------------------------------------------------------------------------------------------------
Check_error:
W(4) = Getadc(0)
Gosub Gensetsply
W(4) = W(4) / 5
Print #1 , "Wartezeit = " ; W(4) ; " Sekunden..."
For Wz = 1 To W(4)
Wait 1
Zw = W(4) - Wz
Print #1 , "Noch " ; Zw ; " Sekunden..."
Next Wz
Still_error:
Print #1 , "Still Error!"
Gosub Check_adc
Ve = 0
Gosub Check_lok
If Ve > 0 Then
Goto Still_error
End If
Gosub Mainsply
Return
'------------------------------------------------------------------------------------------------------------------------
Check_adc:
P = 1
Do
Do
W(p) = Getadc(p)
Loop Until W(p) < 1
Cnt = 0
Do
W(p) = Getadc(p)
Incr Cnt
Loop Until W(p) > 100 Or Cnt > 50
Cnt = 0 : Avg(p) = 0
Do
W(p) = Getadc(p)
Avg(p) = Avg(p) + W(p)
Incr Cnt
Loop Until W(p) < 1
W(p) = Avg(p) / Cnt
Zw = W(p) * 5
V(p) = Zw / 1024
V(p) = V(p) * 100
V(p) = Int(v(p))
Incr P
Loop Until P > 3
Return
'------------------------------------------------------------------------------------------------------------------------
Mainsply:
Print #1 , "Main"
Con_genset = 0
Waitms 250
Con_main = 1
Relais = 0
Return
'------------------------------------------------------------------------------------------------------------------------
Gensetsply:
Print #1 , "GenSet"
Con_main = 0
Relais = 1
Waitms 250
Con_genset = 1
Return
'------------------------------------------------------------------------------------------------------------------------
1_or_3_phase:
Print #1 , "1 or 3 Phase?"
If Phaseselect = 1 Then
Pm = 3
'3pled = 1 ' LED derzeit deaktiviert da SoftUART
'1pled = 0 ' LED derzeit deaktiviert, da SoftUART
End If
If Phaseselect = 0 Then
Pm = 1
'1pled = 1
'3pled = 0
End If
Return
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------
Menue_isr:
Menuid = State
Incr Menuid
If Menuid > 3 Then
Menuid = 1
End If
State = Menuid
If Menuid = 1 Then
Auto = 1
Main = 0
Genset = 0
End If
If Menuid = 2 Then
Auto = 0
Main = 1
Genset = 0
End If
If Menuid = 3 Then
Auto = 0
Main = 0
Genset = 1
End If
Print #1 , "Menuid = " ; Menuid
Return
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------