Sie sind hier: Home » Datenlogger V1 » Programm V1

'*******************************************************************************
'************                   DATENLOGGER   V1.5a              ***************
'*******************************************************************************

'>>>>>>>> wie V1.5, aber für den ATMega1284P-PU anstelle ATMega644-PU <<<<<<<<<<

'name                     : Datenlogger V1.5a.bas
'copyright                : (c) 30.06.2014 jep
'purpose                  : Datenlogger für Temperaturen und Zustände
'micro                    : Mega1284P-PU
'
'Changelog:        Vers. A: Ruheanzeige geändert auf: Aussen, Vorlauf, Wohnzimmer
'Changelog:        V1.1   : Vorlauf Rücklauf Aussen Nord angepasst      --> o.k.
'                           akt. Speicherplatz auf Dezimal umgestellt   --> o.k.
'                           Brennerstatus richtig programmiert          --> ?
'                           Versuch für dyn. 1wire-Ausgang              --> o.k.
'Changelog:        V1.2   : zusätzlich Rasenroboter in Garage programmiert
'Changelog:        V1.3   : zusätzlich I2C-Temp.-Sensoren integriert
'Changelog:        V1.4   : serielle Datenausleseroutine erweitert,
'                           z.T. Sub durch Goto ersetzt damit beim Timeout nichts auf dem Stack bleibt
'                           Timeout eingeführt; Erdsondentemperatur eingeführt
'Changelog:        V1.5:    Die neuen Adressen der 1-wire-Temp.Sensoren und Sole-Temp-Sensoren geändert.
'                           Texte und Reihenfolge angepasst
'                           28.1.15: Temperatur Erdsonde unten/oben verwechselt --> noch nicht korrigiert
'offene Probleme          : Funk noch nicht integriert
'
'-------------------------------------------------------------------------------

'Adresse der vorhandenen Bausteine DS18S20
'1 = 10297D9002080082 --> Heizung Vorlauf
'2 = 10D28F77020800E2 --> Heizung Rücklauf
'3 = 10078D770208004E --> Sole Vorlauf
'4 = 10401190020800E7 --> Sole Rücklauf
'5 = 10398D8D020800DA --> Aussensensor Nord-West
'6 = 105B1790020800D8 -->
'7 = 10C06490020800B2 -->
'8 = 103B90770208004E -->
'9 = 102C8A7702080051 -->
'
'
'Adresse der vorhandenen I2C-Temperatursensoren DS1621
'WHZ_Adr = 144 (90h)  --> Wohnzimmer Schreibadresse
'WHZ_Adr = 145 (91h)  --> Wohnzimmer Leseadresse
'_______________________________________________________________________________

$regfile = "m1284Pdef.dat"                                  'ATMEL Mega1284-PU
$crystal = 20000000                                         'mit 20 MHz-Clock
$hwstack = 40                                               'default use 32 for the hardware stack
$swstack = 16                                               'default use 10 for the SW stack
$framesize = 60                                             'default use 40 for the frame space
$baud = 19200                                               'serielle Schnittstelle

Declare Function Decigrades(BYVAL sc(9) as byte) as integer

'======================== Tastenkonfiguration ==================================
Config PortB.4 = Input                                      'Taste OK
PortB.4 = 1                                                 'Pullup
OK Alias PinB.4
Config PortB.0 = Input                                      'Taste UP
PortB.0 = 1                                                 'Pullup
UP Alias PinB.0
Config PortB.1 = Input                                      'Taste Down
PortB.1 = 1                                                 'Pullup
Down Alias PinB.1
Config PortB.2 = Input                                      'Taste LEFT
PortB.2 = 1                                                 'Pullup
Links Alias PinB.2
Config PortB.3 = Input                                      'Taste RIGHT
PortB.3 = 1                                                 'Pullup
Rechts Alias PinB.3

Config DEBOUNCE = 20                                        '20 ms entprellen

'========================== Portkonfiguration ==================================
Config Portb.5 = Input                                      'Input RFM_SDI / MOSI
PortB.5 = 1                                                 'Pullup
RFM_SDI Alias PinB.5

Config Portb.6 = Input                                      'Input RFM_SDO / MISO
PortB.6 = 1                                                 'Pullup
RFM_SDO Alias PinB.6

Config Portb.7 = Input                                      'Input RFM_SCK / SCK
PortB.7 = 1                                                 'Pullup
RFM_SCK Alias PinB.7

Config PortD.2 = Input                                      'Input RFM_nIRQ
PortD.2 = 1                                                 'Pullup
RFM_nIRQ Alias PinD.2

Config PortD.3 = Input                                      'Input RFM_nSEL
PortD.3 = 1                                                 'Pullup
RFM_nSEL Alias PinD.3

Config PortD.4 = Input                                      'Input WP_laufzeit
PortD.4 = 1                                                 'Pullup
WP Alias PinD.4

'PortD.5 = 1-wire                                            'pro Memoria
'PortD.6 = DCF77-Eingang                                     'pro Memoria

Config PortD.7 = Input                                      'Input Röbby in Garage
PortD.7 = 1                                                 'Pullup
Roebby Alias PIND.7

'==================== LCD Display mit 4 Zeilen zu 27 Zeichen ===================
Dim ___lcdno As Byte
Config Lcdpin = Pin , E = Portc.7 , E2 = Portc.4 , Rs = Portc.6 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
Config Lcd = 40 * 4
Config Pinc.5 = Output                                      'RW-Leitung als Ausgang konfigurieren
Portc.5 = 0                                                 'und auf 0 legen da wir nur schreiben

'--------- Initialisierung des LCD's, Löschen und Cursor Home ------------------
'Pfeil links mit chr(127), rechts mit chr(126) und Gradzeichen mit chr(&hdf) = chr(223)
'folgende Zeichen sind zu ersetzen: ä mit {225}; ö mit {239}; ü mit {245}
 ___lcdno = 0                                               'Obere Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
waitms 10
Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 4              'Pfeil auf, mit chr(1) darstellen
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 14 , 4              'Pfeil ab, mit chr(2) darstellen
waitms 10
cls
Initlcd                                                     'Initialisieren
Cursor Off                                                  'Cursor aus
Cls                                                         'Display löschen
Home                                                        'Cursor auf Position 1 , 1

 ___lcdno = 1                                               'Dies ist nur notwendig wenn das Display zwei LCD-Controller besitzt
 waitms 10
 Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 4             'Pfeil auf, mit chr(1) darstellen
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 14 , 4              'Pfeil ab, mit chr(2) darstellen
waitms 10
cls
Initlcd                                                     'Initialisieren
Cursor Off                                                  'Corsor aus
Cls                                                         'Display löschen
Home                                                        'Cursor auf Position 1 , 1

'======================= DCF77 und Zeit-Konfiguration ==========================

Config Dcf77 = PinD.6 , Inverted = 1 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic       'DCF77 benutzt Timer1
Config Date = Dmy , Separator = .
Enable Interrupts

Dim Neue_sekunde As Bit                                     'Flag
Dim Alte_minute as Byte                                     '
Alte_minute = 0
Dim Synchron As Bit                                         '1=synchron  0:kein korrekter Empfang
Dim DCFsyn as String * 8                                    'für Textanzeige
Dim Wochentag As Byte                                       '0..6
Dim Jahr as Byte                                            'für Manipulationen nötig
Dim Monat as Byte
Dim Tag as Byte
Dim Stunden as Byte
Dim Minuten as Byte
Dim Sekunden as Byte                                        'für Manipulationen nötig
Dim x As Byte
x = 1
'Dim y As Byte
'Dim z As Integer
Dim Timeout as Byte                                         'Timeout für Eingaben in Sekunden
Timeout = 200                                               'Initialwert für Timeout (wenn nichts mehr passiert)
Dim Messintervall As Byte
Messintervall = 15                                          'Initialwert des Messintervalls
Dim Intervallanzeige as Byte                                'dient beim Einstellen zur Anzeige
Intervallanzeige = Messintervall                            'und initialisieren


'======================= I2C-Konfiguration, HW-I2C-Bus =========================

$LIB "I2C_TWI.LBX"                                          'Library für HW-I2C-Bus
Config Twi = 400000                                         'Portīs nicht konfigurieren,
I2cinit                                                     'sie sind HW-mässig festgelegt

'Adresse der I2C-Temperatursensoren DS1621

Const WHZ_Adr_w = &h90                                      'Wohnzimmer Schreibadresse (144 dez)
Const WHZ_Adr_r = &h91                                      'Wohnzimmer Leseadresse (145 dez)
Const Res_Adr_w = &h92                                      'Reservebaustein Schreibadresse (146 dez)
Const Res_Adr_r = &h93                                      'Reservebaustein Leseadresse (147 dez)

'=========================== 1-Wire Konfiguration ==============================
dim Portnummer as Byte                                      'VERSUCH DEN 1WIRE-BEFEHL DYNAMISCH AUF VERSCHIEDENE PORTS ZU LEGEN
Portnummer = 5
Config 1wire = PortD.Portnummer                             '1-Wire-Port

Dim Dg As Integer                                           'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Degr as Single                                          'zur Darstellung umgewandelt
Dim B As Byte

Const max18S20_Sensoren = 10                                'max. Anzahl 18S20-Sensoren
Const Adressbytes_pro_Sensor = 8
Const Anzahl_Speicherplaetze = max18S20_Sensoren * Adressbytes_pro_Sensor
Dim Dsid(Anzahl_Speicherplaetze) As Byte                    'Dallas ID 64 bits incl CRC x 8 Stk
Dim Sensor_Nr as Byte

'hier werden direkt die Adressen der Sensoren zugewiesen

Dsid(1) = &H10                                              'Temp-Sensor 1: Heizung Vorlauf           alt: Temp-Sensor 4
Dsid(2) = &H29
Dsid(3) = &h7D
Dsid(4) = &h90
Dsid(5) = &h02
Dsid(6) = &h08
Dsid(7) = &h00
Dsid(8) = &h82

Dsid(9) = &H10                                              'Temp-Sensor 2: Heizung Rücklauf         alt: Temp-Sensor 9:
Dsid(10) = &HD2
Dsid(11) = &H8F
Dsid(12) = &H77
Dsid(13) = &h02
Dsid(14) = &H08
Dsid(15) = &h00
Dsid(16) = &HE2

Dsid(17) = &h10                                             'Temp-Sensor 3: Sole Vorlauf           alt: Temp-Sensor 6
Dsid(18) = &h07
Dsid(19) = &h8D
Dsid(20) = &h77
Dsid(21) = &h02
Dsid(22) = &h08
Dsid(23) = &h00
Dsid(24) = &h4E

Dsid(25) = &h10                                             'Temp-Sensor 4: Sole Rücklauf          alt: Temp-Sensor 7
Dsid(26) = &h40
Dsid(27) = &h11
Dsid(28) = &h90
Dsid(29) = &h02
Dsid(30) = &h08
Dsid(31) = &h00
Dsid(32) = &hE7

Dsid(33) = &h10                                             'Temp-Sensor 5: Aussen NordWest
Dsid(34) = &h39
Dsid(35) = &h8D
Dsid(36) = &h8D
Dsid(37) = &h02
Dsid(38) = &h08
Dsid(39) = &h00
Dsid(40) = &hDA

Dsid(41) = &h10                                             'Temp-Sensor 6          alt: Temp-Sensor 1: Vorlauf
Dsid(42) = &h5B
Dsid(43) = &h17
Dsid(44) = &h90
Dsid(45) = &h02
Dsid(46) = &h08
Dsid(47) = &h00
Dsid(48) = &hD8

Dsid(49) = &h10                                             'Temp-Sensor 7          alt: Temp-Sensor 2: Rücklauf
Dsid(50) = &hC0
Dsid(51) = &h64
Dsid(52) = &h90
Dsid(53) = &h02
Dsid(54) = &h08
Dsid(55) = &h00
Dsid(56) = &hB2


Dsid(57) = &H10                                             'Temp-Sensor 8          hängt provisorisch am Heizungsverteiler
Dsid(58) = &h3B
Dsid(59) = &h90
Dsid(60) = &h77
Dsid(61) = &h02
Dsid(62) = &h08
Dsid(63) = &h00
Dsid(64) = &H4E

Dsid(65) = &h10                                             'Temp-Sensor 9
Dsid(66) = &H2C
Dsid(67) = &H8A
Dsid(68) = &H77
Dsid(69) = &H02
Dsid(70) = &h08
Dsid(71) = &H00
Dsid(72) = &h51

'(
Dsid(81) = &h10                                             'Temp-Sensor 10
Dsid(82) = &hD2
Dsid(83) = &h8F
Dsid(84) = &h77
Dsid(85) = &h02
Dsid(86) = &h08
Dsid(87) = &h00
Dsid(88) = &hE2

Dsid(89) = &h10                                             'Dummy-Temp-Sensor 11
Dsid(90) = &h1A
Dsid(91) = &h54
Dsid(92) = &h8D
Dsid(93) = &h02
Dsid(94) = &h08
Dsid(95) = &h00
Dsid(96) = &h98

Dsid(97) = &h10                                             'Dummy-Temp-Sensor 12
Dsid(98) = &h1A
Dsid(99) = &h54
Dsid(100) = &h8D
Dsid(101) = &h02
Dsid(101) = &h08
Dsid(102) = &h00
Dsid(103) = &H98
')

'Wenn der Zugriff folgendermassen erfolgt : DsId(1) = 1wread(8)
'DsId(1) = family code           'Ds1820 = 10h; DS18B20 = 28h; Ds18s20 = 10h
'DsId(2)                         '48 Bits Serial, LSB
'DsId(3)
'DsId(4)
'DsId(5)
'DsId(6)
'DsId(7)                         '48 Bits Serial, MSB
'DsId(8)                         '8 CRC

Dim Sc(9) as byte                                           'Scratchpad 0-8 72 bits incl CRC
'Sc(1)                           'Temperatur LSB
'Sc(2)                           'Temperatur MSB
'Sc(3)                           'TH/user byte 1
'Sc(4)                           'TL/user byte 2
'Sc(5)                           'res
'Sc(6)                           'res
'Sc(7)                           'Counter remain
'Sc(8)                           'Counter per °C; ist jedoch fix auf 16 (10h) festgelegt
'Sc(9)                           'CRC

'wichtige DS18S20 ROM und scratchpad Kommandos:
'&H 33  read rom - single sensor
'&H 55  match rom, followed by 64 bits
'&H CC  skip rom
'&H EC  alarm search  - ongoining alarm >TH <TL
'&H BE  read scratchpad
'&H 4E  write scratchpad
'&H 44  convert T

'Variable und was sonst noch mit Temperatur zu tun hat

Dim Ausgabe_LCD(4) as String * 110                          '4 Zeilen zu 27 Zeichen = 108+1
Dim LcdAusgabe(4) as String * 28
Dim LcdAus(4) as String * 28
Dim DisplP_horiz as Byte                                    'Pointer auf horizontale Stelle im Display
'Dim WPstatus as String * 6
Dim TempKomma as string * 10
Dim Formattemp as String * 10
Dim Ta(12) As String * 10                                   'Temperaturanzeige wie sie im Display steht

Dim Hightemp As Byte                                        'I2C-Register Temparatur Lowbyte
Dim Lowtemp As Byte                                         'I2C-Register Temparatur Highbyte
Dim Temperatur As Single
DIM Temp_mess As Single
Dim c_p_c As Byte                                           'I2C-Register Count per Grad C
Dim c_r As Byte                                             'I2C-Register Count remaining
Dim K As Integer                                            'Laufvariable fuer Schleife
Dim WHZ_Temp as String * 8                                  'Wohnzimmertemperatur


'========================== Speicher-Management ================================
Dim Adresspointer As DWord                                  'zeigt auf die nächste zu schreibenden EEPROM-Adresse
Dim AnzahlDatensaetze as DWord                              'wird für die Displayanzeige benötigt
'Dim AnzahlDatensaetze_alt as DWord                            'damit nicht bei jedem Umgang geschrieben wird
Dim APL as Word at Adresspointer overlay                    '\
Dim APH as Word at Adresspointer + 2 overlay                ' |
Dim APL_l as Byte at APL overlay                            ' \
Dim APL_h as Byte at APL + 1 overlay                        '  > dienen zum einfachen Speichern des
Dim APH_l as Byte at APH overlay                            '  > Adresspointers im EEProm (Byte-Zugriff)
Dim APH_h as Byte at APH + 1 overlay                        '_/
Dim Auslesepointer as DWord                                 'zeigt auf die Ausleseadresse beim Anzeigen
Dim Ausleseadresse As DWord                                 'zeigt auf die zu lesende EEPROM-Adresse
Dim Speicheradresse As DWord                                'Speicher-Manipulationsadresse über alle EEPROMs
Dim EEPROM_Adresse As Word at Speicheradresse overlay       'low-Word von Speicheradresse
Dim EEPROM_Dev_Adresse as Word at Speicheradresse + 2 overlay       'Overlay für die EEProm-Adresse
Dim EEPROM_Dev_Adr As Byte                                  'Device-Adress for EEPROM
EEPROM_Dev_Adr = LOW(EEPROM_Dev_Adresse)                    'Low-Byte von EEProm-Dev_Adresse


Adresspointer = &b00000000_01010000_00000000_00100000       'Startadresse des Pointers auf die Daten
Speicheradresse = Adresspointer                             'EEPROM-Manipulationsadresse

'Speicheradress-Management:
'                    |<------- Speicheradresse ------->|     DWord
'            EEPROM- |<-Dev_Adresse->| |<---Adresse--->|     Word
'            EEPROM- |<Dev_>| |<Dev_>| |<-H-->| |<-L-->|     Byte
'                    |  h   | | Adr  | |      | |      |
'Speicheradresse = &b00000000_01010000_00000000_00100000     'Startadresse des Pointers auf die Daten
'      oder          |        ||  |||| |          |    |
'Adresspointer       |        ||  |||| |          ++++++---- Startadresse 32 = h20
'                    |        ||  |||| +++++++++++++++++---- Adresse eines Blocks (0...65536)
'                    |        ||  ||++---------------------- Device-Adresse (0...3)
'                    |        ||  |+------------------------ Blockadresse (0 oder 1)
'                    |        |++++------------------------- Control-Code (b1010), immer gleich
'                    ++++++++++----------------------------- immer 0, wird nicht gebraucht
' wenn das EEPROM adressiert wird muss das Read- oder Write-Bit noch eingeschoben werden!!!
' Es gibt keine Überprüfung auf Überlauf von einem IC auf das andere!!!
' Ist hier auch nicht nötig, da in Inkrementen von 32 (oder später 64) gespeichert wird (siehe max_Daten).
'                   _________________________________________

'Umwandlung 2 Byte in Integer
'        +--------+--------+- -+--------+--------+             TB  Daten  Daten_out
' -----> | Byte 1 | Byte 2 |   | Byte 31| Byte 32| =====>      |   |      ^
'        +--------+--------+- -+--------+--------+             |   |      |
' =====> |    Integer 1    |   |   Integer 16    | ----->      v   v      |
'        +-----------------+- -+-----------------+             TE  TE     TemperaturInteger
'
'
Const MaxSpeicher = &h0057FFE0                              'höchste mögliche Speicheradresse der Daten
Const StartSpeicher = &h00500020                            'Startadresse der Daten
Const max_Daten = 32                                        'maximale 32 Datenbytes pro Datensatz
Dim maxDaten as Byte
maxDaten = max_Daten                                        'Wert zuweisen
Const max_Integer = 11                                      'max. 12 Integerwerte (Temperaturen)                    so es denn mit 0 beginnt
Dim maxInteger As Byte
maxInteger = max_Integer                                    'Wert zuweisen
Const max_Single = 11                                       'max. 12 Singlewerte (Temperaturen)                     so es denn mit 0 beginnt
Dim maxSingle As Byte
maxSingle = max_Single                                      'Wert zuweisen
Dim Daten_in(Max_Daten)As Byte                              'Datenarray(32 Bytes) zum Schreiben ins EEPROM
Dim Te(max_integer) As Integer At Daten_in(9) Overlay
Dim Daten_out(Max_Daten) As Byte                            'Datenarray(32 Bytes) gelesen aus EEPROM
Dim TemperaturInteger(max_Integer) As Integer at Daten_out(9) overlay
Dim Temperatursingle(max_Single) As Single
Dim L As Byte                                               'Low Adress Byte von einem Word
Dim H As Byte                                               'High Adress Byte von einem Word
Dim temp As Integer
Dim temp1 As Integer
Dim n as Byte
Dim i as Byte
Dim o as Byte                                               'Zählvariable
Dim WPstatus_kurz as String * 4
Dim WPstatus_lang as String * 8
Dim WPstatus_alt as Bit                                     'Zwischenspeicher für den alten WPstatus
WPstatus_alt = WP                                           'und initialisieren
Dim Roebbystatus_lang as String * 8
Dim Roebbystatus_alt as Bit                                 'Zwischenspeicher für den alten Roebbystatus
Roebbystatus_alt = Roebby                                   'und initialisieren

 

'****************************************************************************************************************************
'***************************** PROGRAMMSTART ********************************************************************************
'****************************************************************************************************************************

Print "************************************************"
Print "************** Programmstart *******************"
Print "************************************************"


___LCDNo = 0
Locate 1 , 1
LCD "Datenlogger "                                          'Titel
Locate 2 , 1                                                'und
LCD "File: " ; Version(3)                                   'Filename darstellen
Wait 3                                                      '3 Sekunden warten

gosub read_adress_pointer                                   'zuerst wird der Adresspointer
                                                            'auf den letzten Stand gesetzt
'gosub MESSUNG                                               'erste Messung durchführen
'Wait 2                                                      'nochmals 2 Sekunden warten

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++++++++++++++++++++++++++++ Hauptschleife ++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

do

   if _sec = 59 then Synchron = DCF_status.2                'DCF Synchronität feststellen

   Debounce OK , 0 , Menue1                                 'Springt nach Menue wenn gedrückt

   Menuerueckkehr:
   If Neue_sekunde = 1 Then
      Neue_sekunde = 0
      ___LCDNo = 0                                          'alle Sec. Anzeige auffrischen
      Locate 1 , 1
      LCD Date$ ; " " ; Time$ ; "  DCF77: " ; Synchron
      Locate 2 , 1
      LCD "Intervall: " ; Messintervall ; " Min   "
      AnzahlDatensaetze = Adresspointer - StartSpeicher     'Startwert vom Adresspointer abziehen
      AnzahlDatensaetze = AnzahlDatensaetze / 32            'stellt so die Anzahl Datensätze dar
      LCD "        "                                        'Platz löschen
      Locate 2 , 20                                         'und
      LCD "D:" ; AnzahlDatensaetze                          'Anzahl Datensätze in Dezimal ausgeben
      if alte_minute <> _min then
         gosub mintic
         alte_minute = _min
      end if
   End If
loop

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


'===================== Alles was pro Sekunde abläuft =====================

Sectic:
   Neue_sekunde = 1

   if timeout = 0 then Return
   timeout = timeout - 1
Return

'=========================================================================

'################ Alles was einmal pro Minute abläuft ####################

Mintic:
                                                            'weil ab und zu nicht richtig dargestellt wird
 ___lcdno = 0                                               'Obere Displayhälfte
waitms 10
Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 4              'Pfeil auf, mit chr(1) darstellen
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 14 , 4              'Pfeil ab, mit chr(2) darstellen
waitms 10

 ___lcdno = 1                                               'Dies ist nur notwendig wenn das Display zwei LCD-Controller besitzt
waitms 10
Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 4              'Pfeil auf, mit chr(1) darstellen
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 14 , 4              'Pfeil ab, mit chr(2) darstellen
waitms 10

x = x - 1                                                   'Messintervall dekrementieren?

   'WPstatus prüfen
   if WP <> WPstatus_alt then                               'Falls Wärmepumpenstatus gewechselt hat
      WPstatus_alt = WP                                     'WPstatus neu setzen

      if x = 0 then x = Messintervall                       'prüfen ob ev. gerade Messintervall erreicht
      Gosub Messung                                         'ausserplanmässige Messung durchführen
      Speicheradresse = Adresspointer
      Gosub Write_eeprom
      Speicheradresse = Adresspointer                       'EEPROM braucht "Speicheradresse"
      gosub Read_EEPROM                                     'letzter Datensatz aus Eeprom holen
      Adresspointer = Adresspointer + 32                    'nächste Datensatz
      If MaxSpeicher < Adresspointer then Adresspointer = StartSpeicher       'beginnt wieder von vorne
      gosub write_Adress_pointer
   end if

   'Roebbystatus prüfen
   if Roebby <> Roebbystatus_alt then                       'Falls Roebby Status gewechselt hat
      Roebbystatus_alt = Roebby                             'Roebbystatus neu setzen

      if x = 0 then x = Messintervall                       'prüfen ob ev. gerade Messintervall erreicht
      Gosub Messung                                         'ausserplanmässige Messung durchführen
      Speicheradresse = Adresspointer
      gosub write_eeprom
      Speicheradresse = Adresspointer                       'EEPROM braucht "Speicheradresse"
      gosub Read_EEPROM                                     'letzter Datensatz aus Eeprom holen
      Adresspointer = Adresspointer + 32                    'nächste Datensatz
      If MaxSpeicher < Adresspointer then Adresspointer = StartSpeicher       'beginnt wieder von vorne
      gosub write_Adress_pointer
   end if

   'normale Messung
   if x = 0 then
      x = Messintervall
      gosub Messung                                         'Messungen durchführen
      Speicheradresse = Adresspointer
      gosub write_eeprom
      Speicheradresse = Adresspointer                       'EEPROM braucht "Speicheradresse"
      gosub Read_EEPROM                                     'letzter Datensatz aus Eeprom holen
      Adresspointer = Adresspointer + 32                    'nächste Datensatz
      If MaxSpeicher < Adresspointer then Adresspointer = StartSpeicher       'beginnt wieder von vorne
      gosub write_Adress_pointer
   end if                                                   'für die Darstellung auf der Startseite

   'Aufbereitung der unteren Zeilen, erfolgt jede Minute

   gosub read_adress_pointer                                'zuerst wird der aktuelle Adresspointer geladen
   Auslesepointer = Adresspointer - 32                      'Anfangsadresse steht nun auf dem zuletzt geschriebenen Datensatz
   Ausleseadresse = Auslesepointer
   Speicheradresse = Ausleseadresse                         'EEPROM braucht "Speicheradresse"
   gosub Read_EEPROM                                        'letzter Datensatz aus Eeprom holen

   Stunden = makebcd(Daten_out(4))
   Minuten = makebcd(Daten_out(5))

   n = 1                                                    'damit wird der Sensor ausgewählt (Heizungsvorlauf)
   TemperaturSingle(n) = TemperaturInteger(n) / 10
   TempKomma = Fusing(TemperaturSingle(n) , "##.#")         'Komma festlegen
   TA(n) = Format(TempKomma , "+0000") + chr(223)           'Zahlenausgabe formatieren
   if Temperatursingle(n) > 100 then TA(n) = " --.- "       'Nichtbenutzte ausblenden
   if Temperatursingle(n) < -100 then TA(n) = " --.- "

   n = 3                                                    'damit wird der Sensor ausgewählt (Solevorlauf)
   TemperaturSingle(n) = TemperaturInteger(n) / 10
   TempKomma = Fusing(TemperaturSingle(n) , "##.#")         'Komma festlegen
   TA(n) = Format(TempKomma , "+0000") + chr(223)           'Zahlenausgabe formatieren
   if Temperatursingle(n) > 100 then TA(n) = " --.- "       'Nichtbenutzte ausblenden
   if Temperatursingle(n) < -100 then TA(n) = " --.- "

   n = 5                                                    'damit wird der Sensor ausgewählt (Aussen Nord)
   TemperaturSingle(n) = TemperaturInteger(n) / 10
   TempKomma = Fusing(TemperaturSingle(n) , "##.#")         'Komma festlegen
   TA(n) = Format(TempKomma , "+0000") + chr(223)           'Zahlenausgabe formatieren
   if Temperatursingle(n) > 100 then TA(n) = " --.- "       'Nichtbenutzte ausblenden
   if Temperatursingle(n) < -100 then TA(n) = " --.- "

   ___LCDno = 1                                             'und das Ganze nun ausgeben
   Locate 1 , 1
   LCD "       HVorl. SVorl.  Nord "
   Locate 2 , 1
   LCD hex(Stunden) ; ":" ; hex(Minuten) + "  " + TA(1) + " " + TA(3) + " " + TA(5)
return

'##########################################################################

'--------------------------------------------------------------------------
'------------------------ Temperaturmessung -------------------------------
'--------------------------------------------------------------------------

Messung:
Dim tempNr as Byte

'zuerst Zeit der Messung in den ersten 6 Bytes abspeichern
   Daten_in(1) = _day
   Daten_in(2) = _month
   Daten_in(3) = _year
   Daten_in(4) = _hour
   Daten_in(5) = _min
   Daten_in(6) = _sec

'dann die statischen Signale abfragen
   WPstatus_alt = WP                                        'WPstatus neu setzen, falls er gerade gewechselt hat
   if WP = 1 then                                           'WPzustand
      Daten_in(7) = &h41                                    'ist A = AUS
   else
      Daten_in(7) = &h45                                    'ist E = EIN
   end if

   Roebbystatus_alt = Roebby                                'Roebbystatus neu setzen, falls er gerade gewechselt hat
   if Roebby = 1 then                                       'Roebbyzustand
      Daten_in(8) = &h4F                                    'ist O = OUT
   else
      Daten_in(8) = &h49                                    'ist I = IN
   end if

'dann die Temperaturmessung anstossen (Konvertierung starten)
   1wreset                                                  '1-Wire-Bus zurücksetzen
   1wwrite &HCC                                             'Adressromīs überspringen
   1wwrite &H44                                             'Temperaturkonversion anstossen, startet Konvertierung von ALLEN T am 1w-bus
   I2csend , WHz_Adr_w , &HEE                               'Start Konvertierung am I2C-Bus
   I2csend , Res_Adr_w , &HEE                               'vorläufig nicht aktiv

   wait 1                                                   'Konvertierzeit

   Gosub Temp_Messung_1W                                    '1-Wire-Sensoren abfragen
   Gosub Temp_Messung_I2C                                   'I2C-Sensoren abfragen
   Gosub Erdsondentemperatur

Return

'_________________________________________________________

'für 1-Wire-Sensoren

Temp_Messung_1W:
   For Sensor_Nr = 1 to max18S20_Sensoren
      tempNr = Sensor_Nr * 8                                '8 Byte Adressen pro Sensor
      tempNr = tempNr - 7
      1wverify DsId(tempNr)                                 'sendet "Match ROM "
   if err = 1 then                                          'Error = 1 Fehler aufgetreten
      TE(Sensor_Nr) = 9999                                  'damit die Stelle nicht leer bleibt
   elseif err = 0 then                                      'Sensor hat geantwortet
      1wwrite &HBE
      Sc(1) = 1wread(9)                                     '9 Bytes in Array einlesen
      if sc(9) = crc8(sc(1) , 8) then
         TE(Sensor_Nr) = DeciGrades(sc(9))                  'Umwandlung in ein Integer-Word (-32768...32767) zum abspeichern
      end if
   end if
   next Sensor_Nr
return

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

Function Decigrades(byval Sc(9) As Byte)
   Dim Tmp As Byte , T As Integer , T1 As Integer

   Tmp = Sc(1) And 1                                        '0.1C Genauigkeit, Bit 0 ausmaskieren
   If Tmp = 1 Then Decr Sc(1)                               'wenn 1 dann 1 abziehen
      T = Makeint(sc(1) , Sc(2))                            'Umwandeln in Integerwert, Anzahl 1/2° (Temp-Schritt ist 0.5°C)
      T = T * 50                                            'x50, da 1/100°-Schritte
      T = T - 25                                            'gemäss DS18S20 data sheet 0.25(*100) abziehen
      T1 = Sc(8) - Sc(7)
      T1 = T1 * 100
      T1 = T1 / Sc(8)
      T = T + T1
      Decigrades = T / 10
End Function

'_____________________________________________


'für I2C-Sensoren

Dim temphigh as Byte
Dim Templow as Byte
Dim T_I2C As Integer
Dim T1_I2C As Integer

Temp_Messung_I2C:                                           'Temperatur auslesen
   I2csend , WHZ_Adr_w , &HAA                               'kürzere Source, längerer Code
   I2cstart
   I2cwbyte WHZ_Adr_r                                       'Device-read
   I2crbyte Hightemp , Ack                                  'MSB holen
   I2crbyte Lowtemp , Nack                                  'LSB holen
   I2cstop
   '------- und nun die restlichen 2 Register für die 1/10°-Berechnung auslesen -------
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte WHZ_Adr_w                                       ' Schreibadresse
   I2cwbyte &HA8                                            ' Count Remain anfordern
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte WHZ_Adr_r                                       ' Leseadresse
   I2crbyte C_r , Nack                                      ' Count Remain holen
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte WHZ_Adr_w                                       ' Schreibadresse
   I2cwbyte &HA9                                            ' Count per C anfordern
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte WHZ_Adr_r                                       ' Leseadresse
   I2crbyte C_p_c , Nack                                    ' Count per C holen
   I2cstop
   Gosub Konvertierung
   TE(10) = T_I2C / 10                                      'T(10) ist Wohnzimmer, Anzahl 1/10°
'(
'2tes IC
   I2csend , Res_Adr_w , &HAA                               'kürzere Source, längerer Code
   I2cstart
   I2cwbyte Res_Adr_r                                       'Device-read
   I2crbyte Hightemp , Ack                                  'MSB holen
   I2crbyte Lowtemp , Nack                                  'LSB holen
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte Res_Adr_w                                       ' Schreibadresse
   I2cwbyte &HA8                                            ' Count Remain anfordern
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte Res_Adr_r                                       ' Leseadresse
   I2crbyte C_r , Nack                                      ' Count Remain holen
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte Res_Adr_w                                       ' Schreibadresse
   I2cwbyte &HA9                                            ' Count per C anfordern
   I2cstop
   I2cstart                                                 ' I2C-Kommunikation starten
   I2cwbyte Res_Adr_r                                       ' Leseadresse
   I2crbyte C_p_c , Nack                                    ' Count per C holen
   I2cstop
   Gosub Konvertierung
   TE(9) = T_I2C / 10                                       'Achtung, Speicherplatz 9 ist bereits reserviert
')
Return

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

'Konversion von DS1621 nach 18S20 um gleich abspeichern und anzeigen zu können

Konvertierung:
   if hightemp.7 = 1 then                                   'wenn negativ
      temphigh = &hFF                                       'temphigh alle auf 1
   else
      temphigh = &h00                                       'sonst alle auf 0
   End If
   shift hightemp , left , 1                                'mit 2 multiplizieren, da Anzahl 1/2° nötig
   templow = hightemp                                       'da 1/10° gewünscht werden sind 0.5° nicht notwendig
   T_I2C = Makeint(templow , temphigh)                      'Umwandeln in Integerwert
   T_I2C = T_I2C * 50                                       'x50, da 1/100°-Schritte
   T_I2C = T_I2C - 25                                       'gemäss DS18S20 data sheet 0.25(*100) abziehen
   T1_I2C = C_p_c - C_r
   T1_I2C = T1_I2C * 100
   T1_I2C = T1_I2C / C_p_C
   T_I2C = T_I2C + T1_I2C
Return

'______________________________________________________________

'Abfrage der Erdsondentemperaturen

Erdsondentemperatur:

Const ES_Adr_w = &h4E                                       'Erdsondenauswertung Schreibadresse
Const ES_Adr_r = &h4F                                       'Erdsondenauswertung Leseadresse

I2cstart
I2cwbyte ES_Adr_r                                           'Device-write
I2crbyte Daten_in(31) , Ack                                 'MSB holen  Temperatur Erdsdonde unten  = T12 --> sollte T11 sein (_in(29)) (28.1.15)
I2crbyte Daten_in(32) , Ack                                 'LSB holen  Temperatur Erdsdonde unten  = T12                     (_in(30))
I2crbyte Daten_in(29) , Ack                                 'MSB holen  Temperatur Erdsdonde oben   = T11 --> sollte T12 sein (_in(31))
I2crbyte Daten_in(30) , Nack                                'LSB holen  Temperatur Erdsdonde oben   = T11                     (_in(32))
I2cstop
Return

 

 


'==============================================================
'========================== Menueauswahl ======================
'==============================================================

Menue1:
   ___lcdno = 0
   Locate 1 , 1                                             'obere Zeilen wählen
   LCD "1 Datenanzeige             "
   locate 2 , 1
   LCD "weitere Menue mit down     "
   ___lcdno = 1
   Locate 1 , 1
   LCD "mit OK w{225}hlen, dann mit    "
   Locate 2 , 1
   LCD "{001}&{002} + {127}&{126} Daten betrachten "
   Timeout = 20                                             'Timeout auf 20 sec setzen
Do
   Debounce OK , 0 , Auslesen                               'mit OK zu Auslesen
   Debounce down , 0 , Menue2                               'mit Down zum nächsten Menue
   If Timeout = 0 Then Goto MenueEnde                       'Timeout abgelaufen
Loop

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

Menue2:
   ___lcdno = 0
   Locate 1 , 1                                             'obere Zeilen wählen
   LCD "2 Datenanausgabe           "
   locate 2 , 1
   LCD "weitere Menue mit up & down"
   ___lcdno = 1
   Locate 1 , 1
   LCD "mit OK w{225}hlen, dann mit up "
   Locate 2 , 1
   LCD "Anzahl Datens{225}tze w{225}hlen   "
   Timeout = 20                                             'Timeout wieder auf 20 sec setzen
Do
   Debounce OK , 0 , Datenausgabe                           'mit OK zu Auslesen
   Debounce Up , 0 , Menue1                                 'mit up ein Menue zurück
   Debounce Down , 0 , Menue3                               'mit Down zum nächsten Menue
   If Timeout = 0 Then Goto MenueEnde                       'Timeout abgelaufen
Loop

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

Menue3:
   ___lcdno = 0
   Locate 1 , 1                                             'obere Zeilen wählen
   LCD "3 Messintervall: " ; Messintervall ; " Minuten"
   locate 2 , 1
   LCD "weitere Menue mit up & down"
   ___lcdno = 1
   Locate 1 , 1
   LCD "mit OK w{225}hlen, dann mit    "
   Locate 2 , 1
   LCD chr(1) ; "&" ; chr(2) ; " Intervall einstellen   "
   Timeout = 20                                             'Timeout wieder auf 20 sec setzen
Do
   Debounce OK , 0 , Intervall_einstellen                   'mit OK zum Einstellen
   Debounce Up , 0 , Menue2                                 'mit up ein Menue zurück
   Debounce down , 0 , Menue4                               'mit Down zum nächsten Menue
   If Timeout = 0 Then Goto MenueEnde                       'Timeout abgelaufen
Loop

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

Menue4:
   ___lcdno = 0
   Locate 1 , 1                                             'obere Zeilen wählen
   LCD "4 Zeit und Datum einstellen"
   locate 2 , 1
   LCD "weitere Menue mit up & down"
   ___lcdno = 1
   Locate 1 , 1
   LCD "mit OK w{225}hlen, dann mit    "
   Locate 2 , 1
   LCD chr(1) ; "&" ; chr(2) ; " einstellen             "
   Timeout = 20                                             'Timeout wieder auf 20 sec setzen
Do
   Debounce OK , 0 , Zeit_stellen                           'mit OK zu Auslesen
   Debounce up , 0 , Menue3                                 'mit Up zum vorigen Menue
   Debounce down , 0 , Menue5                               'mit down zum nächsten Menue
   If Timeout = 0 Then Goto MenueEnde                       'Timeout abgelaufen
Loop

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

Menue5:
   ___lcdno = 0
   Locate 1 , 1                                             'obere Zeilen wählen
   LCD "5 Speicher zur{245}ckstellen   "
   locate 2 , 1
   LCD "weitere Menue mit up & down"
   ___lcdno = 1
   cls
   Locate 2 , 1
   LCD "mit OK w{225}hlen              "
   Timeout = 20                                             'Timeout wieder auf 20 sec setzen
Do
   Debounce OK , 0 , Pointer_Reset                          'mit OK zu Auslesen
   Debounce up , 0 , Menue4                                 'mit Up zum vorigen Menue
   Debounce down , 0 , Menue1                               'mit down wieder von vorne
   If Timeout = 0 Then Goto MenueEnde                       'Timeout abgelaufen
Loop

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

MenueEnde:
   ___lcdno = 0
   cls
   ___lcdno = 1
   cls
   Locate 1 , 1                                             'untere Zeile wiederherstellen,
   LCD "       HVorl. SVorl.  Nord "                        'damit nicht 1 Minute gewartet werden muss
   Locate 2 , 1
   LCD hex(Stunden) ; ":" ; hex(Minuten) + "  " + TA(1) + " " + TA(3) + " " + TA(5)
   Timeout = 0                                              'zur Sicherheit vor Rückkehr nochmals auf 0 setzen
Goto Menuerueckkehr
'___________________________________

 

'===============================================================================
'======== liest Daten aus dem EEPROM und stellt sie auf dem Display dar ========
'===============================================================================

Auslesen:
   Timeout = 20                                             '20 sec Timeout
   DisplP_horiz = 1                                         'auf Zeilenanfang
   gosub read_adress_pointer                                'zuerst wird der aktuelle Adresspointer geladen
   Auslesepointer = Adresspointer - 32                      'Anfangsadresse steht nun auf dem zuletzt geschriebenen Datensatz
   Ausleseadresse = Auslesepointer

Auslesen1:
   Gosub Disp_aufbereiten
   Gosub Temp_anzeigen

Auslesen2:
   Debounce Rechts , 0 , Rechtsschieben , Sub
   Waitms 10
   Debounce Links , 0 , Linksschieben , Sub
   Waitms 10
   Debounce UP , 0 , Vorwaerts , Sub
   Waitms 10
   Debounce DOWN , 0 , Rueckwaerts , Sub
   Waitms 10
   Debounce OK , 0 , Abschluss
   If Timeout = 0 Then                                      'Timeout abgelaufen
      Goto Abschluss
   Else
      Goto Auslesen2
   End If

Abschluss:
   Goto MenueEnde

Rechtsschieben:
   Timeout = 20
   DisplP_horiz = DisplP_horiz + 27
   If DisplP_horiz > 107 then DisplP_horiz = 1
   gosub Temp_Anzeigen
Return

Linksschieben:
   Timeout = 20
   if DisplP_horiz = 1 then
   DisplP_horiz = 82
   else
   DisplP_horiz = DisplP_horiz - 27
   end if
   gosub Temp_Anzeigen
Return

Vorwaerts:
   Timeout = 20
   Auslesepointer = Auslesepointer + 96                     '3 Datensätze vorwärts
   Ausleseadresse = Auslesepointer                          'Startadresse
   If Adresspointer <= Ausleseadresse then                  'neuester Datensatz erreicht
   Auslesepointer = Adresspointer - 32
      ___LCDno = 1
      cls
      locate 1 , 1
      LCD "neuester Datensatz erreicht"
      Return
   Else
      Gosub Disp_aufbereiten
      Gosub Temp_anzeigen
   End if
Return

Rueckwaerts:
   Timeout = 20
   Auslesepointer = Auslesepointer - 96                     '3 Datensätze rückwärts
   Ausleseadresse = Auslesepointer
   If Ausleseadresse > 5767102 then                         '= unter 0
      Auslesepointer = &h500020                             '0 ist h500020 wegen EEProm-Device-Adressierung
      ___LCDno = 1
      cls
      locate 1 , 1
      LCD "---- Anfang erreicht -----"
      Return
   else
      Gosub Disp_aufbereiten
      Gosub Temp_anzeigen
   end if
Return


'-------------------------- Displayanzeige aufbereiten -------------------------
'-------------------------------------------------------------------------------
Disp_aufbereiten:

'Displayposition: 1                        27                         54                         81                        108
'Displayposition: I--------------------------I--------------------------I--------------------------I--------------------------X
'Displaytext:     Datum.Zeit..B..HVorl..HRück.SVorl..SRück.Eunten..Eoben.Nord...Süd....Wohnz..Schlz.WiGa...Zoben..WP.....Röbby
Ausgabe_LCD(1) = "Datum Zeit  B  HVorl  HR{245}ck SVorl  SR{245}ck Eunten  Eoben Nord   S{245}d    Wohnz  Schlz WiGa  Zoben   WP     R{239}bby"


o = 2                                                       'zeigt auf Zeile 2 (Zeile 1 ist fix)
Do
  n = 1                                                     'Pointer auf Temperatur im Anzeigeformat
   Speicheradresse = Ausleseadresse                         'EEPROM braucht "Speicheradresse"
   gosub Read_EEPROM                                        'letzter Datensatz aus Eeprom holen
   If Daten_out(7) = &h45 then                              'wenn E
      WPstatus_kurz = " E "
      WPstatus_lang = " Ein   "
      Else
      WPstatus_kurz = " A "
      WPstatus_lang = " Aus   "
   End If

   If Daten_out(8) = &h49 then                              'wenn I = In = laden
      Roebbystatus_lang = " laden"
      Else
      Roebbystatus_lang = " m{225}hen"
   End If


  'Temperaturanzeige vorbereiten; abgelegt im Integer-Format (-32768....+32767) als Overlay über Daten_out
   Do
      TemperaturSingle(n) = TemperaturInteger(n) / 10
      TempKomma = Fusing(TemperaturSingle(n) , "##.#")      'Komma festlegen
      TA(n) = Format(TempKomma , "+0000") + chr(223)        'Zahlenausgabe formatieren und Gradzeichen anhängen
      if Temperatursingle(n) > 100 then TA(n) = " --.- "
      if Temperatursingle(n) < -100 then TA(n) = " --.- "
      n = n + 1                                             'nächste Temperatur im Anzeigeformat
   Loop until n = 13                                        'max. 12 Temperaturen möglich
   Monat = makebcd(Daten_out(2))
   Tag = makebcd(Daten_out(1))
   Stunden = makebcd(Daten_out(4))
   Minuten = makebcd(Daten_out(5))
   Ausgabe_LCD(o) = hex(Tag) + "." + hex(Monat) + " " + hex(Stunden) + ":" + hex(Minuten) + WPstatus_kurz + TA(1) + " " + TA(2) + TA(3) + " " + TA(4) + " " + TA(11) + " " + TA(12) + TA(5) + " " + TA(8) + " " + TA(10) + " " + TA(6) + TA(7) + " " + TA(9) + " " + WPstatus_lang + Roebbystatus_lang
   o = o + 1                                                'eine Zeile weiter
   Ausleseadresse = Ausleseadresse - 32                     'Pointer auf ein Datensatz früher
Loop until o = 5                                            'für 3 zusätzliche Zeilen (+ Kopfzeile)
Return

'-------------------------- Temperatur anzeigen --------------------------------

Temp_anzeigen:
   ___LCDno = 0
   Locate 1 , 1
   Lcd Mid(Ausgabe_LCD(1) , DisplP_horiz , 27)              'erste Zeile wählen
   Locate 2 , 1
   Lcd Mid(Ausgabe_LCD(2) , DisplP_horiz , 27)              '2te Zeile wählen
   ___lcdno = 1
   Locate 1 , 1                                             '3te Zeile wählen
   Lcd Mid(Ausgabe_LCD(3) , DisplP_horiz , 27)
   Locate 2 , 1                                             '4te Zeile wählen
   Lcd Mid(Ausgabe_LCD(4) , DisplP_horiz , 27)
Return
'__________________________________

 

'===============================================================================
'===== Liest Daten aus dem EEPROM aus und gibt sie per Funk oder RS232 aus =====
'===============================================================================

Dim Ausgabe_Seriell as String * 109                         'Total 108 Zeichen ausgeben
Dim TA_s(12) as String * 8                                  'Temperaturen
Dim Datenaus as Long
Dim p as Long                                               'Zählvariable


Datenausgabe:

   ___LCDno = 0
   cls
   Locate 1 , 1
   LCD "wieviele Datens{225}tze sollen"
   Locate 2 , 1
   LCD "gesendet werden --> 1000"
   ___LCDno = 1
   cls
   Locate 1 , 1
   LCD "  Mit {001} ausw{225}hlen"                          'mit up auswählen
   Locate 2 , 1
   LCD "  Mit OK weiter"

   Datenaus = 1000

Datenausgabe1:
Do
   Debounce up , 0 , mehr , sub
   Debounce OK , 0 , Datenausgabe2
   If Timeout = 0 Then Goto Ausgabenabbruch                 'Timeout abgelaufen
Loop
'   goto Datenausgabe1

mehr:
   If Datenaus = 10 then
      Timeout = 10
      Datenaus = 100 : goto Dataaus
   End if
   If Datenaus = 100 then
      Timeout = 10
      Datenaus = 1000 : goto Dataaus
   End if
   If Datenaus = 1000 then
      Timeout = 10
      Datenaus = 10000 : goto Dataaus
   End if
   If Datenaus = 10000 then
      Timeout = 10
      Locate 2 , 21
      LCD "Alles   "
      Wait 1                                                '1 Sec anzeigen, dann mit Wert überschreiben
      Datenaus = AnzahlDatensaetze
      goto Dataaus
   End if
   Datenaus = 10
   Timeout = 10

Dataaus:
   'Print Datenaus
   Locate 2 , 21
   LCD Datenaus ; "      "
Return
'__________________________________

Datenausgabe2:
   ___lcdno = 0
   cls
   Locate 1 , 1
   LCD "mit up und down ausw{225}hlen"
   ___LCDno = 1
   Locate 1 , 1
   LCD "{001} w{225}hlt Ausgabe via RS232 {001}"
   Locate 2 , 1
   LCD "{002} w{225}hlt Ausgabe via Funk  {002}"

   Datenausgabe3:
   Timeout = 10
   Do
      Debounce up , 0 , RS232
      Debounce down , 0 , Funk
      If Timeout = 0 Then Goto Ausgabenabbruch              'Timeout abgelaufen
   Loop
'   goto Datenausgabe3

RS232:
   Ausleseadresse = Adresspointer - 32                      'neuester Datensatz
   ___lcdno = 0
   cls
   Locate 1 , 1
   LCD "gesendete Datens{225}tze:      "                    'der ; trennt die einzelnen Daten, CR trennt Datensätze
   ___LCDno = 1
   Locate 1 , 1
   cls
   LCD "mit {002} kann die Datenausgabe"                    'Mit Pfeil ab kann gestoppt werden
   Locate 2 , 1
   LCD "gestoppt werden"
   o = 0                                                    'Zähler für stoppen
   For p = 1 to Datenaus                                    'Anzahl auszugebende Datensätze

      ___LCDno = 0
      Locate 1 , 22
      LCD p                                                 'Datensatznummer ausgeben

      incr o
      n = 1
      Speicheradresse = Ausleseadresse
      gosub Read_EEPROM                                     'aktuelle Werte aus Eeprom holen

      'Temperaturanzeige vorbereiten; abgelegt im Integer-Format (-32768....+32767) als Overlay über Daten_out
      Do
         TemperaturSingle(n) = TemperaturInteger(n) / 10
         TempKomma = Fusing(TemperaturSingle(n) , "##.#")   'Komma festlegen
         TA_s(n) = ";" + Format(TempKomma , "+0000")        'Zahlenausgabe formatieren, ; ist Trennzeichen
         if Temperatursingle(n) > 100 then TA_s(n) = "; --.- "
         if Temperatursingle(n) < -100 then TA_S(n) = "; --.- "
         n = n + 1                                          'nächste Temperatur im Anzeigeformat
      Loop until n = 13                                     'max. 12 Temperaturen möglich
      Jahr = makebcd(Daten_out(3))
      Monat = makebcd(Daten_out(2))
      Tag = makebcd(Daten_out(1))
      Stunden = makebcd(Daten_out(4))
      Minuten = makebcd(Daten_out(5))
      Sekunden = makebcd(Daten_out(6))
      Print hex(Tag) ; "." ; hex(Monat) ; "." ; hex(Jahr) ; ";" ; hex(Stunden) ; ":" ; hex(Minuten) ; ":" ; hex(Sekunden) ; ";" ; chr(Daten_out(7)) ; ";" ; chr(Daten_out(8)) ;
      Print TA_s(1) ; TA_s(2) ; TA_s(3) ; TA_S(4) ; TA_s(5) ; TA_s(6) ; TA_s(7) ; TA_s(8) ; TA_s(9) ; TA_s(10) ; TA_s(11) ; TA_s(12) ; Chr(&h0D)
      Ausleseadresse = Ausleseadresse - 32                  'ein Datensatz früher
      If o = 20 then                                        'nach jedem 20. Datensatz auf Abbruch kontrollieren (scheint nicht zu gehen oder zu kurz)
         Debounce down , 0 , Ausgabenabbruch                'auf Abbruch prüfen
         o = 0                                              'neue Runde
      End if
   next p

Ausgabenabbruch:
   cls
   Goto MenueEnde


Funk:
   cls
   Goto MenueEnde

 

'==========================================================================
'========================= Festlegung Messintervall =======================
'==========================================================================

Intervall_einstellen:
Intervallanzeige = Messintervall

Intervall_einstellen1:
   ___lcdno = 0
   Locate 1 , 1
   LCD "Messintervall: " ; Intervallanzeige ; " Minuten  "  'und anzeigen
   locate 2 , 1
   LCD "---------------------------"
   ___lcdno = 1
   Locate 1 , 1
   LCD "mit up and down Intervall  "
   locate 2 , 1
   lcd "einstellen und dann OK     "                        'und anzeigen
   Debounce Up , 0 , Intervall_up , sub                     'mit up inkrementieren
   Debounce down , 0 , Intervall_down , sub                 'mit Down dekrementieren
   Debounce OK , 0 , Intervalluebernahme                    'mit OK abschliessen
   waitms 20                                                '50 ms warten
   If Timeout = 0 Then                                      'Timeout abgelaufen
      Goto MenueEnde
   Else
      Goto Intervall_einstellen1
   End If

Intervall_up:
   Intervallanzeige = Intervallanzeige + 1                  'inkrementieren
   Timeout = 10                                             '10 sec Timeout
Return

Intervall_down:
   Intervallanzeige = Intervallanzeige - 1                  'dekrementieren
   Timeout = 10                                             '10 sec Timeout
Return

Intervalluebernahme:
   Messintervall = Intervallanzeige
   goto MenueEnde

'===========================================================================
'========================= Zeit und Datum einstellen =======================
'===========================================================================
Zeit_stellen:
   ___LCDno = 0
   cls
   Locate 1 , 1
   LCD "Zeit und Datum werden aut."                         '
   Locate 2 , 1
   LCD "{245}ber DCF77 synchronisiert "
   if synchron = 1 then
      DCFsyn = " "
   Else
      DCFsyn = " nicht "
   End if
   ___LCDno = 1
   cls
   Locate 1 , 1
   LCD "  DCF" ; DCFsyn ; "synchron"
   Locate 2 , 1
   LCD "mit bel. Taste weiter     "

Zeit_stellen1:
   Debounce up , 0 , Abbruch
   Debounce down , 0 , Abbruch
   Debounce links , 0 , Abbruch
   Debounce rechts , 0 , Abbruch
   Debounce OK , 0 , Abbruch
      If Timeout = 0 Then                                   'Timeout abgelaufen
      Goto MenueEnde
   Else
      Goto Zeit_stellen1
   End if

Abbruch:
   cls
   Timeout = 0
   goto MenueEnde


'=============================================================================
'========== EEProm-Adresspointer zurück auf die Startposition setzen =========
'=============================================================================
'

Pointer_Reset:
   ___LCDno = 0
   Locate 1 , 1
   LCD "beim R{245}cksetzen werden     "
   Locate 2 , 1
   LCD "alte Werte {245}berschrieben   "
   ___LCDno = 1
   cls
   Locate 2 , 1
   LCD "    mit {002} best{225}tigen"

Pointer_Reset1:
   Debounce up , 0 , nicht_weiter
   Debounce down , 0 , Pointer_loeschen
   Debounce links , 0 , nicht_weiter
   Debounce rechts , 0 , nicht_weiter
   Debounce OK , 0 , nicht_weiter
      If Timeout = 0 Then                                   'Timeout abgelaufen
         Goto nicht_weiter
      Else
         goto Pointer_Reset1
      End If

Pointer_loeschen:
   Adresspointer = StartSpeicher                            'zurücksetzen
   gosub Write_Adress_pointer                               'und ins EEProm Speichern

nicht_weiter:
   cls
   Goto MenueEnde


'=============================================================================
'============================= EEProm-Subroutinen ============================
'=============================================================================
'
'Lesen des Adresspointers aus dem EEProm, die fixe Speicheradresse dafür ist &b01010000_00000000_00001000

Read_Adress_pointer:
    I2cstart                                                'Startbedingung
    I2cwbyte &b10100000                                     'Deviceadresse schreiben
    I2cwbyte &b00000000                                     'High-Byte
    I2cwbyte &b00001000                                     'Low Byte (Startadresse ist &h8)
    I2crepstart                                             'repeated start
    I2cwbyte &b10100001                                     'Deviceadresse für lesen
    I2CRBYTE APH_h , ACK                                    'highDWord high \
    I2CRBYTE APH_l , ACK                                    'highDWord low   > Adresspointer-
    I2CRBYTE APL_h , ACK                                    'lowDWord high   > DWord
    I2CRBYTE APL_l , NACK                                   'lowDWord low   /
    I2cstop                                                 'Stopbedingung
Return

'-------------------------------------------------------------------------------
'Schreiben des Adresspointers in das EEProm, die fixe Adresse dafür ist &b01010000_00000000_00001000

Write_Adress_pointer:
    I2cstart                                                'Startbedingung
    I2cwbyte &b10100000                                     'Deviceadresse, für schreiben
    I2cwbyte &b00000000                                     'High Byte der EEPROM-Adresse)
    I2cwbyte &b00001000                                     'Low Byte der EEPROM-Adresse)
    I2CWBYTE APH_h                                          '\
    I2CWBYTE APH_l                                          ' > aktueller Adresspointer
    I2CWBYTE APL_h                                          ' > Reset ist hex 00500020
    I2CWBYTE APL_l                                          '/
    I2cstop                                                 'Stopbedingung
    Waitms 10                                               'wird nun in die Zellen geschrieben
Return


'-------------------------------------------------------------------------------
'Lesen vom 24LC1025; die Adresse steht in "Speicheradresse"

Read_EEPROM:
   temp = 0
   EEPROM_Dev_Adr = low(EEPROM_Dev_Adresse)
   Shift EEPROM_Dev_Adr , left , 1                          'da 0 eingeschoben wird = schreiben
   H = High(EEPROM_Adresse)                                 'High Byte
   L = Low(EEPROM_Adresse)                                  'Low Byte
    I2cstart                                                'Startbedingung
    I2cwbyte EEPROM_Dev_Adr                                 'Write Deviceaddress
    I2cwbyte H                                              'MSB
    I2cwbyte L                                              'LSB
    I2crepstart                                             'repeated start
    EEPROM_Dev_Adr.0 = 1                                    'Bit0 auf 1 setzen = lesen
    I2cwbyte EEPROM_Dev_Adr                                 'Write Deviceaddress
   IF maxDaten > 1 THEN                                     'wenn mehr als 1 Byte gelesen werden soll,
      temp1 = maxDaten - 1                                  'Anzahl der Bytes minus 1
   FOR temp = 1 to temp1                                    'alle Bytes mit Ausnahme des letzten
      I2CRBYTE Daten_out(temp) , ACK                        'mit Acknowledge einlesen und ins Array kopieren
      NEXT temp
      I2CRBYTE Daten_out(maxDaten) , NACK                   'das letzte Byte ohne Acknowledge einlesen
   ELSE                                                     'falls nur 1 Byte gelesen werden soll,
    I2CRBYTE Daten_out(1) , NACK                            'dann dieses Byte gleich ohne Acknowledge einlesen
   END IF
   I2cstop                                                  'Stopbedingung
Return

'-------------------------------------------------------------------------------
'Schreiben zum 24LC1025; die Adresse steht in "Speicheradresse"

Write_EEPROM:
   temp = 1
   EEPROM_Dev_Adr = low(EEPROM_Dev_Adresse)
   Shift EEPROM_Dev_Adr , left , 1                          'da 0 eingeschoben wird = schreiben
   H = High(EEPROM_Adresse)                                 'High Byte der EEPROM-Adresse
   L = Low(EEPROM_Adresse)                                  'Low Byte der EEPROM-Adresse
    I2cstart                                                'Startbedingung
    I2cwbyte EEPROM_Dev_Adr                                 'Deviceadresse schreiben
    I2cwbyte H                                              'MSB (High Byte der EEPROM-Adresse)
    I2cwbyte L                                              'LSB (Low Byte der EEPROM-Adresse)
    I2cwbyte Daten_in(temp)                                 'den ersten Wert schreiben
beginn:                                                     'Bytezähler inkrementieren
   incr temp
   I2cwbyte Daten_in(temp)
   IF temp < maxDaten THEN goto beginn                      'die weiteren Werte schreiben
   I2cstop                                                  'Stopbedingung
   Waitms 10                                                'wird nun in die Zellen geschrieben
Return

 

'*************************************************************************************************************
'        *********************************************************************************************
'                *****************************************************************************
'                        *************************************************************