1     Schaltplan 1

2     Statement 2

3     Beschreibung der Steuereinheit 2

3.1      Basic-Mikrocontroller 2

3.1.1      Beschreibung der Funktionen: 3

3.1.1.1       Hauptprogramm: 3

3.1.1.2       Unterprogramme: 3

3.2      Anzeige 4

3.3      Digitale Eingänge 5

3.4      Digitale Ausgänge 5

3.5      Temperatursensoren(-eingänge) 5

3.6      Netzteil 6

4     Kurzbeschreibung des Ablaufes 6

5     Stückliste 8

6     BS2-Software 9

 

1         Schaltplan


 

 


2         Statement

Die vorliegende Steuerschaltung ist “Abfallprodukt” meiner Arbeitstätigkeit. Zusätzlich wurden noch einige Stunden privater Entwicklungszeit in diese Aufgabe gesteckt (derzeit ca. 30 Stunden). Vielen Dank meiner Frau für Ihre Geduld.

 

Für Folgen, die aus der Verwendung dieser Schaltung sowie Software resultieren übernimmt der Autor keinerlei Haftung. Das System wurde für eine spezielle Konfiguration der PK-Erwärmung entwickelt.

Änderungs- und Verbesserungsvorschläge sind immer willkommen (thomas.kohler@gmx.de).

3         Beschreibung der Steuereinheit

3.1      Basic-Mikrocontroller

Der verwendete Basic 2-IC der Fa. http://www.parallaxinc.com/ besitzt 16 frei konfigurierbare I/O und einen Anschluss für die Datenübertragung zum PC (RS232/Programmierung/debug).

 

Beschaltung der I/O:

·         serielle Datenübertragung zur LCD-Anzeige

-          P0..Enable-Ausgang

-          P1..Taktausgang

-          P2..Datenausgang

 

·         Digitale Ausgänge

-          P3..Steuerausgang elt. Heizung Stufe 1

-          P4..Steuerausgang elt. Heizung Stufe 2

-          P5..Steuerausgang Umschaltventil/Freigabemeldung

-          P6..Reserveausgang

-          P7..Lebensbit (wechselt mit 0.25..0.5 Hz, wenn Abarbeitung korrekt läuft)

 

·         Freier I/O

-          P8

 

·         Digitale Eingänge

-          P9..Write/Speicheranforderung (schreiben der Messwerte in den EEPROM)

-          P10..Anzeigewahl (wechselnde Anzeige; Anzeige T1; Anzeige T2; Anzeige T3)

-          P11..SOLL_PK (Anforderung der Freigabe)

-          P12..VDK (Rückmeldung der Stellung des Umschaltventils)

 

·         Digitale Temperaturmesseingänge

-          P13..Temp3 (tH)

-          P14..Temp2 (tP)

-          P15..Temp1 (tt)

 

3.1.1   Beschreibung der Funktionen:

Das Programm ist Modular aufgebaut.

 

3.1.1.1    Hauptprogramm:

..ruft Initialisierung auf und läuft dann mit Endlosschleife durch

Dabei wird ein ZAEHLER (0..65535) hochgezählt, der zur Häufigkeit des Anzeigewechsels sowie Anzeigerefresh genutzt wird. Der PARAMETER gibt an, in welchem Anzeigestatus sich das Ganze befindet (0,1..Init; 2..T1;4..T2;8..T3). Diese Information wird je nach Inhalt des Speichers ANZEIGE hochgezählt oder gesetzt.

 

3.1.1.2    Unterprogramme:

a)   In der IOVERWALTUNG werden die Eingänge gelesen bzw. gesetzt. Diese Eingänge sind ANZEIGEWAHL, SPEICHERANF, PULSIN_T1, PULSIN_T2, PULSIN_T3. Die Ausgänge sind U1_OUT, U2_OUT, MLD_OUT, LIVE.
Das Unterprogramm VK4203VERWALTUNG bedient die Ausgänge der LCD-Anzeige.

b)  Die VK4203VERWALTUNG stellt die Anzeigedaten zusammen (alle Digits und Sonderzeichen)

c)  Das UP WRITE_BCD schreibt die ersten 3 Digits direkt in die LCD-Anzeige (hier immer Buchstaben), danach wandelt es die Zahlen in BCD-Code um und schreibt sie in die restlichen Digits. Zum Schluss werden die Sonderzeichen direkt rausgeschoben.

d)   UP BINAER_DEZIMAL wandelt Zahlen in die einzelnen Digits um und verwaltet außerdem negative Vorzeichen.

e)  UP INIT setzt die Richtung der einzelnen I/O, und führt das Schreiben des EEPROM-Inhaltes auf die serielle Schnittstelle aus (bei jedem Netzein). Die Ausgaben sind so formatiert, das sie mit dem Programm http://www.parallaxinc.com/downloads/software/BASIC Stamps/Stampplot.zip als Textfile abgelegt und mit einem Datenverarbeitungsprogramm (z.B. Excel) eingelesen werden können. Weiterhin wird eine Displaymeldung initialisiert, welche eine fehlerhafte Stellung des Magnetventils beim Start meldet.

f)   

Das UP DIVISION berechnet den Dividend aus dem übergebenen Nenner und Zähler. Das Ergebnis ist dabei: 
DUMMYWORD3=10^4*DUMMYWORD1/DUMMYWORD2

g)  UP REGELUNG stellt einen 3-Punkt –Regler mit Hysterese dar. Folgende Funktion wird damit erreicht:         

h)  UP FREIGABE berechnet die Freigabemeldung aus den gemessenen Temperaturen.

i)    UP WRITEEEPROM speichert die Temperaturwerte im EEPROM ab. Im WRITEEEPROM-Zyklus wird die Durchlaufzeit um 1s erhöht.

 

 

3.2      Anzeige

Die Anzeige ist ein LCD-Modul von http://www.electronic-assembly.de/, welches seriell mit Daten gespeist werden kann. Der Arbeitstemperaturbereich liegt bei
–30°C..+70°C. Es hat eine LED-Hintergrundbe­leuchtung. Diese kann ohne Vorwiderstand an +5V angeschlossen werden.

 

Folgender Ablauf ist beim Daten Schreiben einzuhalten:

1)       Enable auf high

2)       56 Bits rausschieben (Begin ist 6tes Digit, Ende sind Sonderzeichen gefolgt von 3 Nullen)

3)       Enable auf low

 

3.3      Digitale Eingänge

Die digitalen Eingänge sind unbeschaltet auf H (R gegen +5V) gelegt. Damit ergibt sich eine negierte Funktion. Die Ausgangsbeschaltung kann 2-Adrig erfolgen, oder aber 1-Adrig (vor Ort gegen Masse).

 

3.4      Digitale Ausgänge

Die digitalen Ausgänge sind über Optokoppler und Darlington-Schaltung so getrennt, dass Verbraucher bis ca. 300mA/50V angeschlossen werden können (typische Relais haben ca. 75 Ohm Innenwiderstand). Durch Veränderung der Transistorbeschaltung können auch höhere Leistungen erreicht werden. Die Transistoren sind durch Freilaufdioden vor den Induktionsspannungen der Relais geschützt.

 

3.5      Temperatursensoren(-eingänge)

Die verwendeten Temperatursensoren der Firma http://www.hy-line.de/sensor/c-lieferanten.html - SMARTEC liefern eine gepulste Ausgangsspannung im Bereich 1kHz..4kHz. Das Verhältnis von High-Zeit zur Gesamtzeit ist dabei ein Maß der Temperatur. Die BS2-Software wurde für einen Temperaturbereich von
–30°C..130°C geschrieben.

Tabelle 5.1: Abschätzung der erreichbaren Zeiten des Temp.-Sensors

 

1kHz

4kHz

-30°C

+130°C

Zeit [ms]

Gesamtzeit [ms]

1

0.25

-

-

-

Max. Low-Zeit bei

X

 

X

 

0.820

Min. Low-Zeit bei

 

X

 

X

0.018

Max. High-Zeit bei

X

 

 

X

0.930

Min. High-Zeit bei

 

X

X

 

0.045

 

 

Aus den gemessenen Low- und High-Zeiten lässt sich nun die Temperatur folgendermaßen berechnen:

T [°C]=HZ/(HZ+LZ)*212.76-68.08

 

Folgende Vorgehensweise wurde bei der Programmierung umgesetzt:

1)       N_MESS-faches lesen der Low- und High-Zeit (1 Wert = 0.002 ms) für bessere Mittelung

2)       Überprüfung der gelesenen Werte auf Sinnfälligkeit in jedem Zyklus

3)       Korrektur der Messzeit auf T_MZEIT je nach N_MESS, LZ und HZ, um bei EEPROM-Speicherung immer konstante Abtastzeit zu bekommen

4)       Division über Unterprogramm: DUMMYWORD3 = 10^4*HZ/(LZ+HZ)
Bsp.: 0.413à 4130

5)       Kalibrierung des Messergebnisses T=DUMMYWORD3*2.13-6809+T_OFFS*100
T enthält jetzt Temperatur in 1/100°C + 100°C Offset; Bsp. 23.07°C à T=12307

6)       Korrektur auf °C+100°C:   T [°C+100]=T/100; Bsp. 23.07 à T=123

7)       Bei Fehlern in der Messung wird die maximale Messzeit (132ms) auf T_MZEIT verlängert

 

3.6      Netzteil

Die Schaltung ist über eine 250mA-Sicherung gegen Überlast und über eine Diode gegen Verpolen geschützt. Achtung: Die Ausgangstransistoren besitzen keine Absicherung!! Diese ist je nach Relaisbeschaltung zu wählen und zusätzlich anzubringen.

 

4         Kurzbeschreibung des Ablaufes

Nach dem Netz-Ein werden die Ausgangsrichtungen gesetzt. Die Lebens-LED beginnt zu leuchten. Danach wird auf der Anzeige die Anzahl der EEPROM-Samples dargestellt (z.B.: SA_100) und der EEPROM ausgelesen. Über COM-Schnittstelle werden die Daten ausgegeben.

Im nächsten Schritt wird der Eingang VENTIL_DK (Schalter VDK) geprüft und bei fehlerhafter Stellung für ca. 15s die Meldung n_POEL (noch auf PK-Stellung) ausgegeben. Die Meldung erlischt vorzeitig bei Schalten in die richtige Stellung. Dies ist eine Warnung, um bei kaltem Motor auf die PK-Stellung hinzuweisen. Bei warmen Motor ist diese Meldung einfach zu ignorieren.

Jetzt fängt die Lebens-LED an zu blinken (1s-Rythmus), die Temperaturdaten werden gelesen und je nach Anzeigewahlstellung (wird beim Ausschalten gespeichert) die Temperatur angezeigt. Durch Tastendruck auf die ANZ_WAHL-Taste kann nun der anzuzeigende Temperaturwert gewählt werden. Die aktuelle Anzeige wird durch ein Voranstellen von tt (Tanktemperatur), tP (Pumpentemperatur) und tH (Heizwassertemperatur) verdeutlicht.

Die berechneten Ausgangswerte werden zusätzlich im Display über die Sonderzeichen sichtbar gemacht.

 

Dabei bedeuten:

Æ         EEPROM-Aufzeichnung läuft

 

6      Temperatur zu tief (U1 und U2 an)

56 Temperatur i.O. (U1 an, U2 aus)

5      Temperatur zu hoch (U1 und U2 aus)

 

LIT       Freigabemeldung (gib Liter!!!)

 

Während des normalen Betriebes kann jederzeit eine Aufzeichnung der aktuellen Daten durch betätigen der WRITE-Taste durchgeführt werden. Dabei werden die letzten Daten überschrieben. Die Aufzeichnung wird im Display durch das Æ sichtbar gemacht. Es ist zu beachten, dass sich während der Aufzeichnung die Durchlaufzeit um 1s erhöht (Lebens-LED blinkt auch langsamer).

Derzeit ist die Durchlaufzeit auf ca. 1s eingestellt. Sie kann in Sonderfällen, mit dem eingesetzten BS2-Chip auf ca. 200ms reduziert werden. Dies macht einige Softwareänderungen erforderlich.

Eine Änderung des Aufzeichnungsintervalls im Bereich 1s>Ta>1093s ist ebenfalls möglich. Dazu muss lediglich der PAUSE-Wert im EEPROM-UP zwischen 0 ms und 65520 ms variiert werden.

 


5         Stückliste

Die Tabelle enthält nicht unbedingt den günstigsten Anbieter. Die Preise gelten für die angegebene Stückzahl (kein Mengenrabatt) und enthalten keine Lieferkosten.

 

Pos.

Anzahl

Bezeichnung

Lieferant

Bestellnummer

Preis inkl. MWst.

1

1

LCD-Anzeige

www.electronic-assembly.de

VK4203L

131.08

2

1

BS2-IC

www.wilke.de

BASIC-Brief-marke® II P

114.84

3

3

Temperatursensoren

www.hy-line.de

SMT160-30

43.50

4

1

Optokoppler (PC847)

Conrad

187020-11

3.95

5

5

1 N4001

Conrad

162213-11

0.60

6

1

C1 47/10

Conrad

460648-11

0.15

7

1

C2 1000/24

Conrad

472549-11

0.75

8

1

C3 100n

Conrad

461024-11

0.45

9

5

Low-Current-LED

Conrad

145998-11 (rt)

145971-11 (gn)

145980-11 (ge)

1.95

10

1

Festspannungsregler +5V/1A (7805)

Conrad

179205-11

0.95

11

5

1K

Conrad

403253-11

0.85

12

1

4.7K

Conrad

403334-11

0.17

13

4

560 Ohm

Conrad

403229-11

0.68

14

2

Si –Halter

Conrad

533920-11

0.34

15

1

Si 250mA

Conrad

533041-11

2.40

16

1

9-pol SUB-D-Buchse

Conrad

742082-11

0.80

17

4

Npn-Transistoren (BC 517)

Conrad

154695-11

1.80

18

3

4-pol Steckverbinder

Conrad

 

Ca. 10DM

19

4

2-pol Steckverbinder

Conrad

 

Ca. 10DM

20

1

6-pol Steckverbinder

Conrad

 

Ca. 5DM

21

2

Taster

Conrad

 

1-10DM

22

2

Schalter

Conrad

 

1-20DM

 

Summe der Bauteilkosten: ca. 300 DM

Für die Programmierung ist eine 1:1 9-pol. SUB-D-Verlängerung erforderlich !


6         BS2-Software

Inhalt in Textdatei kopieren, Name: Control_PK.bs2

Die Temperaturen (LEV_XX, DT_LTG, HYS) sind im Programm für Testzwecke (Handerwärmung der Sensoren) so eingestellt, dass man die Reaktion der Ausgangs-LED’s bzw. Anzeigemeldungen beobachten kann. Die praxisrelevanten Werte sind im Kommentar unter STD:xxx abgelegt. Diese beim Einbau in den Chip spielen!!!

 

 

'{$STAMP BS2}

'Arbeitszeit:2h;4h;4h;8h

'Lesen der Eingänge; T1, T2,T3  (sinnvolle Werte der low und High-Zeiten sind (9..465)*2us bei BS2)

'Ventil=DK, Soll=PK

'Ansteuern der großen LCD-Anzeige

'Regeln von U1,U2

'Freigabesignal berechnen

 

'Änderung zur Vorversion:

 

'Besonderheiten:

'Temperaturen werden mit Offset +100°C berechnet und verwendet

'bei einer unklaren Messung, wird Temp=1 gesetzt (-99°C)

'Korrektur der Abtastzeit bei gemessenen Temperaturen auf T_MZEIT (200 ms)

'Negation aller Eingänge laut Schaltplan

'Korrektur der Durchlaufzeit auf 2s beim EEPROM schreiben (Ta=2s)

'Aufzeichnung der Daten per Tastendruck -> EEPROM

'Ausgabe des EEPROMS im Init-Zweig

'Warnung, wenn bei Start VENTIL_DK=0 (Ventil steht noch auf PK)

'Freigabe nur bei SOLL_PK=1

 

'weitere Arbeiten:

'Temp.-Messroutine in eigenes UP

'Zaehler auf byte-Variable kuerzen (MELDUNGNDK<=255)

 

'++++++++++Temperaturlevel und Reglerkonstanten++++++++++++++++++++++++++++++++++++

T_OFFS   con 100                  'Offset der Temperaturen, um neg. Werte zu vermeiden

T_MZEIT  con 200                  'Messzeit in ms, auf die die Temperaturmessg. korrigiert wird >133 und >(N_MESS*T_MESS) !!

N_MESS  con 20                    'Häufigkeit der T-Messung

T_MESS  con 38                    'Messzeit einer T-Messung [*100 us] (mit Oszi bestimmt)

                                                                              'Berechnung der Gesamtmesszeit=(N_MESS*T_MESS)

 

SMAX_HZ               con 930/2                               'sinnvoller maximaler Wert für HZ (bei 130°C und 1KHz)

SMIN_HZ con 45/2                 'sinnvoller minimaler Wert für HZ (bei -30°C und 4KHz)

SMAX_LZ               con 820/2                               'sinnvoller maximaler Wert für LZ (bei -30°C und 1KHz)

SMIN_LZ con 18/2                 'sinnvoller minimaler Wert für LZ (bei 130°C und 4KHz)

 

LEV_FR   con 0+T_OFFS       'Temperatur (T1), bei der Tankinhalt gefroren ist

LEV_FG  con 31+T_OFFS     'Temperatur (T1), ab der die Freigabemeldung erfolgt (theoret. berechnet) STD:40

LEV_H                    con 27+T_OFFS     'Temperatur (T2), bei der eine  Heizung   ausgeht                STD:85

LEV_VH  con 29+T_OFFS     'Temperatur (T2), bei der beide Heizungen ausgehen          STD:95

DT_LTG   con 10                    'Temperaturerhöhung der beheizten PK-Leitung   STD:10

HYS                        con 1                                      '1/2 Hysterese des Reglers

 

 

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

ANZEIGE data 0      'Anzeigeoption:   0=Anzeige von T1, T2, T3 durchlaufend

                                                               '                                              1=Anzeige von T1

                                                               '                                              2=Anzeige von T2

                                                               '                                              3=Anzeige von T3

 

SAMPLES               con 100                  '=Aufzeichnungszeit in s (max. 150)

TIEFE                       con 3                                      '3Temp-Daten

MEMORY con SAMPLES*TIEFE              'Anzahl der Byte-Daten im EEPROM

WPOS                     data (MEMORY)      'Position der Temperaturdaten

WPOSMAX             con WPOS+MEMORY-1         'Endposition der Daten

 

ZAEHLER                var word 'Zähler für Refresh-Rate+blinkende LED

WZAEHLER            var word    'Zähler für EEPROM-Position

 

DUMMYWORD1  var word    'Speicher für Divident

DUMMYWORD2  var word    'Speicher für Divisor

DUMMYWORD3  var word    'Speicher für Divisor

 

FEHLER   var byte  'Fehlerspeicher

TEMP1                     var byte  'Temperatur 1 (0...255 = -100...155°C)

TEMP2                     var byte  'Temperatur 2 (0...255 = -100...155°C)

TEMP3                     var byte  'Temperatur 3 (0...255 = -100...155°C)

 

DUMMYBYTE1        var byte  'Byte-Hilfsvariable

DUMMYBYTE2        var byte 

DUMMYBYTE3        var byte

DUMMYBIT              var DUMMYBYTE3.bit1

 

U1AN                      var bit      'Heizwendel 1 ein

U2AN                      var bit      'Heizwendel 2 ein

MLDAN                   var bit      'Meldung der Freigabe ein

 

ANZ                        var bit      'Anforderung des Anzeigewechsels

ANZ_OLD               var bit      'Vorhergehender Status

 

SPA                        var bit      'Speicheranforderung

SPA_OLD               var bit      'Vorhergehender Status

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

 

 

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

PARAMETER   var byte                                         '0= Initialisierung

                                                                                              '1= Init 2

                                                                                              '2= Temp.1

                                                                                              '3= Temp.2

                                                                                              '4= Temp.3

 

VK4203SONDER  var byte                                    'Byte für Sonderzeichen, und kodierte Dezimalpunkte (0..5) SSSS SDDD

VK4203ZAHL    var byte                                       'Dezimalzahl, die angezeigt werden soll und gleichzeitig Einer-Stelle (LSB)

VK4203ZEHNER  var byte                                     'Zehner Stelle

VK4203HUNDERT var byte                                   'Hunderter Stelle

VK4203BST1    var byte                                       'Buchstabe1 (Hunderttausender Stelle, MSB)

VK4203BST2    var byte                                       'Buchstabe2 (Zehntausender    Stelle)

VK4203BST3            var byte                                               'Buchstabe3 (Tausender        Stelle)

VK4203NULLEN  var bit               'Kenner, ob fhrende Nullen geschrieben werden

VK4203ANZEIGE con $0001                                 'Refreshrate von VK4203 (alle 2 Durchläufe)

ANZEIGEWECHSEL con $0002                             'Refreshrate von VK4203 (alle 4 Durchläufe)

MELDUNGNDK          con 600                                'Meldungslänge Non DK 600 = ca.15s

 

 

'++++++++++++++++Konstanten für BCD-Anzeige+++++++++++++++++

'                                    abcdefgx                           'x...Kenner, ob Zahl=0, oder Buchstabe=1

BCDMIN   con %00000010                     'Anzeige "|-|"

BCD0                      con %11111100                     'Anzeige "0"

BCD1                      con %01100000                     'Anzeige "1"

BCD2                      con %11011010                     'Anzeige "2"

BCD3                      con %11110010                     'Anzeige "3"

BCD4                      con %01100110                     'Anzeige "4"

BCD5                      con %10110110                     'Anzeige "5"

BCD6                      con %10111110                     'Anzeige "6"

BCD7                      con %11100000                     'Anzeige "7"

BCD8                      con %11111110                     'Anzeige "8"

BCD9                      con %11110110                     'Anzeige "9"

BCDA                      con %11101110                     'Anzeige "A"

BCDB                      con %00111110                     'Anzeige "b"

BCDC                      con %10011100                     'Anzeige "C"

BCDD                      con %01111010                     'Anzeige "d"

BCDE                      con %10011110                     'Anzeige "E"

BCDF                      con %10001110                     'Anzeige "F"

BCDG                      con BCD6                                               'Anzeige "G"

BCDH                      con %01101110                     'Anzeige "A"

BCDI                        con %00001000                     'Anzeige "i"

BCDJ                       con %01111000                     'Anzeige "J"

BCDL                      con %00011100                     'Anzeige "L"

BCDN                      con %00101010                     'Anzeige "n"

BCDO                      con %00111010                     'Anzeige "o"

BCDS                      con BCD5                                               'Anzeige "S"

BCDT                      con %00011110                     'Anzeige "t"

BCDU                      con %00111000                     'Anzeige "u"

BCDP                      con %11001110                     'Anzeige "P"

 

BCDPULSU             con %11000100                     'Anzeige "|-|"

BCDPULSD             con %00111000                     'Anzeige "|_|"

BCDUSQ con %00000010                     'Anzeige " - "

 

VKDP                      con %00000001                     'Anzeige "DP4-DP1"

VKPUP                    con %10000000                     'Anzeige "Pfeil oben"

VKPDN                    con %01000000                     'Anzeige "Pfeil unten"

VKGAL                   con %00100000                     'Anzeige "Gal"

VKLIT                      con %00010000                     'Anzeige "Lit"

VKGC                     con %00001000                     'Anzeige "°C"

 

'+++++++++++++++++Portbelegung++++++++++++++++++++++

'Eingänge:

PULSIN_T1   con 15                               'Dateneingang für Pulsweite Temperatursensor1 (PK)

PULSIN_T2   con 14                               'Dateneingang für Pulsweite Temperatursensor2 (EP)

PULSIN_T3   con 13                               'Dateneingang für Pulsweite Temperatursensor3 (KW)

 

VENTIL_DK   con 12                              'Eingang für Test auf Schaltstellung Ventil

VENTIL_DKPIN   var in12

SOLL_PK     con 11                               'Eingang für PK-Zyklus (0: U1,U2=0)

SOLL_PKPIN     var in11

 

ANZEIGEWAHLPIN con 10                     'Eingang für Taste zur Anzeigenwahl

ANZEIGEWAHL var in10

SPEICHERANFPIN con 9                         'Eingang für Taste zur Speicheranforderung

SPEICHERANF  var in9

 

 

'Ausgänge:

VK4203E con 0                      'Enableausgang  für LCD-Anzeige

VK4203C                con 1                      'Taktausgang  für LCD-Anzeige

VK4203D                con 2                      'Datenausgang für LCD-Anzeige

 

U1                           con 3

U1_OUT  var out3                  'Ausgang für elt.-Tauscher1

U2                           con 4

U2_OUT  var out4                  'Ausgang für elt.-Tauscher2

MLD                        con 5

MLD_OUT               var out5                  'Ausgang für Freigabe zum Umschalten

 

RESERVE                con 6                                      'Reserveausgang

LIVE                        con 7                                      'Wackelt, wenn alles IO

 

'-------------Hauptprogramm--------------------------

'Initialisierung nach Programmstart:

gosub INIT

'debug cr,"INIT OK!"

 

DURCHLAUF:'Eingabesteuerung ist aktiv

 

 ZAEHLER=ZAEHLER+1                        'Zähler für Anzeigehäufigkeit und -wechsel

 read ANZEIGE,DUMMYBYTE1              'Anzeigeart lesen

 'wechselnde Anzeige:

 if DUMMYBYTE1<>0 then ENDEWECHSEL

  if (ZAEHLER//ANZEIGEWECHSEL)<>0 then ENDEWECHSEL

   PARAMETER=PARAMETER*2

   if PARAMETER<16 then ENDEWECHSEL

    PARAMETER=2

 ENDEWECHSEL:

 'Anzeige T1

 if DUMMYBYTE1<>1 then ENDEANZT1

  PARAMETER=2

 ENDEANZT1:

 'Anzeige T2

 if DUMMYBYTE1<>2 then ENDEANZT2

  PARAMETER=4

 ENDEANZT2:

 'Anzeige T3

 if DUMMYBYTE1<>3 then ENDEANZT3

  PARAMETER=8

 ENDEANZT3:

 

 gosub IOVERWALTUNG       'IOs lesen und setzen

 gosub WRITEEEPROM

 

 pause 320                             'Pause für Ta=1s

 

goto DURCHLAUF

 

'------------------Unterprogramme: --------------------

IOVERWALTUNG:

 'Eingänge-------------------------------------

 'lesen:

 'Anzeigewahl

 'Flankenauswertung nur L-H-Flanke:

 DUMMYBIT=-ANZEIGEWAHL

 ANZ=DUMMYBIT & (ANZ_OLD^1)

 ANZ_OLD=DUMMYBIT

 if ANZ<>1 then ENDEKORRANZ

  read ANZEIGE,DUMMYBYTE1

  DUMMYBYTE1=DUMMYBYTE1+1

  if DUMMYBYTE1<=3 then ENDEKORRANZ1

   DUMMYBYTE1=0

  ENDEKORRANZ1:

  write ANZEIGE,DUMMYBYTE1

 ENDEKORRANZ:

 

 'Speicheranforderung

 'Flankenauswertung nur L-H-Flanke:

 DUMMYBIT=-SPEICHERANF                                 'Eingang negiert

 SPA=DUMMYBIT & (SPA_OLD^1)

 SPA_OLD=DUMMYBIT

 if SPA<>1 then ENDESPANF

  WZAEHLER=WPOS

 ENDESPANF:

 

 

 'Temperatur1+++++++++++

 DUMMYWORD1=0

 DUMMYWORD2=0

 

 for DUMMYBYTE3=1 to N_MESS

  pulsin PULSIN_T1,1,DUMMYWORD3   'Eingang lesen in word-Variable, High-Zeit

  if (DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ) then ENDEFT1

  DUMMYWORD1=DUMMYWORD1+DUMMYWORD3

 

  pulsin PULSIN_T1,0,DUMMYWORD3   'Eingang lesen in word-Variable, Low-Zeit

  if (DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT1

  DUMMYWORD2=DUMMYWORD2+DUMMYWORD3

 next 'DUMMYBYTE3

 'Messung dauert maximal M_MESS*N_MESS ms

 'Korrektur der Messzeit auf T_MZEIT ms

 'debug cr,"reine Messzeit T1[us]:",dec (DUMMYWORD1+DUMMYWORD2)*2

 'debug cr, "PAUSE:",dec (T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))

 pause (T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))

 

 'debug cr,"LZ1:",dec DUMMYWORD1," HZ1:",dec DUMMYWORD2

 'komplizierte Division wegen schlechter Arithmetik

 DUMMYWORD1=DUMMYWORD1/N_MESS                                         'Zähler

 DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS)           'Nenner

 DUMMYWORD3=0                                                                'sp“ter Ergebnis

 gosub DIVISION

 'Kalibrierung:

 DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)

 TEMP1=DUMMYWORD2/100                                'Temperatur1 in °C

 'debug cr,"T1:",dec TEMP1-T_OFFS

 

 goto ENDENFT1

 'Fehlerverwaltung T1

 ENDEFT1:

  TEMP1=1

  pause T_MZEIT-132 'zusätzliche Pause, um auf T_MZEIT zu kommen

 ENDENFT1:

 

 'Temperatur2+++++++++++

 DUMMYWORD1=0

 DUMMYWORD2=0

 for DUMMYBYTE3=1 to N_MESS

  pulsin PULSIN_T2,1,DUMMYWORD3   'Eingang lesen in word-Variable, High-Zeit

  if (DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ) then ENDEFT2

  DUMMYWORD1=DUMMYWORD1+DUMMYWORD3

 

  pulsin PULSIN_T2,0,DUMMYWORD3   'Eingang lesen in word-Variable, Low-Zeit

  if (DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT2

  DUMMYWORD2=DUMMYWORD2+DUMMYWORD3

 next 'DUMMYBYTE3

 'Messung dauert maximal 1.1*N_MESS ms

 'Korrektur der Messzeit auf 1.5*N_MESS ms

 'debug cr,"Messzeit T2:",dec (DUMMYWORD1+DUMMYWORD2)/500

 

 pause (T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))

 

 'debug cr,"LZ2:",dec DUMMYWORD1," HZ2:",dec DUMMYWORD2

 'komplizierte Division wegen schlechter Arithmetik

 DUMMYWORD1=DUMMYWORD1/N_MESS                                         'Zähler

 DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS)'Nenner

 DUMMYWORD3=0                                                                'sp“ter Ergebnis

 gosub DIVISION

 'Kalibrierung:

 DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)

 TEMP2=DUMMYWORD2/100                                'Temperatur2 in °C

 'debug cr,"T2:",dec TEMP2-T_OFFS

 

 goto ENDENFT2

 'Fehlerverwaltung T2

 ENDEFT2:

  TEMP2=1

  pause T_MZEIT-132 'zusätzliche Pause, um auf T_MZEIT zu kommen

 ENDENFT2:

 

 'Temperatur3+++++++++++

 DUMMYWORD1=0

 DUMMYWORD2=0

 

 for DUMMYBYTE3=1 to N_MESS

  pulsin PULSIN_T3,1,DUMMYWORD3   'Eingang lesen in word-Variable, High-Zeit

  if (DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ) then ENDEFT3

  DUMMYWORD1=DUMMYWORD1+DUMMYWORD3

 

  pulsin PULSIN_T3,0,DUMMYWORD3   'Eingang lesen in word-Variable, Low-Zeit

  if (DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT3

  DUMMYWORD2=DUMMYWORD2+DUMMYWORD3

 next 'DUMMYBYTE3

 'Messung dauert maximal 1.1*N_MESS ms

 'Korrektur der Messzeit auf 1.5*N_MESS ms

 debug cr,"Messzeit T3[ms]:",dec (DUMMYWORD1+DUMMYWORD2)/500

 

 pause (T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))

 

 'debug cr,"LZ3:",dec DUMMYWORD1," HZ3:",dec DUMMYWORD2

 'komplizierte Division wegen schlechter Arithmetik

 DUMMYWORD1=DUMMYWORD1/N_MESS                                         'Zähler

 DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS)'Nenner

 DUMMYWORD3=0                                                                'sp“ter Ergebnis

 gosub DIVISION

 'Kalibrierung:

 DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)

 TEMP3=DUMMYWORD2/100                                'Temperatur3 in °C

 'debug cr,"T3:",dec TEMP3-100

 

 goto ENDENFT3

 'Fehlerverwaltung T3

 ENDEFT3:

  TEMP3=1                                                                    '-99°C solange kein Sensor dran

  pause T_MZEIT-132 'zusätzliche Pause, um auf T_MZEIT zu kommen

 ENDENFT3:

 

 'Ausgänge-------------------------------------

 'schreiben

 'U1-U2-Regelung

 gosub REGELUNG

 U1_OUT=U1AN

 U2_OUT=U2AN

 'Freigabe des Ausganges

 gosub FREIGABE

 MLD_OUT=MLDAN

 'schreiben VK4203 nur alle n Durchläufe

 if (ZAEHLER//VK4203ANZEIGE)<>0 then ENDEVK4203

  gosub VK4203VERWALTUNG

 ENDEVK4203:

 'Lebensbit:

 toggle LIVE

return

 

VK4203VERWALTUNG:

 high VK4203E 'Bereit zum rausschreiben

 

 if FEHLER=0 then ENDEVWF                'bei keinem Fehler

  VK4203SONDER=%11111111                            'alle Sonderzeichen ein

  VK4203BST1  =BCDF                                          '"F"

  VK4203BST2  =BCDN                                         '"n"

  VK4203ZAHL=FEHLER                                       'Fehlernummer holen

  gosub BINAER_DEZIMAL                                    'in Dezimalstellen wandeln

  goto ENDEVW0                                                    'LSB..MSB schreiben

 ENDEVWF:

 

 VK4203HUNDERT=0

 VK4203ZEHNER =0

 VK4203NULLEN =0                                              'fhrende Nullen unterdrcken 

 VK4203SONDER =1                                             'Dezimalpunkt

 

 'Pfeilverwaltung (3-Punkt-Regler)

 if U1AN=0 then ZUHOCH

   if U2AN=0 then GUT 

 ZUTIEF:

  VK4203SONDER =VK4203SONDER|VKPDN                      'Sonderzeichen: Pfeil unten

  goto ENDEPFEILE

 GUT:

  VK4203SONDER =VK4203SONDER|VKPDN                      'Sonderzeichen: Pfeil unten

 ZUHOCH:

  VK4203SONDER=VK4203SONDER|VKPUP                       'Sonderzeichen: Pfeil oben

 ENDEPFEILE:

 

 'LIT-Verwaltung (Freigabe PK)

 if MLDAN=0 then ENDELIT

  VK4203SONDER=VK4203SONDER|VKLIT                         'Sonderzeichen: Pfeil oben

 ENDELIT:

 

 '$-Verwaltung (Aufzeichnung läuft)

 if (WZAEHLER+TIEFE)>WPOSMAX then ENDEAUFZ

  VK4203SONDER=VK4203SONDER|VKGC                         'Sonderzeichen: GC

 ENDEAUFZ:

 

 

 

 branch ncd(PARAMETER),[PARAM0,PARAM1,PARAM2,PARAM4,PARAM8,PARAM16,PARAM32,PARAM64,PARAM128]

 PARAM0:               'Anzeige der Samples -----------------------------

  VK4203SONDER =0                                            'Sonderzeichen: leer

  VK4203BST1=BCDS                                           '"S"

  VK4203BST2=BCDA                                           '"A"

  VK4203BST3=0                                   '""

  'Samples in Dezimalstellen wandeln (keine Negation bei Werten>128)

  VK4203ZAHL   =SAMPLES dig 0

  VK4203ZEHNER =SAMPLES dig 1

  VK4203HUNDERT=SAMPLES dig 2

  goto ENDEVW0 

 PARAM1:               'Anzeige der Samples -----------------------------

  VK4203SONDER =0                                            'Sonderzeichen: leer

  VK4203BST1=BCDn                                            '"n"

  VK4203BST2=0                                   '""

  VK4203BST3=BCDP                                            '"P"

  VK4203HUNDERT=0                                            '"O"

  VK4203ZEHNER =BCDE                      '"E"

  VK4203ZAHL   =BCDL                        '"L"

  VK4203NULLEN =1                                             'fhrende Nullen nicht unterdrcken

  goto ENDEVW0 

 PARAM2:               'Temperatur1---------------------------------------

  VK4203BST1=BCDT                                            '"t"

  VK4203BST2=BCDT                                            '"t"

  VK4203BST3=0                                   '""

  VK4203ZAHL=TEMP1-100                  'Darstellung TEMPERATUR in øC

  gosub BINAER_DEZIMAL                     'in Dezimalstellen wandeln

  VK4203HUNDERT=VK4203ZEHNER

  VK4203ZEHNER =VK4203ZAHL

  VK4203ZAHL=BCDC                                           'C

  goto ENDEVW0

 PARAM4:               'Temperatur2----------------------------------------

  VK4203BST1=BCDT                                            '"t"

  VK4203BST2=BCDP                                            '"P"

  VK4203BST3=0                                   '""

  VK4203ZAHL=TEMP2-100                  'Darstellung TEMPERATUR in øC

  gosub BINAER_DEZIMAL                     'in Dezimalstellen wandeln

  VK4203HUNDERT=VK4203ZEHNER

  VK4203ZEHNER =VK4203ZAHL

  VK4203ZAHL=BCDC                                           'C

  goto ENDEVW0

 PARAM8:               'Temperatur3----------------------------------------

  VK4203BST1=BCDT                                            '"t"

  VK4203BST2=BCDH                                           '"H"

  VK4203BST3=0                                   '""

  VK4203ZAHL=TEMP3-100                  'Darstellung TEMPERATUR in øC

  gosub BINAER_DEZIMAL                     'in Dezimalstellen wandeln

  VK4203HUNDERT=VK4203ZEHNER

  VK4203ZEHNER =VK4203ZAHL

  VK4203ZAHL=BCDC                                           'C

  goto ENDEVW0

 PARAM16:             'Frei----------------------------------------

  gosub BINAER_DEZIMAL                                    'in Dezimalstellen wandeln

  goto ENDEVW0

 PARAM32:             'Frei----------------------------------------------

  gosub BINAER_DEZIMAL                                    'in Dezimalstellen wandeln

  goto ENDEVW0

 PARAM64:             'Job--------------------------------------------

  goto ENDEVW0

 PARAM128:           'Reserveausgänge 1..7----------------------------------------

  goto ENDEVW0

 ENDEVW0:

 

 gosub WRITE_BCD                                               'LSB..MSB schreiben

 

 low VK4203E                                        'Daten parallel zur Verfügung stellen

return

 

WRITE_BCD:  'in BCD-Code wandeln und rausschieben

 

 'debug cr,dec (VK4203SONDER&%00000111)

 

 shiftout VK4203D,VK4203C,1,[VK4203BST1\8]

 shiftout VK4203D,VK4203C,1,[VK4203BST2\8]

 shiftout VK4203D,VK4203C,1,[VK4203BST3\8]

 

 

 if ((VK4203HUNDERT=0)or(VK4203HUNDERT>9))and(VK4203NULLEN=0) then ENDEWBCDH       'führende "0" unterdrücken, Buchstaben

  lookup VK4203HUNDERT,[BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203HUNDERT

 ENDEWBCDH:

 if (VK4203SONDER&(%00000111))<>2 then ENDEWBCDDP2

  VK4203HUNDERT.bit0=1

 ENDEWBCDDP2:

 shiftout VK4203D,VK4203C,1,[VK4203HUNDERT\8]

 

 if VK4203ZEHNER>9 then ENDEWBCDZ                                                                                                                           'Buchstaben

  lookup VK4203ZEHNER,  [BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203ZEHNER

 ENDEWBCDZ:

 if (VK4203SONDER&(%00000111))<>1 then ENDEWBCDDP1

  VK4203ZEHNER.bit0=1

 ENDEWBCDDP1:

 shiftout VK4203D,VK4203C,1,[VK4203ZEHNER\8]

 

 if VK4203ZAHL >9 then ENDEWBCDE                                                                                                               'Buchstaben

  lookup VK4203ZAHL,[BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203ZAHL

 ENDEWBCDE:

 if (VK4203SONDER&(%00000111))<>6 then ENDEWBCDDOL

  VK4203ZAHL.bit0=1

 ENDEWBCDDOL:

 shiftout VK4203D,VK4203C,1,[VK4203ZAHL\8]

 

 

 VK4203SONDER.bit0=0                                                                                                      'Sonderzeichen

 VK4203SONDER.bit1=0

 VK4203SONDER.bit2=0

 shiftout VK4203D,VK4203C,1,[VK4203SONDER  \8]

 

return

 

BINAER_DEZIMAL: 'Decoder für Binärzahl

 if VK4203ZAHL<129 then ENDEMINUS

  VK4203ZAHL=-VK4203ZAHL

  VK4203BST3=BCDMIN

 ENDEMINUS:

 

 VK4203HUNDERT=VK4203ZAHL dig 2

 VK4203ZEHNER =VK4203ZAHL dig 1

 VK4203ZAHL   =VK4203ZAHL dig 0

return

 

INIT:

 'Richtung setzen

 input PULSIN_T1

 input PULSIN_T2

 input PULSIN_T3

 input VENTIL_DK

 input SOLL_PK

 input ANZEIGEWAHLPIN

 input SPEICHERANFPIN

 output VK4203D

 output VK4203C

 output VK4203E

 output U1

 output U2

 output MLD

 output RESERVE

 output LIVE

 U1_OUT =0

 U2_OUT =0

 MLD_OUT=0

 high LIVE

 

 'schreiben VK4203

 PARAMETER=0

 gosub VK4203VERWALTUNG

 

 'Ausgabe des EEProms

 debug "!CLRM",13,"!DELM",13,"!SAVM ON",13

 pause 20

 for WZAEHLER = WPOS to WPOSMAX

  read WZAEHLER,DUMMYBYTE1

  WZAEHLER=WZAEHLER+1

  read WZAEHLER,DUMMYBYTE2

  WZAEHLER=WZAEHLER+1

  read WZAEHLER,DUMMYBYTE3

  'Ausgeben in Stampplotlight

  debug dec DUMMYBYTE1,",",dec DUMMYBYTE2,",",dec DUMMYBYTE3,13

 next

 debug "!SAVM OFF",13

 WZAEHLER=WPOSMAX+1

 

 FEHLER=0

 ZAEHLER=0                          'Zähler für Refresh-Rate+LED-Blinken

 

 REPEATNDK:

 ZAEHLER=ZAEHLER+1

 if (VENTIL_DKPIN^1)=0 then ENDENODK                             'Eingang negiert

  PARAMETER=1

  gosub VK4203VERWALTUNG                                            'Warnung ausgeben

 ENDENODK:

 if ZAEHLER<MELDUNGNDK then REPEATNDK

 ZAEHLER=0

 PARAMETER=2

return

 

DIVISION:'Ergebnis in DUMMYWORD3

 for DUMMYBYTE3=1 to 5

  'debug cr, dec DUMMYWORD1," ",dec DUMMYWORD2," ",dec DUMMYWORD3

  DUMMYWORD3=(DUMMYWORD1/DUMMYWORD2)+(DUMMYWORD3*10)

  DUMMYWORD1=DUMMYWORD1//DUMMYWORD2*10

 next 'DUMMYBYTE3

return

 

REGELUNG: 'Dreipunktregler

 'debug cr, dec (TEMP2-100)

 if TEMP2>(LEV_H-HYS) then ENDEU2AN

  U2AN=1

 ENDEU2AN:

 if TEMP2<(LEV_H+HYS) then ENDEU2AUS

  U2AN=0

 ENDEU2AUS:

 if TEMP2>(LEV_VH-HYS) then ENDEU1AN

  U1AN=1

 ENDEU1AN:

 if TEMP2<(LEV_VH+HYS) then ENDEU1AUS

  U1AN=0

 ENDEU1AUS:

return

 

FREIGABE:

 MLDAN=0

 if (TEMP1<LEV_FR)or(SOLL_PKPIN^1=0) then ENDEFROST                              'Tank ist gefroren-->keine Freigabe

  DUMMYWORD1=((TEMP1+DT_LTG)/2)+(TEMP2/2)            'Berechnung der zu erwartenden PK-Temp

  'Es wird unterstellt, daß die Heizleitung eine Temperaturerhöhung von DT_LTG schafft

  'Die Mischungstemp. ergibt sich dann aus 50/50 ALT/NEU (bei geringen Drehzahlen wahrscheinlich

  'mehr ALT d.h. tatsächliche Temp. ist höher als erwartete)

  'Später kann hier die Formel des gelöteten WT mit Kenntnis der KW-Temp (T3) eingesetzt werden.

  if DUMMYWORD1<LEV_FG then ENDEZUKALT 'zu erwartende Temp.liegt unter Freigabelevel

   MLDAN=1

  ENDEZUKALT:

 ENDEFROST:

return

 

WRITEEEPROM:

 if (WZAEHLER+TIEFE)>WPOSMAX then ENDEWRITE

  write WZAEHLER,TEMP1

  WZAEHLER=WZAEHLER+1

  write WZAEHLER,TEMP2

  WZAEHLER=WZAEHLER+1

  write WZAEHLER,TEMP3

  WZAEHLER=WZAEHLER+1  

  'debug cr,dec WZAEHLER

  pause 1000                          'zusätzliche Pause für Ta=2s

 ENDEWRITE:

return