'**************************************************************************************************************************************
'* DCF77 und Temperatur Version 1.1 *
'* By Ralf Neubert Dinslaken *
'* 31.03.2009 *
'* (c) Logger by www.Avr-praxis.de *
'**************************************************************************************************************************************
$regfile = "m32def.dat"
$crystal = 3686400
$hwstack = 32
$swstack = 32
$framesize = 40
$lib "dcf77_4.lib"
$baud = 19200
Sda_port Alias Portd.1
Scl_port Alias Portd.0
'Const Lcd_testmodus = 1 ' Testmodus für LCD
'Const Dcf77_testmodus = 1 ' Testmodus für DCF77
'Config
Config Dcf77 = Pind.2 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 1 , Updatetime = 20 , Timer1sec = 1 , Debug = 1 , 'Gosub = Sectic
Enable Interrupts ' Interrupts aktivieren
Config Date = Dmy , Separator = . ' Datumsformat einstellen
' ----- Konfiguration LCD Display -----
Ddrb = &HFF
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , E2 = Portb.2 , Rs = Portb.1
Config Lcd = 40 * 4
Deflcdchar 0 , 24 , 24 , 6 , 9 , 8 , 9 , 6 , 32 ' Grad Celsius
Deflcdchar 1 , 4 , 31 , 17 , 17 , 17 , 17 , 17 , 31 ' Akku 0%
Deflcdchar 2 , 4 , 31 , 17 , 17 , 17 , 17 , 31 , 31 ' Akku 20%
Deflcdchar 3 , 4 , 31 , 17 , 17 , 17 , 31 , 31 , 31 ' Akku 40%
Deflcdchar 4 , 4 , 31 , 17 , 17 , 31 , 31 , 31 , 31 ' Akku 60%
Deflcdchar 5 , 4 , 31 , 17 , 31 , 31 , 31 , 31 , 31 ' Akku 80%
Deflcdchar 6 , 4 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' Akku 100%
' Pin für 1wire Schnittstelle festlegen
Config 1wire = Portd.4
'Messen der Akkuspannung
Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56 ' ADC für Akkuspannung
Config Pina.7 = Output
Dim Akku_spannung As Word
Dim Spannung As Word
Dim Spannung_alt As Word
'Akkumessung aktivieren
Akkumessung Alias Porta.7
'Akkumessung = 1
Dim ___lcdno As Byte
Dim T1 As Integer 'hilfs Variable für die berechnung Temp1
Dim T2 As Integer 'hilfs Variable für die berechnung Temp1
Dim T3 As Integer 'hilfs Variable für die berechnung Temp2
Dim T4 As Integer 'hilfs Variable für die berechnung Temp2
Dim T5 As String * 10 'Variable für Temp1 zur anzeige auf dem LCD
Dim T6 As String * 10 'Variable für Temp2 zur anzeige auf dem LCD
Dim T7 As Single 'hilfs Variable für die berechnung Temp1
Dim T8 As Single 'hilfs Variable für die berechnung Temp2
Dim Id1(8) As Byte 'für die adresse Sensor 1
Dim Id2(8) As Byte 'für die adresse Sensor 2
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp1 As Byte , Tmp2 As Byte
Dim W As Byte
Dim Z As Byte
Z = 0
'DCF77
Dim Dcf77_hour As Byte ' Globale Stundenvariable
Dim Dcf77_min As Byte ' Globale Minutenvariable
Dim Dcf77_sec As Byte ' Globale Sekundenvariable
Dim Dcf77_weekday As Byte ' Globaler Wochentag
Dim Dcf77_day As Byte ' Globale Tagvariable
Dim Dcf77_month As Byte ' Globale Monatsvariable
Dim Dcf77_year As Byte ' Globale Jahresvariable
Const Main_testmodus = 1 ' Testmodus für Testsystem
Dim Sec_old As Byte ' Schleifenvaraible SoftClock Sec
Sec_old = 99
Dim Dcfsec_old As Byte ' Schleifenvariable DCF77 Sec
Dcfsec_old = 99
Dim Dcf_sync_count As Word ' Zähler für Anzahl der Syncs
Dcf_sync_count = 0
' ----- Sonstiges -----
Dim Trace_out As Bit ' Ausgabesteuerung Trace
Trace_out = 0
Dim Temp_byte_1 As Word ' Temporäre Byte Variable
Dim Temp_integer_1 As Integer ' Temporäre Integer Variable
'Unterprogramme
Declare Sub Con_temp
Declare Sub Temp1
Declare Sub Temp2
'1wire Bus absuchen
W = 1wirecount()
Print W
Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
'**************************************************************************************************************************************
'Ersten text aufs Display schreiben
___lcdno = 0
'Obere Displayhälfte initialisieren, für den ersten Controller
Initlcd
Cls
Cursor Off
Locate 1 , 1
Lcd "Inn.:"
Locate 1 , 15
Lcd "Auss.:"
___lcdno = 1
'Untere Displayhälfte initialisieren, für den zweiten Controller
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "Temp. & DCF77 Ver1.0"
Cls
Locate 2 , 1
Lcd "(c) Logger by AVR-Praxis.de"
'Wait 3
'Locate 1 , 1
'Lcd " "
'**************************************************************************************************************************************
'Hauptprogramm
Do
'Z = Dcf_sec
If Z = 10 Then
If Z > 9 Then Z = 0
Gosub Con_temp
Gosub Temp1
Gosub Temp2
Else
Incr Z
End If
Print Z
'Temperaturen und °C aufs Display schreiben
___lcdno = 0 'Obere Displayhälfte initialisieren, für den ersten Controller
Locate 1 , 7
Lcd T5 ; " " ; Chr(0)
Locate 1 , 22
Lcd T6 ; " " ; Chr(0)
'***************************************************************************************************************************************
'Zeit und Datum aufs Display schreiben
For Temp_integer_1 = 1 To 78
Waitms 10 ' Schleife läuft max. 780 ms
If Sec_old <> _sec Then
Exit For
End If
If Dcfsec_old <> Dcf_sec Then
Exit For
End If
Next
Waitms 220 ' Mit 220 ms ist Sekunde voll
' Sekunden updaten
Sec_old = _sec ' Update SoftClock Sekunden
Dcfsec_old = Dcf_sec ' Update DCF77 Sekunden
' ___lcdno = 0
Temp_byte_1 = Dcf_status And &H80
' Prüfung ob SoftClock durch DCF77 synchronisiert (Bit 7 aus Statusbyte)
If Temp_byte_1 = &H80 Then
Incr Dcf_sync_count ' Sync-Counter erhören
' Zur Kontrolle bei erfolgreichem SYNC Status-Bit zurücksetzen
Reset Dcf_status.7
' Anzahl der erfolgen Sync auf LCD ausgeben
Temp_byte_1 = Makebcd(dcf_sync_count)
___lcdno = 0
Locate 2 , 1
Lcd Bcd(temp_byte_1)
End If
___lcdno = 1
Dcf77_weekday = Makebcd(_weekday)
Locate 1 , 1
Lcd Lookupstr(dcf77_weekday , Wochentag)
Locate 1 , 11
Lcd Date$ ; " " ; Time$ ; " "
If Time$ = "00:01:00" Then
Initlcd
Wait 1
End If
___lcdno = 0
Akkumessung = 1
Start Adc
Akku_spannung = Getadc(1)
Print "Adc 1 " ; Akku_spannung
Spannung = Akku_spannung
'Wait 1
'Locate 1 , 1
'Lcd Spannung , "####"
Locate 2 , 4
Lcd Chr(1)
If Spannung => 823 Then
Locate 2 , 4
Lcd ; Chr(2)
If Spannung => 873 Then
Locate 2 , 4
Lcd ; Chr(3)
If Spannung => 923 Then
Locate 2 , 4
Lcd ; Chr(4)
If Spannung => 973 Then
Locate 2 , 4
Lcd ; Chr(5)
If Spannung => 1015 Then
Locate 2 , 4
Lcd ; Chr(6)
End If
End If
End If
End If
End If
'End If
'Akkumessung = 0
Stop Adc
Locate 2 , 11
Lcd Date(dcf_day) ; " " ; Time(dcf_sec) ; " "
___lcdno = 0
Loop
'**************************************************************************************************************************************
'Temperaturen Convertieren
Sub Con_temp
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 850
1wreset
End Sub
'Temperatur 1 Berechnen
Sub Temp1
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Tmp1 = Ar1(1) And 1
If Tmp1 = 1 Then Decr Ar1(1)
T1 = Makeint(ar1(1) , Ar1(2))
T1 = T1 * 50
T1 = T1 - 25
T2 = Ar1(8) - Ar1(7)
T2 = T2 * 100
T2 = T2 / Ar1(8)
T1 = T1 + T2
T1 = T1 / 10
T7 = T1 / 10
T5 = Fusing(t7 , "###.#" )
End Sub
'Temperatur 2 Berechnen
Sub Temp2
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T3 = Makeint(ar2(1) , Ar2(2))
T3 = T3 * 50
T3 = T3 - 25
T4 = Ar2(8) - Ar2(7)
T4 = T4 * 100
T4 = T4 / Ar2(8)
T3 = T3 + T4
T3 = T3 / 10
T8 = T3 / 10
T6 = Fusing(t8 , "###.#" )
End Sub
End
'**************************************************************************************************************************************
Wochentag:
Data " " , "Montag" , "Dienstag" , "Mittwoch" , "Donnerstag" , "Freitag" , "Samstag" , "Sonntag"