3-Phasen Messschaltung

Hallo Klaus!

Man sieht, dass du nicht aufgegeben hast. :cool:

Das Programm hast du aber auch nicht mal eben zusammen geschrieben, oder?
Auf alle Fälle benötigt man dafür schon einiges an Zeit, um sich da rein zu denken.
Von daher erwarte bitte keine Wunder, dass ein Anderer "mal eben schnell" den Wald vor lauter Bäumen findet, den du suchst. :wink:


Grüße,
Cassio
 
Hallo Klaus!

Vielleicht habe ich den "Wald" ja schon gefunden den du suchst.....

In deiner Hauptarbeitsschleife steht:
Code:
If Ve > Vemax Then
Gosub Check_error
End If

[B][COLOR="#FF0000"]Ve = 0[/COLOR][/B] : Tt = Vemax + 1

For T = 1 To Tt
Print #1 , "Error-Counter = " ; Ve
Gosub 1_or_3_phase
.
.
.


Damit wird die Variable "Ve" doch bei jedem Schleifendurchlauf immer wieder auf NULL gesetzt!
Soll das denn so sein? :hmmmm:


Grüße,
Cassio
 
Hallo Klaus,

das erste was mir aufgefallen ist ... Boah ist das nen Spaghetti-Code. Ohne Einrückungen und kaum ersichtlich was irgendwo in Schleifen oder IFs drinsteckt. :p

Code:
$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                                                     '[COLOR="#FF0000"]<<<< DAS MACHT MAN NICHT SCHON DA VORNE!![/COLOR]
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

'------------------------------------------------------------------------------------------------------------------------

' [COLOR="#FF0000"]##### DEFINITIONEN GANZ AN DEN ANFANG!![/COLOR]
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          ' [COLOR="#FF0000"]<<<< WAS SOLL DAS VE=0 DA??[/COLOR]

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

'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------
Ich habs mal etwas strukturiert. Da sieht man ja den Wald vor Bäumen nicht :p :rolleyes:

EDIT: Da hat Cassio schneller geschrieben ;)
Tip: Nur einen Befehl pro Zeile. Sonst wird es absolut unübersichtlich.

Gruß
Dino
 
So viele Baeume und doch kein Wald

Hallo Cassio, hallo Dino,

ersteinmal vielen Dank fuer eure schnelle Reaktion.
Dino, ich werde Deinen Rat bezueglich Strukturierung versuchen zu beherzigen.
Ich hatte ja bereits angefangen alles zu Kommentieren...:rolleyes:

Was Ve=0 in der Do-Loop Schleife angeht, so hat das seinen Sinn...
Innerhalb der Do-Loop ist ja noch die For-Next Schleife...die legt im Prinzip den Zeitrahmen fest in dem Ve hochgezaehlt wird.
Wenn ich Ve einfach immer nur hochzaehle und bei ueberschreiten von Vemax in die Fehlerbehandlung springe kann es sein, dass
nach x-Tagen der Generator startet obwohl kein Blackout da ist. In diesem Fall wuerde ich einzelne Fehler (Kurze Hicks oder auch
Messfehler) solange sammeln bis Vemax ueberschritten wird. Daher muss ich in einem festen Zeitrahmen (hier Vemax + 1) die
Variable Ve wieder auf 0 setzen.
Ich habe mich wahrscheinlich aber auch nicht richtig ausgedrueckt.....
Ve wird ja nicht immer auf 0 gesetzt...zu 90% laeuft es ja durch, nur je hoeher ich Vemax setze, desto haeufiger, dass Ve = 0 wird ohne
das die For-Next Schleife verlassen wird.....also die Zeile Ve=0 wird garnicht angesprungen...einen Reset macht der µC auch nicht.....
alles laeuft weiter, nur Ve verliert ihren Wert, bzw. geht auf 0......

Was das Proggi angeht, so hat Cassio irgendwie recht. Das Proggi hier ist zwar innerhalb von ca. 6h entstanden aber viele Versuche mit kurzen Routinen
um das Sampleing hinzubekommen hatte ich schon in den Tagen davor:eek:....

Ich werde heute Nachmittag mal ein wenig Strucktur rein bringen und zu ende Kommentieren....
Auch werde ich den Schaltplan mal dem "Steckbrett" anpassen und neu posten.

Zur vorab-Info:
An den Eingaengen der ADC sind eine Diode (um die positive Halbwelle rauszufiltern) und ein Spannungsteiler 100:1 vorgeschaltet.....Funktioniert soweit ganz gut....
Die Null erkennung mache ich in der Routine Getzero....dort wird solange der ADC ausgelesen bis der Wert kleiner 1 (also 0) ist...wenn ich =0 mache funktioniert es nicht - warum auch immer....
Danach warte ich in der Routine Getpositiv bis der ADC-Wert > 100 ist (entspricht 0,488V)....oder der Zaehler CNT > 100 ist.(um zu vermeiden, dass bei Stromausfall das ganze hier festhaengt)
Dann in Sample wird solange der ADC ausgelesen und aufaddiert bist der ADC-Wert wieder < 1 ist (Null durchgang und negative Halbwelle).....danach wird der Mittelwert ermittelt und die Spannung berechnet....




LG aus Addis


Klaus
 
Hier mal der "sauberererererererere" Code

Ich fuege hier noch einmal den Code ein, nach dem ich einige Sachen eingerueckt und bereinigt habe....
Auch habe ich mal "Zu ENDE" Kommentiert...

Jetzt mache ich mich mal an den neuen Schaltplan, spaeter dann Layout und Bilder vom abgebrannten Haus:rolleyes:

Code:
$regfile = "m8def.dat"
$crystal = 8000000                                                    ' Interner Takt - kein Quarz....
$hwstack = 32
$swstack = 32
$framesize = 32
'------------------------------------------------------------------------------------------------------------------------
Ddrb = 195                                                            ' 11000011
Ddrc = 32                                                             ' 00100000
Ddrd = 251                                                            ' 11111011
Portc = 16                                                            ' 00010000
Portd = 4                                                             ' 00000100
Portb = 0                                                             ' 00000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc             ' ADC auf standard Einstellungen...steht hier, da er weiter unten meckert!!!!
'------------------------------------------------------------------------------------------------------------------------
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"
'------------------------------------------------------------------------------------------------------------------------
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
Config Int0 = Falling                                                 ' Interrupt detect auf fallende Flanke setzen
Enable Interrupts
Enable Int0
On Int0 Menue_isr Saveall                                             ' SAVEALL da ich noch nicht genau weiss wo die Reise hingeht....
'------------------------------------------------------------------------------------------------------------------------
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
'------------------------------------------------------------------------------------------------------------------------
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                                                   ' Fehler-Zaehler auswerten
  Gosub Check_error                                                   ' Wenn Ve > Vemax dann Check_error
 End If
 Ve = 0                                                               ' Ve wieder auf Null setzen! Wir in der For-Next Schleife bei Fehler hochgezaehlt!
 Tt = Vemax + 1                                                       ' Tt is max. Schleifendurchgaenge
 For T = 1 To Tt                                                      ' Schleife, die die max. "Zeitbasis" fuer Vemax darstellt
  Print #1 , "Error-Counter = " ; Ve
  Gosub 1_or_3_phase                                                  ' Ueberpruefen ob es sich um ein 1- oder 3-Phasen System handelt...
  If Menuid = 1 Then                                                  ' Wenn Automatik-Mode - gehe zu Automatik
   Gosub Automatic
  End If
  If Menuid = 2 Then                                                  ' Wenn Manual Main-Mode - gehe zu Mainsply
   Gosub Mainsply
  End If
  If Menuid = 3 Then                                                  ' Wenn Manual GenSet-Mode - gehe zu Gensetsply
   Gosub Gensetsply
  End If
 Next T                                                               ' "Zeitbasis" Schleife
Loop                                                                  ' Hauptschleife
'------------------------------------------------------------------------------------------------------------------------
Automatic:                                                            ' Automatic Mode
Print #1 , "AUTOMATIC"
Gosub Mainsply                                                        ' Sicherstellen, dass Mainsply gewaehlt ist und entspr. Schuetz ON
Gosub Check_adc                                                       ' Werte vom ADC holen
Gosub Check_lok                                                       ' Pruefen ob die Spannungen OK sind...
Return
'------------------------------------------------------------------------------------------------------------------------
Check_lok:                                                            ' Pruefen ob die Spannungen der einzelnen Phasen OK sind
Lok = 0                                                               ' Phasen OK Zaehler auf 0, wird fuer jede Phase wenn OK um eins erhoeht
Cnt = 0                                                               ' CNT auf 0, wird spaeter zur Steuerung der Phase Lx-OK LED genutzt
P = 1                                                                 ' Phasenzaehler auf 1 (ertse Phase / L1)
Do                                                                    ' Schleifenbeginn
 Cnt = P + 2                                                          ' CNT auf P + 2 setzen
 Print #1 , "V(" ; P ; ") = " ; V(p)
 If V(p) > Vmin And V(p) < Vmax Then                                  ' Wenn die Spannung fuer Phase P innerhalb Vorgabewerte....dann..
  Incr Lok                                                            ' Phasen OK Zaehler um eins erhoehen
  Print #1 , "Phase " ; P ; " is OK!, LOK = " ; Lok
  Portd.cnt = 1                                                       ' und LED and  PORTD.cnt einschalten (Fuer die 1. Phase = PORTD.3 = 1)
 Else                                                                 ' Wenn die Spannung fuer Phase P nicht innerhalb der Vorgabewerte....dann....
  Print #1 , "Phase " ; P ; " is NOT OK!, LOK = " ; Lok
  Portd.cnt = 0                                                       ' LED and  PORTD.cnt ausschalten...Hier wird dann auch LOK nicht um eins erhoeht!
 End If
 Incr P                                                               ' Phasenzaehler um eins erhoehen
Loop Until P > 3                                                      ' Schleife so lange durchlaufen bis Phasenzaehler groesser 3
If Lok < Pm Then                                                      ' Wenn Phasen OK Zaehler < als PM (max. Anzahl Phasen)...dann...
 Incr Ve                                                              ' Spannunsgsfehlerzaehler um eins erhoehen
End If
Return
'------------------------------------------------------------------------------------------------------------------------
Check_error:
W(4) = Getadc(0)                                                      ' ADC Port auslesen (Poti fuer Rueckfallzeit/minimale Generatorlaufzeit)
Gosub Gensetsply                                                      ' Umschalten auf GenSet
W(4) = W(4) / 5                                                       ' Den ADC Wert durch 5 teilen, da sonst max. = 1023! 1023sek. und ist zu lange!
Print #1 , "Wartezeit = " ; W(4) ; " Sekunden..."
For Wz = 1 To W(4)                                                    ' Da der Wait-Befehl ein Problem mit Variablen hat, hier eine Schleife fuer die Zeit
 Wait 1                                                               ' 1 Sekunde Warten
 Zw = W(4) - Wz
 Print #1 , "Noch " ; Zw ; " Sekunden..."
Next Wz                                                               ' Schleife forfuehren bis Wert W(4) erreicht
Still_error:                                                          ' Pruefen ob immer noch ein Spannungsfehler vorliegt
Print #1 , "Still Error!"
Gosub Check_adc                                                       ' ADC Werte holen
Ve = 0                                                                ' Spannungsfehlerzaehler auf 0
Gosub Check_lok                                                       ' Pruefe ob Spannungen OK, wenn nicht wir Ve in der Routine um eins erhoeht
If Ve > 0 Then                                                        ' Wenn Ve > 0, dann hat min. eine Phase immernoch ein Problem
 Goto Still_error                                                     ' in diesem Fall in einer Schleife verharren, bis Fehler nicht mehr vorhanden
End If
Gosub Mainsply                                                        ' Wenn kein Fehler mehr vorhanden, wird die vorherige Schleife verlassen und
Return                                                                ' auf Mainsply zurueck geschaltet
'------------------------------------------------------------------------------------------------------------------------
Check_adc:                                                            ' Hier werden die ADC Werte ermittelt
P = 1                                                                 ' Phasenzaehler auf eins
Do                                                                    ' Phasen-Schleife, wird fuer jede Phase jeweils einmal durchlaufen...
 Do                                                                   ' Null-Erkennungs-Schleife, wird solange durchlaufen bis ADC = 0 (Nulldurchgang)
  W(p) = Getadc(p)                                                    ' Hohle Wert vom ADC
 Loop Until W(p) < 1                                                  ' Solange kein Nulldurchgang...zurueck zum Schleifenstart
 Cnt = 0                                                              ' Zaehler auf 0 setzen
 Do                                                                   ' Positiv Wert Erkennungs Schleife
  W(p) = Getadc(p)                                                    ' Hole Wert vom ADC
  Incr Cnt                                                            ' Zaehler erhoehen
 Loop Until W(p) > 100 Or Cnt > 50                                    ' Wenn ein positiver Wert (>100 = 0,488V) oder der Zaehler > 50 dann Schleife verlassen, sonst zurueck
 Cnt = 0                                                              ' Zaehler wieder auf 0 setzen
 Avg(p) = 0                                                           ' Durchschnittswert auf 0 setzen
 Do
  W(p) = Getadc(p)                                                    ' Wert vom ADC holen
  Avg(p) = Avg(p) + W(p)                                              ' Wert auf Avg(p) aufaddieren zur spaeteren Durchschnittswertermittelung
  Incr Cnt                                                            ' Zaehler um eins erhoehen
 Loop Until W(p) < 1                                                  ' Schleife wiederholen, bis Nulldurchgang (positive Halbwelle zu Ende) erkannt wird
 W(p) = Avg(p) / Cnt                                                  ' Durchschnittswert ermitteln
 Zw = W(p) * 5                                                        ' Zwischenwert zur Spannungsermittelung
 V(p) = Zw / 1024                                                     ' Spannung berechnen
 V(p) = V(p) * 100                                                    ' Spannung mit 100 multiplizieren, da am Eingang Spannungsteiler 100:1
 V(p) = Int(v(p))                                                     ' Nachkommastellen abschneiden
 Incr P                                                               ' Phasenzaehler um eins erhoehen
Loop Until P > 3                                                      ' Schleife wiederholen bis alle 3 Phasen abgearbeitet (P>3)
Return
'------------------------------------------------------------------------------------------------------------------------
Mainsply:                                                             ' Auf Mainsply umschalten
Print #1 , "Main"
Con_genset = 0                                                        ' Schuetz fuer GenSet abschalten
Waitms 250                                                            ' Etwas warten um sicherzustellen, dass das Schuetz geoeffnet ist
Con_main = 1                                                          ' Schuetz fuer Mainsply einschalten
Relais = 0                                                            ' Relais fuer Autostart des Generators aus = Generator abschalten
Return
'------------------------------------------------------------------------------------------------------------------------
Gensetsply:                                                           ' Auf GenSetSply umschalten
Print #1 , "GenSet"
Con_main = 0                                                          ' Schuetz dfuer Mainsply abschalten
Relais = 1                                                            ' Relais fuer Autostart des Generators ein = Generator starten
Waitms 250                                                            ' Etwas warten um sicherzustellen, dass das Schuetz geoeffnet ist
Con_genset = 1                                                        ' Schuetz fuer GenSetSply einschalten
Return
'------------------------------------------------------------------------------------------------------------------------
1_or_3_phase:                                                         ' Ueberpruefern der Jumperstellung 1/3 Phase System
Print #1 , "1 or 3 Phase?"
If Phaseselect = 1 Then                                               ' Wenn Phaseselect = 1 - Jumper nicht gebrueckt (interner Pullup)
 Pm = 3                                                               ' in diesem Fall 3-Phasen-System und PM = 3
 '3pled = 1         ' LED derzeit deaktiviert da SoftUART
 '1pled = 0         ' LED derzeit deaktiviert, da SoftUART
End If
If Phaseselect = 0 Then                                               ' Wenn Phaseselect = 0 - Jumper gebrueckt gegen GND
 Pm = 1                                                               ' in diesem Fall 1-Phasen-System und PM = 1
 '1pled = 1
 '3pled = 0
End If
Return
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------
Menue_isr:                                                            ' Auswertung des Mode/Menu Taster an Int0
Menuid = State                                                        ' Alten Wert aus EEprom holen und in Menuid ablegen
Incr Menuid                                                           ' Menuid um eins erhoehen
If Menuid > 3 Then                                                    ' Wenn Menuid > 3 (sind ja nur 3 Moeglichkeiten: Auto, Main, GenSet)
 Menuid = 1                                                           ' Menuid auf 1 setzen
End If
State = Menuid                                                        ' Neuen Wert von Menuid im EEprom ablegen
If Menuid = 1 Then                                                    ' Menuid = 1 = Automatik
 Auto = 1                                                             ' Entsprechend Auto LED ein
 Main = 0                                                             ' Main LED aus
 Genset = 0                                                           ' GenSet LED aus
End If
If Menuid = 2 Then                                                    ' Menuid = 2 = manual Main
 Auto = 0                                                             ' Auto LED aus
 Main = 1                                                             ' Entsprechend Main LED ein
 Genset = 0                                                           ' GenSet LED aus
End If
If Menuid = 3 Then                                                    ' Menuid = 3 = manual GenSet
 Auto = 0                                                             ' Auto LED aus
 Main = 0                                                             ' Main LED aus
 Genset = 1                                                           ' Entsprechend GenSet LED ein
End If
Print #1 , "Menuid = " ; Menuid
Return
'------------------------------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------------------------------


LG

Klaus
 
Arbeit abgewaelzt...

Hallo an Alle,

Sarah (meine nette Assistentin), wird den Schaltplan und das Layout erstellen, also bitte etwas Geduld...
Sie moechte lernen und somit moechte ich ihr die Chance geben....
Ich denke, dass wir das Ergebnis anfang der Woche haben und dann werde ich es hier posten.....

Das Problem mit der Variablen ist leider immernoch nicht geloest, habe immer und immer wieder das Proggi durchgeschaut...
Auffaellig ist, dass je hoeher Vemax, desto oefter der Fehler....werde mal den µC tauschen, vielleicht het der ja nen Schuss....

Werde dann wieder berichten ob es laeuft oder nicht..

P.S. Unter Projekte habe ich mal einen neues Thema aufgemacht....mein Fun-Projekt...mal sehen ob es was wird...


LG

Klaus
 
Die Wege der Bits sind unergruendlich....

Hallo Leute,

ich weiss nicht, ob es hier and zu klaren Luft liegt (immerhin kommen die netten Atmel-Kaefer ja aus Fern-Ost und da ist bekanntlich die Luft etwas dicker) die den Atmels nicht bekommt oder ob die mich einfach nur aergern wollen....
Was den unerklaerlichen Fehler der Variablen Ve angeht, so habe ich mal den ATMEGA getauscht und das Proggi auf einen neuen, noch unbefleckten, aufgespielt und siehe da.....laeuft himlisch gut....
Ich habe dann den "Alten" µC auf den Galep genagelt und komplett geloescht - ALLES FF via High-Voltage.....Programm wieder drauf und siehe da laueft auch.....trau dem kleinen Kerl aber nicht mehr....

Kurz und gut: Lag also am µC....habe zwar noch keine Erklaerung, aber ueberlege, ob ich den kleinen Kerl zu Strafe hinrichte.....400V auf die Eingaenge oder so.....hat mich einiges an Stunden gekostet.....

Also an ALLE, die sich den Kopf ueber die Variable zerbrechen.....ERLEDIGT!

Danke an alle....

LG

Klaus
 
Strafe muss sein...

Verdient haette er es aber....:mad:

:p
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)