'--------------------------------------------------------- ' (c) 2007 Hans Borngräber ' DCF 77 Uhr mit IN-12 Nixie-Anzeige ' DCF77_Nixie_in12_V24.BAS Version 2.4 ' 30.November 2007 '--------------------------------------------------------- $regfile = "M8def.dat" 'Atmega8 CPU $crystal = 16000000 'Quarz 16Mhz $baud = 19200 'Übertragungsgeschwindigkeit RS232; 19200 Baud 8,N,1 $hwstack = 256 $swstack = 256 $framesize = 256 Enable Interrupts Config Date = Dmy , Separator = . 'Einstellen des Datum Formates Tag, Monat, Jahr Trennzeichen Punkt Dim I As Integer Dim Wert As String * 1 'Übergabewert für die Ausgabe Routine Dim Um_wert As String * 2 'Vergleichswert für Umschaltzeitpunkz Datum / Uhrzeit Dim Um_zeitpunkt As String * 2 'Umschaltzeitpunkt Dim Bcd_byte As Byte 'BCD Ausgabewert für den Port an dem der SN74141 angeschloßen ist Dim Wein As Integer 'Multiplex Einschaltzeit Dim Waus As Integer 'Multiplex Ausschaltzeit Dim Sec_old As Byte , Dcfsec_old As Byte Dim Pn As Integer 'Pin Nummer des Multiplex Ports Dim Ar(2) As Byte ' Array für die gemessene Temperatur Dim A As Byte Dim P As Byte 'Zähler für Temperatur Array Dim Temperatur As Integer Dim Temp_str As String * 5 Dim Halb As Byte Dim _minold As Byte Dim Temp_kommastelle As String * 1 Dim Term_cls As String * 4 Dim Escape As Byte Dim Cur_off As String * 6 Dim Ks As String * 2 Dim Z1 As Integer Dim Sensor_ok As Byte 'Test des Temperatursensors Dim Weck_hour As Integer Dim Weck_min As Integer Dim Weck_zeit As String * 4 Dim Weck_hour_str As String * 2 Dim Weck_min_str As String * 2 Dim Alarm As Byte Dim Zeit As String * 6 Dim Zeit_inv As String * 6 Dim U As Integer Config Dcf77 = Pind.3 , Timer = 1 , Update = 1 , Updatetime = 1 , Debug = 0 , Inverted = 0 , Check = 1 , Gosub = Sectic Config 1wire = Portd.2 'DS1820 an Port D Pin2 Ddrd = &B11110100 'Definition Port D ( 1 = ausgang; 0= eingang) Portd = &B00000000 'Definition Pins an Port D ( 0= low level; 1= high level) Ddrb = &B11100000 Portb = &B00111111 Sec_old = 99 : Dcfsec_old = 99 'DCF Sekunden Variablen Wein = 1.4 'Multiplex Einschaltzeit optimiert für IN-12A/B Waus = 0.55 'Multiplex Ausschaltzeit !! Wichtig verhindert Geisterzahlen !! Um_zeitpunkt = "55" 'Umschaltzeitpunkt Uhrzeit Datum Escape = &H1B 'Escape Zeichen für VT100 Emulation Term_cls = Chr(escape) + "[2J" 'Sequenz Bildschirm löschen VT100 Emulation Cur_off = Chr(escape) + "[?25l" 'Sequenz Cursor abschalten VT100 Emulation Z1 = 0 Weck_min = 0 Weck_hour = 0 Weck_zeit = "0000" Alarm = 0 Print Term_cls 'Lösche Bildschirm Print Chr(escape) ; "DCF-77 Uhr V.2.4 fuer IN-12A" Print Cur_off 'Cursor abschalten Gosub Temp_messen ' *************** Hauptprogramm Schleife Do For I = 1 To 78 If Sec_old <> _sec Then Exit For End If If Dcfsec_old <> Dcf_sec Then Exit For End If Next Sec_old = _sec Dcfsec_old = Dcf_sec Gosub Ausgabe Print Chr(escape) ; "[3;1f" ; Time$ ; "--" ; Date$ If _min <> _minold Then Gosub Temp_messen Gosub Wecker _minold = _min End If If Dcf_sec > 45 Then Reset Dcf_status.7 End If Loop ' *************** Optional, hier wird nix gemacht Sectic: nop Return ' *************** Subroutine Umschaltung Uhrzeit Datum Temperatur Weckzeit Ausgabe: If Pinb.4 = 1 Then If _sec >= Um_zeitpunkt Then Gosub Datum_ausgabe Elseif _sec >= 49 Then If Sensor_ok < 255 Then Gosub Temp_ausgabe Else Gosub Zeit_ausgabe End If Else Gosub Zeit_ausgabe End If Else Gosub Weck_ausgabe End If Return ' *************** Subroutine zum ermitteln der Uhrzeit Zeit_ausgabe: Wert = Mid(time$ , 8 , 1) 'Ermitteln Sekunden Einer Pn = 0 Gosub Bcd_ausgabe Wert = Mid(time$ , 7 , 1) 'Ermitteln Sekunden Zehner Pn = 1 Gosub Bcd_ausgabe Wert = Mid(time$ , 5 , 1) 'Ermitteln Minuten Einer Pn = 2 Gosub Bcd_ausgabe Wert = Mid(time$ , 4 , 1) 'Ermitteln Minuten Zehner Pn = 3 Gosub Bcd_ausgabe Wert = Mid(time$ , 2 , 1) 'Ermitteln Stunden Einer Pn = 4 Gosub Bcd_ausgabe Wert = Mid(time$ , 1 , 1) 'Ermitteln Stunden Zehner Pn = 5 Gosub Bcd_ausgabe Return ' *************** Subroutine zum ermitteln des Datums Datum_ausgabe: Wert = Mid(date$ , 8 , 1) 'Ermitteln Jahr Einer Pn = 0 Gosub Bcd_ausgabe Wert = Mid(date$ , 7 , 1) 'Ermitteln Jahr Zehner Pn = 1 Gosub Bcd_ausgabe Wert = Mid(date$ , 5 , 1) 'Ermitteln Monat Einer Pn = 2 Gosub Bcd_ausgabe Wert = Mid(date$ , 4 , 1) 'Ermitteln Monat Zehner Pn = 3 Gosub Bcd_ausgabe Wert = Mid(date$ , 2 , 1) 'Ermitteln Tag Einer Pn = 4 Gosub Bcd_ausgabe Wert = Mid(date$ , 1 , 1) 'Ermitteln Tag Zehner Pn = 5 Gosub Bcd_ausgabe Return ' *************** Subroutine Temperaturanzeige Temp_ausgabe: Wert = Mid(temp_str , 5 , 1) Pn = 0 'Kommastelle Temperatur Gosub Bcd_ausgabe Wert = Mid(temp_str , 4 , 1) Pn = 1 'Kommastelle Temperatur Gosub Bcd_ausgabe Wert = Mid(temp_str , 2 , 1) Pn = 2 'Zehnerstelle Temperatur Gosub Bcd_ausgabe Wert = Mid(temp_str , 1 , 1) Pn = 3 'Einerstelle Temperatur Gosub Bcd_ausgabe Return ' *************** Subroutine Ausgabe Weckzeit Weck_ausgabe: Wert = Mid(weck_zeit , 4 , 1) Pn = 2 Gosub Bcd_ausgabe Wert = Mid(weck_zeit , 3 , 1) Pn = 3 Gosub Bcd_ausgabe Wert = Mid(weck_zeit , 2 , 1) Pn = 4 Gosub Bcd_ausgabe Wert = Mid(weck_zeit , 1 , 1) Pn = 5 Gosub Bcd_ausgabe Return ' *************** Subroutine zur Ausgabe im BCD-Kode Bcd_ausgabe: Incr Z1 Bcd_byte = Wert 'Umwandlung String --> Byte Shift Bcd_byte , Left , 4 '4 Bit nach links für Übergabe an Ausgabe PortD Pin 7,6,5,4 Toggle Portc.pn 'Anodenspannung einschalten an PortC.X (0,1,2,3,4,5) Portd = Bcd_byte 'Ausgabe BCD Wert an SN74141 über PortD Waitms Wein 'Einschaltzeit Anzeige If Z1 = 125 Then 'Abfrage der Stelltasten nach jeder 125ten Anzeigeschleife um flimmern zu verhindern Gosub Tastenabfrage Z1 = 0 End If Toggle Portc.pn 'Anodenspannung abschalten an PortC.X (0,1,2,3,4,5) Waitms Waus 'Abbau Anodenspannung abwarten !! Wichtig verhindert Geisterzahlen !! Return ' *************** Subroutine zur Temperaturmessung Temp_messen: 1wreset 'Abfrage ob DS1820 angeschloßen 1wwrite &H33 Sensor_ok = 1wread() If Sensor_ok = 255 Then Return 'Kein Sensor angeschlossen,Abbruch End If 1wreset 'Sensor vorhanden, Reset DS1820 1wwrite &HCC 1wwrite &H44 1wreset 1wwrite &HCC 1wwrite &HBE For P = 1 To 2 Ar(p) = 1wread() Next Temperatur = Ar(1) Temperatur = Temperatur If Ar(2) > 0 Then Temperatur = 0 Else Shift Temperatur , Right End If Halb = Ar(1) And 1 If Halb = 1 Then Ks = "50" Else Ks = "00" End If Temp_str = Str(temperatur) + "," + Ks Print Chr(escape) ; "[5;1f" ; "Temperatur : " ; Temp_str ; " C" Return ' *************** Subroutine zur Tastenabfrage Tastenabfrage: '------- Einstellen von Datum und Uhrzeit If Pinb.4 = 1 Then If Pinb.0 = 0 Then 'Handeinstellung Stunden und Tag '------- Taste Stunde wird zur Alarmabschaltung verwendet If Alarm = 1 Then 'Alarm abschalten wenn aktiv Toggle Portb.5 Alarm = 0 Return End If '------- Start Einstellroutine If Pinb.3 = 1 Then Incr _hour If _hour > 23 Then _hour = 0 End If _sec = 0 Else _sec = 55 Incr _day If _day > 31 Then _day = 1 End If End If End If If Pinb.1 = 0 Then 'Handeinstellung Minuten und Monat If Pinb.3 = 1 Then Incr _min If _min > 59 Then _min = 0 End If _sec = 0 Else _sec = 55 Incr _month If _month > 12 Then _month = 1 End If End If End If If Pinb.2 = 0 Then 'Handeinstellung Sekunde = 0 und Jahr If Pinb.3 = 1 Then _sec = 0 Else _sec = 55 Incr _year If _year > 99 Then _year = 0 End If End If End If Else '------- Einstellen Weckzeit If Pinb.0 = 0 Then 'Einstellung Alarm Stunde If Pinb.3 = 1 Then Incr Weck_hour If Weck_hour > 23 Then Weck_hour = 0 End If Weck_hour_str = Str(weck_hour) End If End If If Pinb.1 = 0 Then 'Einstellung Alarm Minute If Pinb.3 = 1 Then Incr Weck_min If Weck_min > 59 Then Weck_min = 0 End If Weck_min_str = Str(weck_min) End If End If Weck_min_str = Format(weck_min_str , "00") Weck_hour_str = Format(weck_hour_str , "00") Weck_zeit = Weck_hour_str + Weck_min_str End If Return ' *************** Subroutine Weckzeit prüfen Wecker: If Weck_hour = 0 Then If Weck_min = 0 Then Return End If 'Keine Weckzeit eingestellt End If If Weck_hour = _hour Then 'Weckzeit eingestellt und prüfen If Weck_min = _min Then Toggle Portb.5 'Alarm einschalten Alarm = 1 End If End If Return End