Date |
Rev |
Status |
Author |
Last Change |
|
2009-01-05 |
0.1 |
Draft |
Michael Gries |
Initial Draft (Feasibility Study) |
|
2009-02-27 |
1.0 |
Release |
Michael Gries |
Implementation Step 1 - Analysis |
|
2009-03-03 |
2.0 |
Release |
Michael Gries |
Implementation Step 2 - Prototyping |
|
2009-04-09 |
3.0 |
Release |
Michael Gries |
Implementation Step 3 - VRC-Monitor |
|
2010-01-04 |
3.1 |
Draft |
Michael Gries |
Zubehör Ölverbrauchsmesser |
|
2010-01-01 |
4.0 |
Release |
Michael Gries |
Impl. Step 4 – Connected to TC65T |
|
2010-01-04 |
4.1 |
Draft |
Michael Gries |
update – not yet released |
|
Source Document |
|||||
Preface
This document is part of the AF104 sub-project VRC Monitor.
VRC 410
Table of Contents
1.5. Verwendete Messgeräte und Hilfsmittel
1.6. Roles and Responsibilities
2.2. iroVIT Klemme 7-8-9 Schnittstelle
2.3.1. Signalisierungsart und elektrische Parameter
2.3.2. Tabelle Holdoff-Zeiten VRC410 Signal
2.3.3. Ermittung der mittleren Hold-off Zeiten
4.1.1. DCF77 Funkuhr Funktionalität
4.2.1. Listing – VRC Monitorprogramm
4.2.2. Hardcopy – VRC Monitorprogramm
Heizöl Extra Leicht (EL) Quelle: Wikipedia
6.1. Datenblätter (Bauteile für RS232 Konverter)
6.1.2. C-Control Pro – Atmel Mega128
6.2. Simulation Pegelkonverter
6.2.1. Stromlaufplan - Pegelkonverter
6.2.2. Bestückungsplan - Pegelkonverter
6.3. RS-232 Schnittstellenwandler
6.3.5. Blockschaltbild / Anschlussbelegung
6.3.6. C-Control Pro Mega Series (Mega 128)
6.3.8. VRC-Monitor Trace 2009-12-15
6.4. Datenpräsentation auf Server
6.5. Bootcable für VRC-Konverter
6.5.2. Bestückungsplan - Bootcable
Hypercom internal project of the Global Quality Management department for monitoring serial applications like the VRC 410 device which is used for monitoring and controlling.
This document covers integration of the 7-8-9 interface of the VRC 410 into the AF104 project.
Used for internal testing and quality assurance purposes only. No commercial application.
[R1] Vaillant System iroVIT Öl-Heizkessel
[R2] Vaillant Bedienungs- und Montageanleitung VRC 410
[L1] Das kleine Werkbuch Elektronik, Dieter Nührmann, 1994, 2004, Franzis Verlag ISBN 978-3772371745
[L2] tbd
[M1] Oszilloskop – Tektronic TDS3012B o.ä.
[M2] Laptop mit mind. 1x RS232 Schnittstelle
[M3] Schaltungseditor und Simulator (z.B. Target 3001, Version 14, Freeware Version, Stand 2008)
[M4] Experimentierboard (Steckbrett für Schaltungstest – Prototyping)
[M5] RS-232 Monitoring Software (SerialSniffer - Freeware)
[M6] C-Control Mega128 Projectboard
[M7] RS232-Schnittstellentester
Only these responsibilities of a given role is described which relates to this project.
Role |
Responsibility |
Person |
Project Manager |
Integration into AF104 TC65 |
Michael Gries |
Hardware Support |
Cabling, spare parts, RS232-Konverter |
Klaus Bachmann |
Analog Converter |
design Op µA741 for level shifting into RS232 req. |
Bernd Poroffscheck |
Protokolltester |
RS-232 Monitoring (SerialSniffer) |
Thomas Grundler |
|
|
|
Date |
Item |
Remarks |
2009-01-01 |
Projektstart VRC Monitor |
Analyse / Machbarkeitsstudie |
|
|
|
2009-04-05 |
Langzeitaufzeichnung (Laptop) |
Verschiedene Dateiformate auf Festplatte |
2009-03 |
Pegelkonverter (Modul-Hutschiene) |
Eigenbau |
2009-03 |
Analyse Betriebsparameter |
Aussentemp./ Vorlauftemp./ Speichertemp. / Heizkurve / Heizbetrieb – Warmwasser - Pumpennachlauf |
2009-05-16 |
Installation RS232 Konv. Hutschiene |
|
2009-06-14 |
Installation DCF-Empfänger |
Umbau bisherige Elektro-Installation AF104 von 2-Draht Außenfühler auf 3-Draht für 5V DCF Digitalsignal |
2009-12-30 |
Installation Öl Messer |
Zubehör |
2010-01-01 |
Anbindung an TC65Terminal |
Erste Status-Abfrage per SMS |
# |
Function |
Item |
Remark |
section |
Date |
0 |
Literaturbeschaffung |
--- |
Internet Recherge |
|
2009-01-03 |
1 |
Analyse - Physical Layer |
|
|
|
|
2 |
Simulation RS232 Konverter |
|
|
|
|
3 |
Versuchsaufbau |
|
|
|
|
4 |
Messdatenerfassung |
|
|
|
|
5 |
Analyse Messdaten |
|
|
|
|
6 |
Hardware RS232 Konverter |
|
|
|
|
7 |
Aufzeichnung Betriebsdaten |
|
|
|
|
|
|
|
|
|
|
See below
No. |
Task |
Due date |
Date impl. |
|
|
2008-00-00 |
2008-00-00 |
|
|
|
|
|
|
|
|
Geplant ist zunächst nur eine passive Abfrage der vorhandenen Regelparameter.
Die vorhandene Anlage ist von der Firma Vaillant Type icoVIT (Baujahr 2005) mit witterungsgeführter Regeleinheit VRC-410s.
Die V
Das Installationshandbuch / Internetrecherche ergab keine Zuordnung der 3 Klemmen zu einer Signalart bzw. Signalzuordnung. Lediglich die Kennzeichnung, dass es sich um eine 24V Gleichspannungsschnittstelle handelt. Auswertung mittels Spannungsmesser ergab sowohl für Klemme 7 als auch Klemme 8 eine Spannungsdifferenz von ca. 22V gegen Klemme 9 = Signalground. Messungen gegen Signalground der iroVIT-Steuerplatine bestätigten die Annahme.
Allgemeines Datenformat
Ausgemessene Bitlänge = 416µs. Das ergibt 2400Bd. Start/Stop Format ist 8bit ohne partity +1Stopbit. D.h. die Gesamtlänge eines Bytes beträgt 4,16ms
Pro Intervall werden immer 8 Datagramme übertragen.
Für das 1. Datagramm werden 6Byte übertragen (Übertragungszeit 25ms)
Für Darstellung am Oszilloskop wird eine horizontale Auflösung von 4ms gewählt.
Hinweis:
zum Auslesen der einzelnen Bits die Lupenfunktion (Sektion: Horizontal) verwenden.
Ggf. Cursor zur Orientierung setzen (8bit * 417µs = 33ms reine Nutzdaten). Wenn die z.B. die Nutzdatenzeit eingestellt wird können im Cursor-Modus = “Modus gekoppelt“ beide Cursor im festen Abstand weiter verschoben werden.
Hinweis 2:
Die Funktionsbeschreibung der einzelnen Datenbytes wurden erst nach und nach je nach Analysestand ermittelt und in der folgenden Ausstellung hinzugefügt. Zum Zeitpunkt der Erstanalyse mittels Oszilloskop war die Bedeutung dieser Datenbytes noch nicht bekannt.
1. Datagramm
01100000 = 60 => 06
01000000 = 40 => 02
00000000 = 00 => 00
11000000 = C0 => 03
01110111 = 77 => EE
00011001 = 1A => 98
Zum Triggern des zweiten Datagramm wird demnach eine Holdoff-Zeit von >25ms benötigt.
2. Datagramm
00100001 = 21 => 84
00000000 = 00 => 00
01000000 = 40 => 02
00001001 = 0A => 90
Zum Triggern des 3. Datagramms wird eine Holdoff-Zeit von größer 25+17 ms = 42ms benötigt
(siehe Tabelle
unten).
Die Zeit zwischen dem 1. und 2. Datagramm beträgt im ausgemessenen Beispiel 40
ms.
3. Datagramm (6 Byte)
01100000 = 60 => 06
01000000 = 40 => 02
00000000 = 00 => 00
11000000 = C0 => 03
01001111 = 4F => E2
00100001 = 21 => 84
Anm.: Datagramm 3 zeigt Ähnlichkeiten im Format. Es könnte sich um die Anwort in Gegenrichtung handeln. Vergleiche auch Datagramm 2 mit Datagramm 8.
4. Datagramm (26 Byte)
01011001 = 5A => 9A
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
00000000 = 00 => 00
01001001 = 6A => 92
01010101 = 55 => AA
00000000 = 00 => 00 \
10001000 = 88 => 11 | Aussentemperatur
00000000 = 00 => 00
11000000 = C0 => 03 \
01110101 = 75 => A7 | Wassertemperatur
00000000 = 00 => 00
10100000 = A0 => 05 \
01110001 = 71 => 87 | Kesseltemperatur
00000000 = 00 => 00
11110101 = F5 => AF
Anm.: zum Analysezeitpunkt per Osziloskop-Auswertung konnten nur Änderungen im Datagramm 4 festgesteellt werden (ab Kennbyte AA).
5. Datagramm (12 Byte)
00110000 = 30 => 0C
01000000 = 40 => 02
00000000 = 00 => 00
11000000 = C0 => 03
10001111 = 8F => F1
10100000 = A0 => 05
00000101 = 05 => A0
00000000 = 00 => 00
Ggf Datagramm 5a ? Da ein zusätzliches Stoppsignal vorhanden.
10000000 = 80 => 01
00000000 = 00 => 00
00000000 = 00 => 00
11110010 = F2 => 4F
6. Datagramm (3 Byte)
11000001 = C1 => 83
00000000 = 00 => 00
11111000 = F8 => 1F
7. Datagramm (6 Byte)
01100000 = 60 => 06
00000000 = 00 => 00
00000000 = 00 => 00
Ggf 7a wegen zusätzlichem Stoppbit
00000000 = 00 => 00
00010000 = 10 => 08
00010110 = 16 => 68
8. Datagramm (4Byte)
00100001 = 21 => 84
00000000 = 00 => 00
10000000 = 80 => 01 Sommer-/Winterbetrieb
11000100 = C4 => 23
Achtung: ggf. muss noch die Zeit zwischen den Datagramme ermittelt werden und zu der jeweiligen Holdoff-sum zeit hinzuaddiert werden.
Zur weiteren Analyse:
· Adapter (Pegelkonverter) zur Anpassung an serielle Schnittstelle.
· Aufzeichnung der Binärdaten und Sortierung in die 8 einzelnen Datagramme (Excel oder separat erstelltes Java-Programm. Ggf. Auswertung einzelner Datagramme mit der Histogramm-Funktion des Hexeditor: HxD - Freeware Hex-Editor und Disk-Editor
· Analyse welche Datagramme wann ihre Inhalte ändern.
Die Ermittlung der mitteren Hold-off Zeiten erweist sich in so fern als schwierig, da ein deut
Der Projektumfang sieht vor die Datagramme des VRC 410 entweder über
· Monitorprogramm am Laptop (SerialSniffer) oder
· Speziell entwickeltes Java-Terminalprogramm (VRCMonitor)
· Im TC65 Terminal des AF104 Projektes
Aufzeichnen zu können.
Bislang wurden von den 67 Bytes der Gesamtzahl der Datagramm-Bytes folgende Parameter identifiziert:
# |
Function |
Data-gram No. |
Format |
Range (Byte position) |
Remarks |
|
Betriebsstatus |
D4 |
2 byte |
19 – 20 |
0-kein Heizbedarf |
|
DCF77 Status |
D4 |
1 byte |
22 |
|
|
DCF77 Sekunden |
D4 |
1 byte |
23 |
|
|
DCF77 Minuten |
D4 |
1 byte |
24 |
|
|
DCF77 Stunden |
D4 |
1 byte |
25 |
|
|
DCF77 Wochentag |
D4 |
1 byte |
26 |
|
|
DCF77 Tag |
D4 |
1 byte |
27 |
|
|
DCF77 Monat |
D4 |
1 byte |
28 |
|
|
DCF77 Jahr |
D4 |
1 byte |
29 |
|
|
Aussentemperatur |
D4 |
2 byte |
33 – 34 |
- 40 … +80°C |
|
Vorlauftemperatur |
D4 |
2 byte |
36 – 37 |
+50 … +82°C |
|
Speichertemperatur |
D4 |
2 byte |
39 – 40 |
|
|
Kesseltemperatur |
D4 |
2 byte |
|
|
|
Heizkurventemp.- Sollwert |
D4 |
2 byte |
48 - 49 |
+40 … +82°C |
|
|
|
|
|
|
|
X-Parameter |
D5 |
1 byte |
53 |
unbekannt |
|
|
|
|
|
|
|
Sommer-Winterbetrieb |
D8 |
1 byte |
66 |
0-Sommer / 1-Winter |
|
|
|
|
|
|
Zur Nutzung der eigenen Funkuhr Funktionalität der ironVIT – Anlage sind Änderungen in der vorhandenen Verkabelung notwendig. …
Speziell für die VRC-Datagramm-Analyse entwickeltes Java-Programm auf Laptop zur Bestimmung sich ändernder Bytewerte, Zuordnung zu entsprechenden Betriebsparametern. Speicherung der Rohdaten. Umwandlung der Daten zur Darstellung in einer grafischen Form.
Das Programm wurde bewusst in Java (SE) geschrieben um somit eine leichte Portierung in das TC65 Terminal (Java ME, IMP-NG, CLDC 1.1) zu gewährleisten
Der Pegelkonverter dient zur Umsetzung der gepulsten Gleichspannung in ein RS-232 kompatibles Format. Er soll ermöglichen, dass direkt ein Termialprogramm mit Auswertelogik angeschlossen werden kann.
Zur Aufzeichnung der VRC Rohdaten im TC65Terminal steht am TC65 nur eine serielle Schnittstelle von 19200 oder max. 115200 bit/s zur Verfügung. Da das VRC nur ca. alle 10 Sekunden eine Datensequenz von 67 Byte mit einer Datenrate von 2400 bit/s übertragen bekommt ist ein einfacher Schnittstellenumsetzer ohne großen Puffer (in Empfangsrichtung) ausreichend.
Die theor. Nettodatenrate beträgt: 67*8bit / 2400 bit/s
Anzeige zur direkten Ablesung der Gesamtverbrauch an Heizöl pro Ablseszeitraum. Aänlich dem Wasser- und Stromzählers soll hier eien Möglichkeit geschaffen werden, den Heizölverbrauch auf ähnliche Weise ermitteln und erfassen zu können.
Hintergrund:
Vorhandenes mobiles, manuelles Erfassungssytem (Apple iPhone) mit ersprechender Erfassungssoftware (App: pVerbrauch – osXwerk.de) und zentrale Ablage im Web (google docs)
Die Voltcraft ÖL-Verbrauchsanzeige (Bestell-Nr. 12 09 90 über www.conrad.de , Preis 12/2009: 19,95 EUR) ist ein spezieller Betriebsstundenzähler, der die ermittelten Brennerbetriebsstunden wahlweise auch in Kilogramm oder Litern anzeigen kann.
Bei Öl-Heizanlagen ist der Brennstoffverbrauch direkt proportional zur Laufzeit der Förderpunpe. D.h. der Öldurchsatz ist konstant und hängt nur vom verwendeten Brenner ab. Der Verbrauchswert (in kg/h) ist am Typenschild des Brenners angegeben.
Bild von Conrad einfügen
Auszug aus Original-Installationsanleitung iroVIT, Seite 16, Tabelle4.3 Belegung des Brennersteckers:
X9 Pin |
Funktion |
Signal-Richtung |
Kenn-zeichnung |
Bemerkungen |
1 |
Brenneransteuerung |
→ |
T2 |
|
2 |
Betriebsbereitschaft Brenner |
← |
T1 |
|
3 |
Betriebsrückmeldung Brenner |
← |
B4 |
|
4 |
Störmeldung Brenner |
← |
S3 |
|
5 |
Phase über STB an Brenner |
→ |
L |
|
6 |
Nullleiter |
→ |
N |
|
7 |
Schutzleiter |
→ |
PE |
|
a) Einsetzen
der Lithium-Batterie 3V (Typ 2032); Typ. Stromaufnahme 2,5µA.
Angegebene Batterielebensdauer 5 Jahre
b) Programmierung des Brennerdurchsatzes: (s. Auszug aus Bedienungsanleitung des Ölverbrauchsmessers). Einstellung im Bereich 1,45 .. 3,00 kg/h möglich. Abstufungen im Bereich von 0,05 kg/h (50 g/h) möglich. Angaben lt. Brenner-Typenschild 2,14 kg/h. Gewählte Einstellung: 2,15 kg/h
c) Rückstellfunktion aktivieren/deaktivieren
d) Mode auswählen: Es kann mittels der Mode-Taste zwischen Betriebsstunden (Anzeige H), Verbrauch in Kilogramm (Anzeige KG) oder Verbrauch in Litern (Anzeige L) ausgewählt werden. Die Umschaltung des Anzeigemodus kann zu beliegbigen Zeiten erfolgen.
Einbaumaße des Displays (Snap-in Fassung): 69 x 33 mm.
Als Installationsort kann der betriebsfertige Ölverbrauchsmesser direkt in die Nähe der Steuerungseinheit des iroVIT Brenners montiert werden oder separat in die Hutschieneneinheit des VCR-Monitors. Der Hutschienen-Montage wurde der Vorzug gegeben, da es zum einem besser auf Sichthöhe des Ablesepersonals liegt und zum anderen keine bauliche Veränderung am iroVIT Bedienungseinheit verursacht. Nachteil: Die Einbautiefe des Ölverbrauchsmessers von 74 mm bedeutet einen Umbau des CE-Zertifizierten Komplettgerätes indas nur 71mm tiefe Hutschienengehäuse und damit den Wegfall der CE-Zulassung. Im Privatbereich jedoch zulässig. Insbesondere werden CE relevente Teile wie EMV zwar verändert, jedoch hier außerhalb der rReichweite z.B. des DCF77-Empfängers oder der iroVIT Steuerung.
Heizöl Extra Leicht (EL) Quelle: Wikipedia
Heizöl |
|||||||
Andere Namen |
HEL, IGO (Industrial Gasoil) |
||||||
Kurzbeschreibung |
Brennstoff für den privaten Gebrauch; farblose bis gelbliche Flüssigkeit mit charakteristischem Mineralölgeruch [1] |
||||||
68476-30-2 |
|||||||
Eigenschaften |
|||||||
flüssig |
|||||||
6,0 mm2/s (20 °C) max[2] |
|||||||
0,820–0,860 kg/l (15 °C) [1] |
|||||||
36,0 MJ/l = 42,6 MJ/kg (bei 0,845 kg/l) [2] |
|||||||
38.4 MJ/l = 45,4 MJ/kg (bei 0,845 kg/l) [2] |
|||||||
170–390 °C [1] |
|||||||
>55 °C [2] |
|||||||
220 °C [1] |
|||||||
T3 [1] |
|||||||
Kohlendioxidemissionen bei Verbrennung |
2,65 kg/l |
||||||
Sicherheitshinweise |
|||||||
|
|||||||
1202 |
|||||||
30 |
DIN 51603-1 differenziert zwischen zwei Heizöl EL-Sorten: Heizöl EL (abgekürzt: HEL) und Heizöl EL schwefelarm. Die Bezeichnung "EL" steht für "extra leicht(flüssig)". ’’Heizöl EL’’ unterscheidet sich vom ’’Heizöl EL schwefelarm’’ durch seinen maximal zulässigen Schwefelanteil. Laut einem Entwurf für DIN 51603 Teil 1 darf Heizöl EL seit 1. Januar 2008 einen Schwefelanteil von maximal 1.000 mg/kg aufweisen, Heizöl EL schwefelarm maximal 50 mg/kg. Markenhersteller unterscheiden noch nach Art der Additivierung, so dass zurzeit folgende Qualitäten angeboten werden:
Anforderungen an den Schnittstellenwandler:
· 2 Schnittstellen RS-232 für Bitraten zwischen 2400 bis 115200 bit/s
· Geringe Stromaufnahme
· Hutschienen-Gehäuse
· Optional Speicherung von Betriebsparametern (Betriebsdauer Brenner, Ölverbrauch, etc.)
; Stückliste=D:\C-Control\VRC.2009-06-15\VRC-CCM128-2xRS232.2009-06-07.T3001 |
|||
; Datum=15.Juni.2009 18:12 |
|
||
; Variante=AllVars |
|
||
; Autor=Michael Gries |
|
||
; |
|
|
|
Pos |
Name |
Wert |
Gehäuse |
1 |
C1 |
100µF |
C_ELKO_RM5,08_DM7 |
2 |
C2 |
10µF |
C_ELKO_RM2,54_DM6 |
3 |
C3 |
100NF |
2,54X5,08_RM2,54 |
4 |
C4 |
100NF |
2,54X5,08_RM2,54 |
5 |
C5 |
100NF |
2,54X5,08_RM2,54 |
6 |
D1 |
Yellow |
LED_5MM_GELB |
7 |
D2 |
1N4007 |
D_RM12,7_DM3 |
8 |
IC1 |
MAX233CPP |
DIL20 |
9 |
K1 |
R5,08 |
ANSCHLUSSKLEMME_2 |
10 |
K2 |
R5,08 |
ANSCHLUSSKLEMME_2 |
11 |
K4 |
R5,08 |
ANSCHLUSSKLEMME_3 |
12 |
K5 |
R5,08 |
ANSCHLUSSKLEMME_3 |
13 |
K6 |
R5,08 |
ANSCHLUSSKLEMME_3 |
14 |
K7 |
R5,08 |
ANSCHLUSSKLEMME_3 |
15 |
R1 |
390 |
0207 |
16 |
S1 |
Boot |
TASTER_TAKTSCHALTER |
17 |
S2 |
Reset |
TASTER_TAKTSCHALTER |
18 |
T1 |
AN78M05 |
TO220 |
19 |
U1 |
C-Control_Mega128 |
C-CONTROL_MEGA128 |
20 |
UX1 |
K2X08_B |
2X08_BUCHSE |
21 |
UX2 |
K2X08_B |
2X08_BUCHSE |
22 |
UX3 |
K2X08_B |
2X08_BUCHSE |
23 |
UX4 |
K2X08_B |
2X08_BUCHSE |
24 |
X1 |
SUB-D_9Pol_S |
SUB-D_9POL_STIFT_STEHEND |
25 |
X2 |
SUB-D_9Pol_B |
SUB-D_9POL_BUCHSE_STEHEND |
26 |
XX1 |
K2X05_B |
2X05_BUCHSE |
27 |
XX2 |
K2X05_B |
2X05_BUCHSE |
28 |
Z1 |
Logo |
LOGO |
!PADS-POWERPCB-V3.0-MILS! DESIGN DATABASE ASCII FILE 2.0
*PART*
C1 C_ELKO_RM5,08_DM7
C2 C_ELKO_RM2,54_DM6
C3 2,54X5,08_RM2,54
C4 2,54X5,08_RM2,54
C5 2,54X5,08_RM2,54
D1 LED_5MM_GELB
D2 D_RM12,7_DM3
IC1 DIL20
K1 ANSCHLUSSKLEMME_2
K2 ANSCHLUSSKLEMME_2
K4 ANSCHLUSSKLEMME_3
K5 ANSCHLUSSKLEMME_3
K6 ANSCHLUSSKLEMME_3
K7 ANSCHLUSSKLEMME_3
R1 0207
S1 TASTER_TAKTSCHALTER
S2 TASTER_TAKTSCHALTER
T1 TO220
U1 C-CONTROL_MEGA128
UX1 2X08_BUCHSE
UX2 2X08_BUCHSE
UX3 2X08_BUCHSE
UX4 2X08_BUCHSE
X1 SUB-D_9POL_STIFT_STEHEND
X2 SUB-D_9POL_BUCHSE_STEHEND
XX1 2X05_BUCHSE
XX2 2X05_BUCHSE
Z1 LOGO
*NET*
*SIGNAL* GND
XX2.5 IC1.6 IC1.9 UX4.12 K1.2 K4.3 K5.3 T1.2 C1.2 S1.1 S2.1 C2.2 C3.1 C4.1 C5.1 XX1.5 X2.5 X1.5 K2.1
*SIGNAL* V-
IC1.17 IC1.12 K5.1 XX1.7 X1.7
*SIGNAL* V+
IC1.14 K5.2 XX1.4 X1.4
*SIGNAL* +5V
R1.2 IC1.7 UX4.10 T1.3 C2.1 C4.2 C5.2 K2.2
*SIGNAL* RESET
UX2.3 S2.2 X2.9 K6.2
*SIGNAL* PE1
IC1.1 UX1.15
*SIGNAL* PG3
UX2.5 D1.2
*SIGNAL* T2OUT
XX2.2 IC1.18 K4.1 X2.2
*SIGNAL* R2IN
XX2.3 IC1.19 K4.2 X2.3
*SIGNAL* R1IN
IC1.4 K7.1 XX1.2 X1.2
*SIGNAL* R2OUT
IC1.20 UX1.16
*SIGNAL* Vin
T1.1 C1.1 C3.2 D2.2
*SIGNAL* VDD
K1.1 D2.1
*SIGNAL* C2-
IC1.10 IC1.16
*SIGNAL* C2+
IC1.11 IC1.15
*SIGNAL* LED
R1.1 D1.1
*SIGNAL* R1OUT
IC1.3 UX2.11
*SIGNAL* Boot
UX1.12 S1.2 X2.1 K6.1
*SIGNAL* Mode
UX2.14 K6.3
*END*
Netzteil Hutschiene
Als Spannungsversorgung der Hutschienen-Module kommt ebenfalls ein Hutschienen-Modul als Netzteil zur Anwendung. Passend zum verwendeten Hutschienen-Gehäusedesign ist unter www.conrad.de ein entsprechendes Netzteil zur C-Control Familie verfügbar. Betriebsparameter 230V, +12V Sekundär, 125mA Dauerbelastungsstrom. Der Prototyp des RS-232 Konverters benötigt ca. 50mA. Es besteht somit noch genügend Reserve für Erweiterungen zur Verfügung.
Programmierung ab 19.04.2009. Verwendete IDE Version 1.77.
Ab 14.05.2009 steht neue IDE Version 2.0 zur Verfügung. Neue Library-Funktion Clock
Umstellung ab 24.05.2009. Vorteile: Schnellere Übertragung, da Interpreter nur dann erneut mit Übertragen wird, wenn eine neuere Version verwendet wurde.
/*
File: VRC.cc
Creation: 2009-04-19
Version: 9.12.27 (change #DEFINE VERSION below)
Author: Michael Gries (c)2009
IDE-Lib: 2.01 (27.06.2009)
*/
/*
Version history:
2009-04-19 Erstellung
2009-06-14 X-Parameter hinzu
2009-12-13 Versionsangabe im Zeitstempel
*/
// Generic Preprozessor: http://nothingisreal.com/gpp/gpp.html
//------------------------------------------------------------------------------
// Hauptprogramm
//
/*
Verwendete Module (in config entsprechender Reihenfolge):
VRC.cc Hauptprogramm
Serial.cc 2xRS232 (Kommandointerpreter von TC65 Terminal)
Datagram.cc Datagramm-Anylsyse von iroVIT-Signal
Ports.cc Def. benutzter Mega128 Prots der C-Control Pro
Clock.cc internes Zeitmanagement
EEPROM.cc internes EEProm handling
Debug.cc Diagnoseprozeduren
DirectAccess.cc direkter Zugriff auf die Register des MEGA128
String_Lib.cc (explicit), d.h. nicht als Interpreter Lib eingebunden
ascii.ch (include Datei), ascii Zeichen
*/
/*
Signature Bytes
All Atmel microcontrollers have a three-byte signature code
which identifies the device. This code can be read in both serial and
parallel mode, also when the device is locked.
The three bytes reside in a separate address space.
For the ATmega128 the signature bytes are:
1. $000: $1E (indicates manufactured by Atmel)
2. $001: $97 (indicates 128KB Flash memory)
3. $002: $02 (indicates ATmega128 device when $001 is $97)
*/
#include ascii.ch // ASCII Steuerzeichen
#define PRJ "VRC"
#define PROJECT "VRC-Monitor"
#define VERSION "9.12.27"
#define AUTHOR "Michael Gries"
#define COPYRIGHT "(c)2009"
#define LIBRARY "2.01 (27.06.2009)"
#define TRACE false
char buffer0[255];
char buffer1[255];
char message[255];
char filename[128];
char function[128];
void main(void)
{
int sz;
int inv; inv=1;
word wsz;
byte bsz;
word ws0;
byte bs0;
unsigned char value[5];
int count;
byte mode;
/*
Initialisierungen
*/
Ports_InitVRC();
Clock_InitVRC();
DebugMode=0; // Debug mode deactivated - press 'D' for activation
TraceMode=1; // Trace mode activated - press 'T' for deactivation
ATempMin=0x0555;
ATempMax=0x0016;
KTempMin=0x0666;
KTempMax=0x0022;
WTempMin=0x0777;
WTempMax=0x0011;
Brenner=0x0000; BrennerDauer=0x0000;
mode = Ports_GetMode();
int baud; baud=mode;
message="\r\nMode: ";
Str_WriteInt(baud,message,STR_APPEND);
Serial_WriteText(0,message); // Text über RS232 ausgeben
char sline[8];
filename=__FILE__;
function=__FUNCTION__;
char nachricht[100]; nachricht=PROJECT; sline=__LINE__; //an dieser Stelle
//debug(__LINE__,__FILE__,"Test");
//EEPROM_Init();
//resetEEPROM(); // auskommentieren nach Produktstionsstart
Serial_InitVRC(baud);
//prnBetriebsstunden();
float bs;
/* Test EEProm
bs = EEPROM_GetBetriebsstunden(); bs=bs+0.16;
EEPROM_SetBetriebsstunden(bs);
*/
Debug(sline,function,nachricht);
char para2[10]; Str_WriteWord(SR_BD19200,10,para2,0,6);
Str_Copy(nachricht,para2,0); sline=__LINE__;
Debug(sline,function,nachricht);
/*
message="\r\nWait 2 seconds ...\r\n";
Serial_WriteText(0,message); // Text über RS232 ausgeben
AbsDelay(1000); // 1 Sek. Wartezeit
// Abfrage wieviel Zeichen empfangen wurden
count=Serial_IRQ_Info(0,RS232_FIFO_RECV);
// Die Anzahl der Zeichen wird als Meldung ausgegeben
Msg_WriteWord(count);
Serial_WriteHex(0,count);
message=" Zeichen im IRQ-Modus empfangen\r\n\n";
Msg_WriteText(message);
Serial_WriteText(0,message);
*/
Debug_Info();
AbsDelay(1000); // 1 Sek. Wartezeit
Debug_ModeDeactivate();
while(true) // Endlosschleife
{
Serial_HandleVRCdata(); // periodische Daten von der iroVIT-Anlage
Serial_HandleCommands(); // Statusabfragen vom PC oder TC65T
} // end while
}
/*
File: Serial.cc
Creation: 2009-05-22
Version: 9.12.26
Author: Michael Gries (c)2009
*/
/*
Version history:
2009-05-22 Erstellung
2009-12-26 Bug beseitigt wenn erstes Zeichen FF
*/
void Serial_InitVRC(int baud)
{
// Serial 0 (to PC or TC65Terminal)
#define TC65T PC
#define PC 0
if(baud==1)
{
Serial_Init_IRQ(0,buffer0,100,100,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD19200);
}else
{
Serial_Init_IRQ(0,buffer0,100,100,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD115200);
}
// Serial 1 (from iroVIT-VRC interface)
#define VRC 1
Serial_Init_IRQ(VRC,buffer1,100,100,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD2400);
}
void Serial_HandleCommands(void)
{
word w; w=Serial_ReadExt(PC); // read TC65T Command-buffer
if(!(w==0x100))
{
switch(w)
{
case '?':
case 'h':
case 'H': Debug_Help(); break;
case 'd': Debug_ModeDeactivate(); break;
case 'D': Debug_ModeActivate(); break;
case 'a': EEPROM_PrintAussentempMin(); break;
case 'A': EEPROM_PrintAussentempMax(); break;
case 'b':
case 'B': EEPROM_PrintBetriebsstunden(); break;
case 'c': Clock_PrintTimestamp(); break;
case 'i': Debug_Info(); break;
case 'k': EEPROM_PrintKesseltempMin(); break;
case 'K': EEPROM_PrintKesseltempMax(); break;
case 'w': EEPROM_PrintWassertempMin(); break;
case 'W': EEPROM_PrintWassertempMax(); break;
case 't': Debug_TraceModeActivate(); break;
case 'T': Debug_TraceModeDeactivate(); break;
case '~': Datagram_SMSdata(); break;
case ESC:
case TAB: Serial_WriteNewLine(); break;
case SP: Serial_WriteMarkLine(); break;
case 0x30: Serial_Write(0,'0'); break;
case 0x31: Serial_Write(0,'1'); break;
case 0x32: Serial_Write(0,'2'); break;
case 0x33: Serial_Write(0,'3'); break;
case 0x34: Serial_Write(0,'4'); break;
case 0x35: Serial_Write(0,'5'); break;
case 0x36: Serial_Write(0,'6'); break;
case 0x37: Serial_Write(0,'7'); break;
case 0x38: Serial_Write(0,'8'); break;
case 0x39: Serial_Write(0,'9'); break;
//default: Serial_Write(0,w); // for test purposes only
}
}
}
void Serial_HandleVRCdata(void)
{
char Text1[40]; // Array deklariert
char ausgabe[40];
int sz;
int inv; inv=1;
word wsz; byte bsz;
unsigned char value[5];
int dCount;
wsz=Serial_ReadExt(VRC); // Puffer auslesen
if(!(wsz==0x100)) //0x100 == Puffer leer
{
Ports_SetLED();
bsz=wsz;
datagram[pos++]=bsz;
if((pos==1) && (bsz==0xFF)) // bekannter Übertragungsfehler
{
Serial_ErrorFF();
Ports_ResetLED();
pos=0;
}
//datagram[count]=wsz;
message="#";
//Str_Copy(datagram,message,STR_APPEND);
//count=count+1;
if(DebugMode)
{
Str_WriteWord(wsz,16,value,0,2); //formatiert ausgeben
Serial_WriteText(PC,value);
Serial_Write(PC,' '); Serial_Write(0,' ');
// Formatierung nach Datagram-Grenzen (Nr. 1-3,4,5-6,7-8
if((pos==16)||(pos==31)||(pos==42)||(pos==57))
{
Serial_WriteNewLine();
}
} else
{
if(TraceMode)
{
Serial_Write(0,bsz);
}
}
if((wsz==0x22 || wsz==0x23) && (pos>60))
{
Ports_ResetLED();
if(DebugMode)
{
Serial_WriteNewLine();
//wsz=sizeof(datagram)*SIZE;
message="Anzahl Datagram-Bytes: ";
Serial_WriteText(0,message);
Serial_WriteInt(0,pos);
Serial_WriteNewLine();
AbsDelay(300);
//clearDatagram();
//setDatagram();
//Serial_WriteText(0,datagram);
//Datagram_Debug();
}
Datagram_Analyse();
if(DebugMode)
{
Datagram_Print();
AbsDelay(200);
Serial_WriteMarkLine();
Serial_WriteNewLine();
}
pos=0;
}
} // end serial 1 read
}
void Serial_WriteHex(byte ser, word value)
{
char sValue[10];
Str_WriteWord(value,16,sValue,0,4);
Serial_WriteText(ser,sValue);
}
void Serial_WriteInt(byte ser, word value)
{
char sValue[10];
Str_WriteWord(value,10,sValue,0,1);
Serial_WriteText(ser,sValue);
}
void Serial_WriteNewLine(void)
{
Serial_Write(0,LF); Serial_Write(0,CR);
}
void Serial_WriteMarkLine(void)
{
#define TERMINALSIZE 80
Serial_WriteNewLine();
Clock_UpdateTimestamp(); // into global variable sTimestamp[]
char cAuthor[40]; cAuthor=" ";
Str_Copy(cAuthor,COPYRIGHT,STR_APPEND);
Str_Copy(cAuthor,", ",STR_APPEND);
Str_Copy(cAuthor,AUTHOR,STR_APPEND);
Str_Copy(cAuthor," ",STR_APPEND);
unsigned int a; a=Str_Len(cAuthor);
char cVersion[20]; cVersion=" ";
Str_Copy(cVersion,PRJ,STR_APPEND);
Str_Copy(cVersion," ",STR_APPEND);
Str_Copy(cVersion,VERSION,STR_APPEND);
Str_Copy(cVersion," ---",STR_APPEND);
unsigned int v; v=Str_Len(cVersion);
message="--- ";
Str_Copy(message,sTimestamp,STR_APPEND);
unsigned int t; t=Str_Len(message);
unsigned int f; f=TERMINALSIZE-t-v-a-3;
char cLine[255]; Str_Fill(cLine,'-',f);
Str_Copy(message,"---",STR_APPEND);
Str_Copy(message,cAuthor,STR_APPEND);
Str_Copy(message,cLine,STR_APPEND);
Str_Copy(message,cVersion,STR_APPEND);
Serial_WriteText(0,message);
Serial_WriteNewLine();
}
void Serial_ErrorFF(void)
{
Serial_WriteNewLine();
Serial_WriteText(PC,"Bus Error 0xFF at ");
Clock_UpdateTimestamp(); // into global variable sTimestamp[]
Serial_WriteText(PC,sTimestamp);
Serial_WriteNewLine();
// Abfrage wieviel Zeichen empfangen wurden
word cntBuffer;
cntBuffer=Serial_IRQ_Info(VRC,RS232_FIFO_RECV);
AbsDelay(100);
Serial_WriteText(PC,"No of received characters: ");
Serial_WriteInt(PC,cntBuffer);
Serial_WriteNewLine();
while(false) // endlosschleife
{
Serial_Write(PC,'.');
AbsDelay(60000);
}
}
/*
File: Datagram.cc
Creation: 2009-05-24
Version: 9.12.27
Author: Michael Gries (c)2009
*/
/*
Version history:
9.5.24 Datagram analysis added
9.6.6 Char parameterInfo[] added -> Parameter interpretaion
9.6.14 X-Parameter added (veränderlicher unbekannter Parameter)
9.6.16 Wochentag encoding added
9.6.21 Wassertemp Min/Max added
9.12.13 bug fix negative temperature
9.12.27 Datagram_SMSdata() hinzu
*/
#define SIZE 67
#define posSTATUS 18 // Position Heizstatus
#define posDCF 21 // DCF77 Status
#define posSEK 22 // Sekunden (BCD)
#define posMIN 23 // Minute (BCD)
#define posSTD 24 // Stunde (BCD)
#define posWO 25 // Wochentag (0-6 = M0-S0)
#define posTAG 26 // Tag (BCD)
#define posMON 27 // Monat (BCD)
#define posJAH 28 // Jahr (BCD-zweistellig)
#define posAT 32 // Position Aussentemp
#define posWT 35 // Position Wassertemp
#define posKT 38 // Position Kesseltemp
#define posHK 47 // Position Heizkurve
#define posXPara 52 // Position unbekannter Parameter
#define posWB 64 // Position Winterbetrieb
byte datagram[SIZE];
char parameterInfo[60];
char datavalueInfo[60];
char SMSdata[255];
unsigned int pos;
word Status;
word Brenner; word BrennerLast; word BrennerDauer;
byte DCFstatus;
byte Sek; byte Min; byte Std;
byte Tag; byte Monat; byte Jahr;
byte Wochentag; char WOT[3];
word ATemp; word ATempMin; word ATempMax;
word WTemp; word WTempMin; word WTempMax;
word KTemp; word KTempMin; word KTempMax;
word HKurve;
word Betriebsart;
word XPara;
void Datagram_Clear(void)
{
for(pos=0;pos<SIZE;pos++) datagram[pos]=0;
}
void Datagram_Set(void)
{
for(pos=0;pos<SIZE;pos++) datagram[pos]=0x23; // '#'
}
void Datagram_Debug(void)
{
word w; char s[5];
for(pos=0;pos<SIZE;pos++)
{
w=datagram[pos];
Str_WriteWord(w,16,s,0,2);
Serial_WriteText(0,s);
AbsDelay(10); // wichtig: Verzögerung TODO: tuning
}
}
void Datagram_Analyse(void)
{
Status= Datagram_Word(posSTATUS);
DCFstatus= Datagram_Byte(posDCF);
Sek= Datagram_Byte(posSEK);
Min= Datagram_Byte(posMIN);
Std= Datagram_Byte(posSTD);
Wochentag= Datagram_Byte(posWO);
Tag= Datagram_Byte(posTAG);
Monat= Datagram_Byte(posMON);
Jahr= Datagram_Byte(posJAH);
ATemp= Datagram_Word(posAT);
WTemp= Datagram_Word(posWT);
KTemp= Datagram_Word(posKT);
HKurve= Datagram_Word(posHK);
XPara= Datagram_Word(posXPara);
Betriebsart= Datagram_Word(posWB);
Datagram_TestATemp();
Datagram_TestKTemp();
Datagram_TestWTemp();
Datagram_TestBetriebsstunden();
}
void Datagram_Print(void)
{
AbsDelay(500); // wichtig: Verzögerung TODO: tuning
message="\r\nVRC-Status : ";
Serial_WriteText(0,message);
Serial_WriteHex(0,Status);
Datagram_InfoStatus();
Serial_WriteText(0,parameterInfo);
message="\r\nBrenndauer : ";
Serial_WriteText(0,message);
Serial_WriteHex(0,BrennerDauer);
Datagram_InfoBrennerDauer();
Serial_WriteText(0,parameterInfo);
message="\r\nDCF-Status : ";
Serial_WriteText(0,message);
Serial_WriteHex(0,DCFstatus);
Datagram_InfoDCF();
Serial_WriteText(0,parameterInfo);
AbsDelay(500); // wichtig: Verzögerung TODO: tuning
message="\r\nDCF77 Zeit : ";
Serial_WriteText(0,message);
Datagram_InfoWochentag();
Str_Printf(message,"20%02d-%02d-%02d %s %02d:%02d:%02d ",
Jahr,Monat,Tag,WOT,Std,Min,Sek);
Serial_WriteText(0,message);
Clock_SetDCF77();
message="\r\nAussentemp.: ";
Serial_WriteText(0,message);
Serial_WriteHex(0,ATemp);
Datagram_InfoTemp(ATemp);
Serial_WriteText(0,parameterInfo);
message="\r\nWassertemp.: ";
Serial_WriteText(0,message);
Serial_WriteHex(0,WTemp);
Datagram_InfoTemp(WTemp);
Serial_WriteText(0,parameterInfo);
message="\r\nKesseltemp.: ";
Serial_WriteText(0,message);
Serial_WriteHex(0,KTemp);
Datagram_InfoTemp(KTemp);
Serial_WriteText(0,parameterInfo);
message="\r\nHeiz-Kurve : ";
Serial_WriteText(0,message);
Serial_WriteHex(0,HKurve);
Datagram_InfoTemp(HKurve);
Serial_WriteText(0,parameterInfo);
message="\r\nX-Parameter: ";
Serial_WriteText(0,message);
Serial_WriteHex(0,XPara);
//Datagram_InfoTemp(XPara);
//Serial_WriteText(0,parameterInfo);
AbsDelay(500); // wichtig: Verzögerung TODO: tuning
message="\r\nBetriebsart: ";
Serial_WriteText(0,message);
Serial_WriteHex(0,Betriebsart);
Datagram_InfoBetriebsart();
Serial_WriteText(0,parameterInfo);
Serial_WriteNewLine();
Serial_WriteNewLine();
}
word Datagram_Word(unsigned int ind)
{
word wh; word wl;
wh=datagram[ind]; wh=wh<<8;
wl=datagram[ind+1];
return wh+wl;
}
byte Datagram_Byte(unsigned int ind)
{ // 9.6.7
byte b;
b=datagram[ind];
return b;
}
void Datagram_InfoBetriebsart(void)
{ // 9.6.6
parameterInfo=" ";
switch(Betriebsart)
{
case 0x00: parameterInfo=" = Sommerbetrieb"; break;
case 0x01: parameterInfo=" = Winterbetrieb"; break;
}
}
void Datagram_InfoStatus(void)
{ // 9.6.6
parameterInfo=" ";
switch(Status)
{
case 0x0000: parameterInfo=" = Bereitschaft";break;
case 0x0001: parameterInfo=" = Heizbetrieb"; break;
case 0x0002: parameterInfo=" = Warmwasser"; break;
case 0x0400: parameterInfo=" = Warmwasser (Pumpenachlauf)"; break;
case 0x0402: parameterInfo=" = Warmwasser (und Pumpe)"; break;
}
}
void Datagram_InfoBrennerDauer(void)
{ // 9.6.6
parameterInfo=" ";
if(BrennerDauer)
{
parameterInfo=" = Brenner aktiv";
} else
{
parameterInfo=" = Brenner aus";
}
}
void Datagram_InfoDCF(void)
{ // 9.6.6
parameterInfo=" ";
switch(DCFstatus)
{
case 0x00: parameterInfo=" = kein Empfang"; break;
case 0x01: parameterInfo=" = Empfang"; break;
case 0x02: parameterInfo=" = Synchonisierung"; break;
case 0x03: parameterInfo=" = Signal gueltig"; break;
}
}
void Datagram_InfoWochentag(void)
{ // 9.6.16
WOT="--";
switch(Wochentag)
{
case 0x00: WOT="Mo"; break;
case 0x01: WOT="Di"; break;
case 0x02: WOT="Mi"; break;
case 0x03: WOT="Do"; break;
case 0x04: WOT="Fr"; break;
case 0x05: WOT="Sa"; break;
case 0x06: WOT="So"; break;
}
}
void Datagram_InfoTemp(word temp)
{ // 9.6.6
#define DIVIDER 16
#define OFFSET 0.0
int g; g=temp; // due to 16bit value signed
float f; f=g;
f=f/DIVIDER+OFFSET;
Str_Printf(parameterInfo," (%03.1f`C)",f);
Str_Printf(datavalueInfo,"%03.1f°C \r\n",f);
// note: char '`' instead of '°' due to valid ascii range 0..128
}
void Datagram_TestATemp(void)
{ // 9.6.7
#define DIVIDER 16
#define OFFSET 0.0
/*
Serial_WriteHex(0,ATemp);
Serial_WriteHex(0,ATempMin);
Serial_WriteHex(0,ATempMax);
*/
float f; f=ATemp; f=f/DIVIDER+OFFSET;
if(ATemp<ATempMin)
{
EEPROM_SetAussentempMin(f);
ATempMin=ATemp;
}
if(ATemp>ATempMax)
{
EEPROM_SetAussentempMax(f);
ATempMax=ATemp;
}
}
void Datagram_TestKTemp(void)
{ // 9.6.7
#define DIVIDER 16
#define OFFSET 0.0
/*
Serial_WriteHex(0,KTemp);
Serial_WriteHex(0,KTempMin);
Serial_WriteHex(0,KTempMax);
*/
float f; f=KTemp; f=f/DIVIDER+OFFSET;
if(KTemp<KTempMin)
{
EEPROM_SetKesseltempMin(f);
KTempMin=KTemp;
}
if(KTemp>KTempMax)
{
EEPROM_SetKesseltempMax(f);
KTempMax=KTemp;
}
}
void Datagram_TestWTemp(void)
{ // 9.6.21
#define DIVIDER 16
#define OFFSET 0.0
/*
Serial_WriteHex(0,WTemp);
Serial_WriteHex(0,WTempMin);
Serial_WriteHex(0,WTempMax);
*/
float f; f=WTemp; f=f/DIVIDER+OFFSET;
if(WTemp<WTempMin)
{
EEPROM_SetWassertempMin(f);
WTempMin=WTemp;
}
if(WTemp>WTempMax)
{
EEPROM_SetWassertempMax(f);
WTempMax=WTemp;
}
}
void Datagram_TestBetriebsstunden(void)
{ // 9.6.21
#define DIVIDER 60 //hex value in seconds -> set to minutes
#define OFFSET 0.0
Brenner = Status & 0x000F; // !=0 wenn aktiv
if(!Brenner && BrennerLast) // Wechsel auf Brenner aus
{
float f; f=BrennerDauer; f=f/DIVIDER+OFFSET;
float b;
b = EEPROM_GetBetriebsstunden();
b = b + f;
EEPROM_SetBetriebsstunden(b);
BrennerDauer=0;
}
if(Brenner && !BrennerLast) // Wechsel auf Brenner an
{
BrennerDauer=0;
}
if (Brenner && BrennerLast) // Brenner noch aktiv
{
BrennerDauer = BrennerDauer + 0x000A;
}
BrennerLast = Brenner;
}
void Datagram_SMSdata(void)
{ // 9.12.27
#define SMSMAXLENGTH 160
SMSdata="Status Heizung:\r\n";
Str_Copy(SMSdata,"Aussentemperatur: ",STR_APPEND);
Datagram_InfoTemp(ATemp);
Str_Copy(SMSdata,datavalueInfo,STR_APPEND);
Str_Copy(SMSdata,"Wassertemperatur: ",STR_APPEND);
Datagram_InfoTemp(WTemp);
Str_Copy(SMSdata,datavalueInfo,STR_APPEND);
Str_Copy(SMSdata,"Kesseltemperatur: ",STR_APPEND);
Datagram_InfoTemp(KTemp);
Str_Copy(SMSdata,datavalueInfo,STR_APPEND);
word l; l=Str_Len(SMSdata);
if(l>SMSMAXLENGTH)
{
Serial_WriteText(PC,"Maximum number of SMS characters exceeded");
}else
{
Serial_WriteText(PC,SMSdata);
}
}
/*
File: Ports.cc
Creation: 2009-05-03
Version: 9.6.6
Author: Michael Gries (c)2009
*/
/*
Version history:
9.5.3 LED feature added
9.5.23 Mode feature added
9.6.6 pre-processor define statements added:
concatenated: e.g. MODE -> PD5 -> 29(MEGA128)
*/
#define MODE PD5 // Mode (0=19k2 oder 1=115k2)
#define LED PG3 // LED (Datagram Empfang)
#ifdef MEGA128
#define PD5 29 // Mode (0=19k2 oder 1=115k2)
#define PG3 51 // LED (Datagram Empfang)
#endif
void Ports_InitVRC (void)
{
Port_DataDirBit(MODE,PORT_IN); // Mode
Port_WriteBit (MODE,1); // Mode (Pull-up aktivieren)
Port_DataDirBit(LED,PORT_OUT); // LED
}
byte Ports_GetMode(void)
{
return Port_ReadBit(MODE); // Betriebsart lesen
}
void Ports_SetLED(void)
{
Port_WriteBit(LED,PORT_ON); // LED an (active low)
}
void Ports_ResetLED(void)
{
Port_WriteBit(LED,PORT_OFF); // LED aus (active high)
}
/*
File: Clock.cc
Creation: 2009-05-24
Version: 9.5.24
Author: Michael Gries (c)2009
*/
// Interpreter Funktionen ab IDE 2.00 (14.05.2009):
// Clock_GetVal();
// Clock_SetDate();
// Clock_SetTime();
char sTimestamp[30]; // Format: "YYYY-MM-DD hh.mm.ss "
void Clock_InitVRC(void)
{ // 9.5.24
Clock_SetDate(24,05,09);
Clock_SetTime(21,34,55,0);
}
void Clock_UpdateTimestamp(void)
{
byte Y; byte M; byte D;
byte h; byte m; byte s;
Y=Clock_GetVal(CLOCK_YEAR);
M=Clock_GetVal(CLOCK_MON);
D=Clock_GetVal(CLOCK_DAY);
h=Clock_GetVal(CLOCK_HOUR);
m=Clock_GetVal(CLOCK_MIN);
s=Clock_GetVal(CLOCK_SEC);
sTimestamp="no clock";
Str_Printf(sTimestamp,"20%02d-%02d-%02d %02d:%02d:%02d ",Y,M,D,h,m,s);
}
void Clock_PrintTimestamp(void)
{
Clock_UpdateTimestamp(); // into global variable sTimestamp[]
Serial_WriteText(0,sTimestamp);
}
void Clock_SetDCF77(void)
{
if(DCFstatus==3)
{
Clock_SetDate(Tag,Monat,Jahr);
Clock_SetTime(Std,Min,Sek,0);
}
}
/*
File: EEPROM.cc
Creation: 2009-04-19
Version: 9.6.14
Author: Michael Gries (c)2009
*/
/*
Version history:
9.4.19 Betriebstunden added
9.5.22 Aussen-/Kesseltemperatur added
9.6.14 Warmwassertemperatur added
*/
// EEPROM: Datenspeicherung im internen EEPROM
// erforderliche Library: IntFunc_Lib.cc
// Globale Parameter
// Datenaufzeichnung alle 10 Sekunden
// *6[==min]*60[==h]*24[==d] = 8640 Datensätze pro Tag -> Speichergröße: word
#define adrBetriebsstunden 0x1000 // Datentyp float
#define adrAussentempMin 0x1010 // Datentyp float
#define adrAussentempMax 0x1020 // Datentyp float
#define adrWassertempMin 0x1030 // Datentyp float
#define adrWassertempMax 0x1040 // Datentyp float
#define adrKesseltempMin 0x1050 // Datentyp float
#define adrKesseltempMax 0x1060 // Datentyp float
word Datensatz;
float fBetriebsstunden; // max 65535[h] = 2730[D] = 91[M] = 7[Y]
float fAussentempMin; // -40.0 ... +80.0 °C
float fAussentempMax; // -40.0 ... +80.0 °C
float fWassertempMin; // +10.0 ... +70.0 °C
float fWassertempMax; // +10.0 ... +70.0 °C
float fKesseltempMin; // +32.0 ... +95.0 °C
float fKesseltempMax; // +32.0 ... +95.0 °C
void EEPROM_Init(void)
{
//adrBetriebsstunden=0x1000;
float fData;
char sData[80];
fData = EEPROM_GetBetriebsstunden();
fData = fData/10;
Str_WriteFloat(fData,1,sData,0);
char sUnit[8]; sUnit = " [h]";
Str_Copy(sData,sUnit,STR_APPEND);
Debug_Println(adrBetriebsstunden,sData);
}
void EEPROM_Reset(void)
{
EEPROM_SetBetriebsstunden(0.0);
EEPROM_SetAussentempMin(0.0);
EEPROM_SetAussentempMax(0.5);
EEPROM_SetWassertempMin(0.0);
EEPROM_SetWassertempMax(0.5);
EEPROM_SetKesseltempMin(0.0);
EEPROM_SetKesseltempMax(0.5);
}
void EEPROM_SetBetriebsstunden(float value)
{
EEPROM_WriteFloat(adrBetriebsstunden,value);
}
float EEPROM_GetBetriebsstunden(void)
{
fBetriebsstunden=EEPROM_ReadFloat(adrBetriebsstunden);
return fBetriebsstunden;
}
void EEPROM_PrintBetriebsstunden(void)
{
#define DIVIDER 60 // in minutes -> set in hours
#define OFFSET 0.0
float fData; fData = EEPROM_GetBetriebsstunden();
fData = fData/DIVIDER+OFFSET;
char sData[80]; sData="Betriebsstunden: ";
Str_WriteFloat(fData,3,sData,STR_APPEND);
char sUnit[8]; sUnit = " [h]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrBetriebsstunden,sData);
Debug_Send(adrBetriebsstunden,sData);
}
void EEPROM_SetAussentempMin(float value)
{
EEPROM_WriteFloat(adrAussentempMin,value);
}
void EEPROM_SetAussentempMax(float value)
{
EEPROM_WriteFloat(adrAussentempMax,value);
}
float EEPROM_GetAussentempMin(void)
{
fAussentempMin=EEPROM_ReadFloat(adrAussentempMin);
return fAussentempMin;
}
float EEPROM_GetAussentempMax(void)
{
fAussentempMax=EEPROM_ReadFloat(adrAussentempMax);
return fAussentempMax;
}
void EEPROM_PrintAussentempMin(void)
{
float fData; fData = EEPROM_GetAussentempMin();
char sData[30]; sData="AussentempMin: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrAussentempMin,sData);
Debug_Send(adrAussentempMin,sData);
}
void EEPROM_PrintAussentempMax(void)
{
float fData; fData = EEPROM_GetAussentempMax();
char sData[30]; sData="AussentempMax: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrAussentempMax,sData);
Debug_Send(adrAussentempMax,sData);
}
void EEPROM_SetWassertempMin(float value)
{
EEPROM_WriteFloat(adrWassertempMin,value);
}
void EEPROM_SetWassertempMax(float value)
{
EEPROM_WriteFloat(adrWassertempMax,value);
}
float EEPROM_GetWassertempMin(void)
{
fWassertempMin=EEPROM_ReadFloat(adrWassertempMin);
return fWassertempMin;
}
float EEPROM_GetWassertempMax(void)
{
fWassertempMax=EEPROM_ReadFloat(adrWassertempMax);
return fWassertempMax;
}
void EEPROM_PrintWassertempMin(void)
{
float fData; fData = EEPROM_GetWassertempMin();
char sData[20]; sData="WassertempMin: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrWassertempMin,sData);
Debug_Send(adrWassertempMin,sData);
}
void EEPROM_PrintWassertempMax(void)
{
float fData; fData = EEPROM_GetWassertempMax();
char sData[20]; sData="WassertempMax: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrWassertempMax,sData);
Debug_Send(adrWassertempMax,sData);
}
void EEPROM_SetKesseltempMin(float value)
{
EEPROM_WriteFloat(adrKesseltempMin,value);
}
void EEPROM_SetKesseltempMax(float value)
{
EEPROM_WriteFloat(adrKesseltempMax,value);
}
float EEPROM_GetKesseltempMin(void)
{
fKesseltempMin=EEPROM_ReadFloat(adrKesseltempMin);
return fKesseltempMin;
}
float EEPROM_GetKesseltempMax(void)
{
fKesseltempMax=EEPROM_ReadFloat(adrKesseltempMax);
return fKesseltempMax;
}
void EEPROM_PrintKesseltempMin(void)
{
float fData; fData = EEPROM_GetKesseltempMin();
char sData[20]; sData="KesseltempMin: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrKesseltempMin,sData);
Debug_Send(adrKesseltempMin,sData);
}
void EEPROM_PrintKesseltempMax(void)
{
float fData; fData = EEPROM_GetKesseltempMax();
char sData[20]; sData="KesseltempMax: ";
Str_WriteFloat(fData,1,sData,STR_APPEND);
char sUnit[8]; sUnit = " [`C]";
Str_Copy(sData,sUnit,STR_APPEND);
//println(adrKesseltempMax,sData);
Debug_Send(adrKesseltempMax,sData);
}
void EEPROM_WriteTimestamp(unsigned int adr)
{
EEPROM_Write(adr+4+1,Jahr);
EEPROM_Write(adr+4+2,Monat);
EEPROM_Write(adr+4+3,Tag);
EEPROM_Write(adr+4+4,Std);
EEPROM_Write(adr+4+5,Min);
EEPROM_Write(adr+4+6,Sek);
}
/*
File: Debug.cc
Creation: 2009-04-19
Version: 9.12.26
Author: Michael Gries (c)2009
*/
/*
Version history:
2009-04-19 Erstellung
2009-05-21 Debug_help() hinzu
2009-12-26 Debug_info() hinzu
*/
#ifdef MEGA128
#pragma Warning "Counter Funktionen nicht bei Timer0 und Mega128"
#endif
//#ifdef __DEBUG__
#pragma Message __DATE__
#pragma Message __TIME__
int DebugMode;
int TraceMode;
void Debug_ModeActivate(void)
{
DebugMode=1;
message="\r\nDebug mode activated ! - for deactivation press 'd'\r\n";
Serial_WriteText(0,message);
}
void Debug_ModeDeactivate(void)
{
message="\r\nDebug mode deactivated ! - for activation press 'D'\r\n";
Serial_WriteText(0,message);
DebugMode=0;
}
void Debug_TraceModeActivate(void)
{
TraceMode=1;
message="\r\nTrace mode activated ! - for deactivation press 'T'\r\n";
Serial_WriteText(0,message);
}
void Debug_TraceModeDeactivate(void)
{
message="\r\nTrace mode deactivated ! - for activation press 't'\r\n";
Serial_WriteText(0,message);
TraceMode=0;
}
void Debug(char sLine[], char sFunction[], char sMessage[])
{
char txt[81];
//Str_Fill(txt,' ',80);
Str_Copy(txt,sLine,0);
AbsDelay(1000);
Msg_WriteText(txt); // Zeilennummer ausgeben
Msg_WriteChar('-');
//Str_Copy(txt,sFunction,STR_APPEND);
Str_Copy(txt,sFunction,0);
Msg_WriteText(txt); // Funktionsnamenausgeben
Msg_WriteChar(':'); Msg_WriteChar(' ');
//Str_Copy(txt,sMessage,12);
Str_Copy(txt,sMessage,0);
Msg_WriteText(txt); // Nachricht ausgeben
Msg_WriteChar(13); // LF
AbsDelay(1000);
}
void Debug_Print(word adr, byte data)
{
Msg_WriteHex(adr); // Ausgabe der Adresse
Msg_WriteChar(':'); // Ausgabe: :
Msg_WriteHex(data); // Ausgabe des Adressinhaltes
Msg_WriteChar(0x20); // Ausgabe: Leerzeichen
}
void Debug_Println(word adr, char data[])
{
char mem[15]; mem="EEPROM-0x";
Msg_WriteText(mem); // Ausgabe des Adressinhaltes
Msg_WriteHex(adr); // Ausgabe der Adresse
Msg_WriteChar(':'); // Ausgabe: :
Msg_WriteChar(' '); // CR
Msg_WriteText(data); // Ausgabe des Adressinhaltes
Msg_WriteChar(0x20); // Ausgabe: Leerzeichen
Msg_WriteChar('\r'); // CR
Msg_WriteChar('\n'); // LF
}
void Debug_Send(word adr, char data[])
{
Serial_Write(0,CR); // CR
Serial_Write(0,LF); // LF
char mem[15]; mem="EEPROM-0x";
Serial_WriteText(0,mem); // Ausgabe des Adressinhaltes
Serial_WriteHex(0,adr); // Ausgabe der Adresse
Serial_Write(0,':'); // Ausgabe: :
Serial_Write(0,' '); // CR
Serial_WriteText(0,data); // Ausgabe des Adressinhaltes
Serial_Write(0,0x20); // Ausgabe: Leerzeichen
//Serial_Write(0,'\r'); // CR
}
void Debug_Help(void)
{
Serial_WriteNewLine();
message="Helpmenue \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="i - program info \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="D - debug mode activation \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="d - debug mode deactivation (default)\r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="T - trace mode deactivation \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="t - trace mode activation (default) \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="a - Aussentemperatur min \r\n";
Serial_WriteText(0,message);
message="A - Aussentemperatur max \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="k - Kesseltemperatur min \r\n";
Serial_WriteText(0,message);
message="K - Kesseltemperatur max \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="w - Wassertemperatur min \r\n";
Serial_WriteText(0,message);
message="W - Wassertemperatur max \r\n";
Serial_WriteText(0,message);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
message="b - Betriebsstunden \r\n";
Serial_WriteText(0,message);
Serial_WriteNewLine();
}
void Debug_Info(void)
{ //9.12.26
Serial_WriteNewLine();
Serial_WriteText(PC,PROJECT); Serial_WriteText(PC," version: ");
Serial_WriteText(PC,VERSION); Serial_WriteText(PC,CRLF);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
Serial_WriteText(PC,"Compilation: "); Serial_WriteText(PC,__DATE__);
Serial_WriteText(PC,"_");
Serial_WriteText(PC,__TIME__); Serial_WriteText(PC,CRLF);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
Serial_WriteText(PC,"Directory: ");
Serial_WriteText(PC,filename); Serial_WriteText(PC,CRLF);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
Serial_WriteText(PC,"Library: ");
Serial_WriteText(PC,LIBRARY); Serial_WriteText(PC,CRLF);
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
byte bFreq;
bFreq=DirectAccess_Frequency();
//MEGA128 14,7456MHz
#define OSC 14.7456
char cValue[20];
Str_Printf(cValue,"%2.4f MHz\r\n",OSC);
Serial_WriteText(PC,"Frequency: "); Serial_WriteText(PC,cValue);
Serial_WriteNewLine();
AbsDelay(100); // wichtig: Verzögerung TODO: tuning
Serial_WriteText(PC,COPYRIGHT); Serial_WriteText(PC,", ");
Serial_WriteText(PC,AUTHOR); Serial_WriteText(PC,CRLF);
}
/*
File: DirectAccess.cc
Creation: 2009-12-26
Version: 9.12.26
Author: Michael Gries (c)2009
*/
/*
Interpreter Funktionen ab IDE 2.0:
byte DirAcc_Read(byte register);
void DirAcc_Write(byte register, byte val);
for register details see section
'Register Summary' in ATmega128_datasheet.pdf
*/
#define OSCCAL 0x6F
byte DirectAccess_Frequency(void)
{ // 9.12.26
byte bReg;
bReg = DirAcc_Read(OSCCAL);
return(bReg);
}
/**************************************************************************
String Library
***************************************************************************/
//-------------------------------------------------------------------------
void Str_Fill(char dest[],char c,word len)
{
word i;
for(i=0;i<len;i++) dest[i]=c;
}
//-------------------------------------------------------------------------
int Str_SubStr(char source[],char search[])
{
int i,j,len;
char s,c,v;
s=search[0];
i=0;
do
{
c=source[i];
if(c==s)
{
j=1;
do
{
v=search[j];
} while(v && v==source[i+j++]);
if(!v) return(i);
}
i++;
} while(c);
return(-1);
}
//-------------------------------------------------------------------------
byte Str_Isalpha(char c)
{
return((c>='a' && c<='z') || (c>='A' && c<='Z'));
}
//-------------------------------------------------------------------------
byte Str_Isalnum(char c)
{
return((c>='0' && c<='9') || Str_Isalpha(c));
}
/*
File: ascii.ch
Creation: 2009-05-22
Version: 9.5.23
Author: Michael Gries (c)2009
*/
// C-Control Pro (Mega128) C-Compact definition file
#define NUL 0x00
#define TAB 0x09
#define CR '\r'
#define LF '\n'
#define CAN 0x18
#define ESC 0x1B
#define SP 0x20
#define DEL 0x7F
#define CRLF "\r\n"
///
--- 2009-05-24 21:37:52 --------------------------------------------------------
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00
00 00 00 00 00 00 00 00 00 00 92 AA 01 10 00 03 99 00 03 B2
00 0D 0C 02 00 03 F1 03 22 00 01 00 00 67 83 00 1F 06 00 00
00 08 68 84 00 01 23
Anzahl Datagram-Bytes: 67
VRC-Status : 0000
Aussentemp.: 0110 (17.0°C)
Wassertemp.: 0399 (57.6°C)
Kesseltemp.: 03B2 (59.1°C)
Heiz-Kurve : 0322 (50.1°C)
Betriebsart: 0001 = Winterbetrieb
--- 2009-05-24 21:38:03 --------------------------------------------------------
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00
00 00 00 00 00 00 00 00 00 00 92 AA 01 10 00 03 99 00 03 B2
00 0D 0C 02 00 03 F1 03 22 00 01 00 00 67 83 00 1F 06 00 00
00 08 68 84 00 01 23
Anzahl Datagram-Bytes: 67
VRC-Status : 0000
Aussentemp.: 0110 (17.0°C)
Wassertemp.: 0399 (57.6°C)
Kesseltemp.: 03B2 (59.1°C)
Heiz-Kurve : 0322 (50.1°C)
Betriebsart: 0001 = Winterbetrieb
--- 2009-06-15 23:46:19 --------------------------------------------------------
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84
9A 00 00 00 00 03 1D 2E 17 00 0F 06 09 00 92
AA 00 C8 00 03 B6 00 03 9D 00 06
0C 02 00 03 F1 00 A0 01 00 00 00 E3 83 00 1F
06 00 00 00 08 68 84 00 00 22
Anzahl Datagram-Bytes: 67
VRC-Status : 0000 = Bereitschaft
DCF-Status : 0003 = Signal gültig
DCF77 Zeit : 2009-06-15 23:46:29
Aussentemp.: 00C8 (12.5°C)
Wassertemp.: 03B6 (59.4°C)
Kesseltemp.: 039D (57.8°C)
Heiz-Kurve : 00A0 (10.0°C)
X-Parameter: 00E3 (10.0°C)
Betriebsart: 0000 = Sommerbetrieb
--- 2009-06-15 23:46:30 --------------------------------------------------------
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84
9A 00 00 00 00 03 28 2E 17 00 0F 06 09 00 92
AA 00 C8 00 03 B6 00 03 9D 00 FA
0C 02 00 03 F1 00 A0 01 00 00 00 E3 83 00 1F
06 00 00 00 08 68 84 00 00 22
Anzahl Datagram-Bytes: 67
VRC-Status : 0000 = Bereitschaft
DCF-Status : 0003 = Signal gültig
DCF77 Zeit : 2009-06-15 23:46:40
Aussentemp.: 00C8 (12.5°C)
Wassertemp.: 03B6 (59.4°C)
Kesseltemp.: 039D (57.8°C)
Heiz-Kurve : 00A0 (10.0°C)
X-Parameter: 00E3 (10.0°C)
Betriebsart: 0000 = Sommerbetrieb
--- 2009-06-15 23:46:41 --------------------------------------------------------
--- 2009-12-15 21:51:46 ---------------------------------------- VRC 9.12.13 ---
VRC-Konverter: Helpmenue
D - debug mode activation
d - debug mode deactivation
a - Aussentemperatur min/max
k - Kesseltemperatur min/max
w - Wassertemperatur min/max
b - Betriebsstunden
a - Aussentemperatur
--- 2009-12-15 21:51:49 ---------------------------------------- VRC 9.12.13 ---
--- 2009-12-15 21:53:12 ---------------------------------------- VRC 9.12.13 ---
EEPROM-0x1050: KesseltempMin: 69.2 [¦C]
EEPROM-0x1060: KesseltempMax: 81.9 [¦C]
--- 2009-12-15 21:53:13 ---------------------------------------- VRC 9.12.13 ---
EEPROM-0x1030: WassertempMin: 57.6 [¦C]
EEPROM-0x1040: WassertempMax: 57.6 [¦C]
--- 2009-12-15 21:53:15 ---------------------------------------- VRC 9.12.13 ---
EEPROM-0x1000: Betriebsstunden: 2335.4 [h]
--- 2009-12-15 21:53:19 ---------------------------------------- VRC 9.12.13 ---
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84
9A 00 00 00 00 03 15 35 15 01 0F 0C 09 00 92
AA FF F2 00 03 99 00 04 48 00 8E
0C 02 00 03 F1 04 B8 00 01 00 00 F6 83 00 1F
06 00 00 00 08 68 84 00 01 23
Anzahl Datagram-Bytes: 67
VRC-Status : 0000 = Bereitschaft
Brenndauer : 0000 = Brenner aus
DCF-Status : 0003 = Signal gueltig
DCF77 Zeit : 2009-12-15 Di 21:53:21
Aussentep.: FFF2 (-0.9`C)
Wassertemp.: 0399 (57.6`C)
Kesseltemp.: 0448 (68.5`C)
Heiz-Kurve : 04B8 (75.5`C)
X-Parameter: 00F6
Betriebsart: 0001 =
Winterbetrieb
Die vom TC65 Terminal empfangenen und im TC65-Verzeichnis ‚Storage’ gespeicherten Rohdaten werden in ein Javascript-Array Format umgeschrieben und an einen html-Server übertragen. Diese Javascript-Datei wird über eine html-include Funktion in das entprechende Javascript basierende html-Diagrammseite mit eingebunden.
Vorgesehene Diagramm-Darstellungen:
· Heizöl-Verbrauch [l] über Zeit [a]
· Betriebsparameter [°C] über Zeit [d]
Entwurfsbeispiele siehe Abbildungen x und y
Als preisgünstigen Einstieg wird das folgende Projectboard für die Prototypen-Erstellung angeboten. Conrad-Artikelnummer: 197313 -xx (Preis 03/2009: 14,95€)
Als Vorbereitung für die Entwicklung des VRC-Konverters wurde das Projectboard um folgende Funktionen erweitert:
Der Schaltplan, sowie der Bestückungsplan des Kaufteils sind in den folgenden beiden Abbildungen dargestellt.
Der VRC-Konverter kann über die zweite RS-232 Schnittstelle mit neuer Software geladen werden. Damit dies auch von „entfernter“ Stelle (bis ca. 10m) mittels Laptop möglich ist wurde ein spezielles Bootcable entwickelt, dass direkt zwischen Verbindungskabel und Laptop zwischengeschaltet wird. Es besitzt in den Stecker integrierte Schalter zum Rücksetzen (Reset) und Booten (Boot) des C-Control Mega128 Bausteins.
Hinweis:
Auf eine erweiterte Bootlogik wie im Projectboard ersichtlich wurde aufgrund der leichten Integrierbarkeit in den SUB-D Stecker verzichtet. Zum Booten müssen daher die beiden Knöpfe derart gedrückt werden, dass das Bootsignal etwas länger ansteht als das Reset-Signal. Die Praxis hat gezeigt, dass dies ohne weiteres leicht zu bewerkstelligen ist.
Foto:
Logfile SerialSniffer V1.40
More information can be found at : http://www.flache.de/Download/Shareware
created : 01.03.2009 21:11:18 by Abt. S2S
Remember to use a non-proportional characterset to view correctly !
01.03.2009 21:11:25:432
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 05 12 00 EF 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 05 12 00 EF 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 03 B6 00 05 0F 00 4C 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 03 B6 00 05 0F 00 4C 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 05 0F 00 D5 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 05 0F 00 D5 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 05 0D 00 D1 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B0 00 05 0D 00 B1 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 03 5D 00 05 0D 00 66 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 01 00 05 0A 00 1B 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 DE 00 04 E8 00 3E 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 BD 00 04 7A 00 65 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 A4 00 04 1E 00 24 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 8D 00 03 E0 00 7F 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 7A 00 03 B9 00 A3 0C 02 00 03 F1 05 A0 00 01 01 00 4D 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 67 00 03 A2 00 5C 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 58 00 03 94 00 EB 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 4C 00 03 8B 00 53 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 3D 00 03 86 00 16 0C 02 00 03 F1 05 A0 00 01 01 00 4D 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 30 00 03 84 00 5B 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 22 00 03 82 00 F7 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 18 00 03 84 00 E9 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 0B 00 03 87 00 C6 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 02 00 03 8E 00 44 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 01 F7 00 03 97 00 58 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 67 00 02 1F 00 03 A2 00 D5 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 85 00 03 AD 00 23 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 02 D1 00 03 B9 00 36 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 05 00 03 C6 00 1D 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 2C 00 03 D2 00 97 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 48 00 03 E2 00 E1 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 5F 00 03 EF 00 92 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 6F 00 03 FC 00 9F 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 7F 00 04 0B 00 6D 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 8B 00 04 1A 00 88 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 92 00 04 2A 00 61 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 02 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 99 00 04 38 00 F5 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 A0 00 04 46 00 6D 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 A7 00 04 55 00 3B 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 A7 00 04 62 00 55 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 AE 00 04 6D 00 DB 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 AE 00 04 75 00 EB 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 AE 00 04 7E 00 FD 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 AE 00 04 82 00 1C 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 04 87 00 8F 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 04 89 00 93 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 04 8B 00 97 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 04 8B 00 97 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23
06 02 00 03 EE 98 84 00 02 20 06 02 00 03 F2 84 9A 00 04 00 00 00 00 00 00 00 00 00 00 00 92 AA 00 64 00 03 B6 00 04 8B 00 97 0C 02 00 03 F1 05 A0 00 01 00 00 4F 83 00 1F 06 00 00 00 08 68 84 00 01 23