'-----------------------------------------------------------------------------------------
'Titel : HexadezimalUhr
'Name : HexadezimalUhr
'Datei : FFFUhr.bas
'Autor : Arno Schweißinger
'Datum : 04.11.2012
'Version : 0.03
'Compiler : Bascom 1.11.8.7
'MicroController : 1x AtMega8 1MHz interner Takt
'Hardware : 1x Uhrenquarz 32768Hz an TOSC1/2 - Pin 9/10
' 3x MOS 4094
' 3x 7Segmentanaeige
'
' Pind.0 an Data alle MOS 4094
' Pind.1 an Clock alle MOS 4094
' Pind.2 an Strobe1 IC1 MOS 4094
' Pind.3 an Strobe2 IC2 MOS 4094
' Pind.4 an Strobe3 IC3 MOS 4094
'
' Pinb.1 Lsp für Stundensignal
' Taster1 Alias Portd.6 Minuten
' Taster2 Alias Portd.7 Stunden
'
'
'
'Stromversorgung: : 5V
'Besonderes :
'Letzte Änderung :V0.01: 04.11.2012
' V0.02: 18.11.2012 Datum und Uhrzeit wird jede Stunde EEPROM gespeicher
' und bei einem Neustart aus dem EEPROM gelesen
' V0.03 24.11.2012 Änderung in Sub Zeitsichern
'
'-----------------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 32 ' default use 32 for the SW stack
$framesize = 40
'Config Portd = Output
Ddrd = &B00111111 ' Pin PD6 PD7 auf Eingang
Portd = &B1100000 ' Pin PD6 PD7 Pullup aktivieren
Dat Alias Portd.0 ' Datenübertragung an MOS4094
Cl Alias Portd.1 ' Clock Signal an MOS4094
Strobe1 Alias Portd.2 ' Strobe Signal U1 MOS4094
Strobe2 Alias Portd.3 ' Strobe Signal U2 MOS4094
Strobe3 Alias Portd.4 ' Strobe Signal U3 MOS4094
Taster1 Alias Pind.6 ' Minuten stellen
Taster2 Alias Pind.7 ' Stunden stellen
Soundpin Alias Pinb.1
'configure clock
Config Date = Dmy , Separator = . ' ANSI-Format
Config Clock = Soft ' this is how simple it is
Enable Interrupts
Declare Sub Init_prog
Declare Sub Tastatur
Declare Sub Sende4094
Declare Sub Stundensignal
Declare Sub Korrektur
Declare Sub Ausgabe
Declare Sub Ausgabe_stellen
Declare Sub Zahlout
Declare Sub Hexadezimalzeit
Declare Sub Datenkonsistent
Declare Sub Error
Declare Sub Zeitsichern
Const Zeitkorrektur = 0 ' plus/minus x Sekunden am Tag, Max 30 Sek je Tag
Dim E_time As Eram String * 8 ' Zeit im EEPROM
Dim E_date As Eram String * 8
Dim E_temp As String * 8 ' Zwischenspeicher Sub Zeitsichern
Dim Segmente(3) As Byte ' 3 * 8bit für LED, gesendet an 4093
Dim Old_sec As Byte ' Hauptprogramm
Dim I As Byte ' Registerloeschen; Uebertragen; Zählschleifen
Dim J As Byte ' Registerloeschen; Uebertragen
Dim Korrekturflag As Byte ' Sub Korrektur einmal am Tag korrigieren
Dim Sekunden As Long ' Sub Dezimalzeit
Dim Temp As Byte ' Zwischenspeicher
' Sub Tastatur; Sub Ausgabe_stellen
'-------------------------
' Hauptprogramm
'-------------------------
'Begin
Call Init_prog
Do
If _sec <> Old_sec Then ' Sekundentakt
Old_sec = _sec
Call Hexadezimalzeit
Call Ausgabe ' umrechnen in die Hexadezimalzeit
Call Stundensignal ' 7Segmentanzeige
Call Tastatur ' Taster auslesen
Call Korrektur ' wird einmal am Tag ausgeführt
Call Zeitsichern ' einmal in der Stunde
End If
Loop
End ' ende Hauptprogramm
'-----------------------------------------------------------------------------------------
Sub Init_prog
Segmente(1) = Lookup(7 , Balken) ' Balken in der Mitte -Seg7
Segmente(2) = Lookup(7 , Balken) ' Balken in der Mitte -Seg7
Segmente(3) = Lookup(7 , Balken) ' Balken in der Mitte -Seg7
Call Sende4094
Sound Soundpin , 40 , 40 ' Bestätigungston
Waitms 100 ' warte kurz
Sound Soundpin , 40 , 40 ' Bestätigungston
Time$ = E_time
Date$ = E_date
Call Datenkonsistent '
End Sub
'-----------------------------------------------------------------------------------------
Sub Datenkonsistent
If _hour > 23 Then Call Error
If _min > 59 Then Call Error
If _sec > 59 Then Call Error
If _day > 31 Then Call Error
If _month > 12 Then Call Error
End Sub
'-----------------------------------------------------------------------------------------
Sub Error ' Neustart
E_time = "00:00:00"
E_date = "01.01.00"
Waitms 500
$asm
jmp 0000 ' cpu reset
$end Asm
End Sub
'-----------------------------------------------------------------------------------------
Sub Hexadezimalzeit
Sekunden = Secofday() ' Vergangene Sekunden des Tages
' Umrechnen ins HexaDezimalsystem
Sekunden = Sekunden * 512 ' HexaDezimaltag hat FFFF Sekunden 2°16 65536=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2
'512 = 2°9
Sekunden = Sekunden / 675 ' ein Tag hat 86400 Sekunden 86400=2*2*2*2*2*2*2 *3*3*3 *5*5
'675 = 3*3*3*5*5
' Hextime = Hexval(sekunden ) ' ERROR 42 ????
Sekunden = Sekunden / 16
Segmente(1) = Sekunden Mod 16 ' 1er
Sekunden = Sekunden / 16
Segmente(2) = Sekunden Mod 16 ' 10er
Sekunden = Sekunden / 16
Segmente(3) = Sekunden ' 100er
End Sub
'-----------------------------------------------------------------------------------------
Sub Ausgabe
Segmente(1) = Lookup(segmente(1) , Zahlen) ' Zahl in Segmente wandeln 0-9
Segmente(1).7 = _sec.0 ' Dezimalpunkt blinkt im Sekundertakt
Segmente(2) = Lookup(segmente(2) , Zahlen)
Segmente(3) = Lookup(segmente(3) , Zahlen)
Call Sende4094 ' Bits an Latch MOS4094 senden
End Sub
'-----------------------------------------------------------------------------------------
Sub Ausgabe_stellen
Sound Soundpin , 10 , 20 ' Bestätigungston
Segmente(2) = Temp / 10 ' Zehener Stellen
Segmente(1) = Temp Mod 10 ' Einer Stellen
Segmente(1) = Lookup(segmente(1) , Zahlen) ' Zahl in Segmente wandeln 0-9
Segmente(2) = Lookup(segmente(2) , Zahlen)
Segmente(3) = Lookup(7 , Balken)
Call Sende4094 ' Bits an Latch MOS4094 senden
Waitms 400
End Sub
'-----------------------------------------------------------------------------------------
Sub Tastatur
'------------------ Minuten stellen ------------------------
If Taster1 = 0 Then
_sec = 00 ' Sekunden löschen
_min = _min + 1
If _min = 60 Then _min = 0
Temp = _min
Call Ausgabe_stellen
Waitms 500 ' 1/2 Sekunde warten
While Taster1 = 0 ' Taster gehalten, dann scheller Vorlauf
_min = _min + 1
If _min = 60 Then _min = 0
Temp = _min
Call Ausgabe_stellen
Wend
End If
'------------------ Stunden stellen ------------------------
If Taster2 = 0 Then
_hour = _hour + 1
If _hour = 24 Then _hour = 0
Temp = _hour
Call Ausgabe_stellen
Waitms 500 ' 1/2 Sekunde warten
While Taster2 = 0 ' scheller Vorlauf
_hour = _hour + 1
If _hour = 24 Then _hour = 0
Temp = _hour
Call Ausgabe_stellen
Wend
End If
End Sub
'-----------------------------------------------------------------------------------------
Sub Sende4094
For J = 2 To 4 ' Portd.2 bis Portd.4
For I = 7 To 0 Step -1
Dat = Segmente(j - 1).i
Set Cl
Waitus 10
Reset Cl ' Clocksignal am 4093 erzeugen
Next I
Set Portd.j
Waitus 100 ' 4093 Ausgänge setzen
Reset Portd.j
Next J
End Sub
'-----------------------------------------------------------------------------------------
Sub Korrektur ' Zeit Korrektur einmal am Tag, wenn der Quarz etwas abweicht
If Korrekturflag = 0 Then ' Korrekturbit setzen
If _sec = 0 Then
If _min = 0 Then
If _hour = 23 Then
Korrekturflag = 1
End If
End If
End If
End If
If Korrekturflag = 1 Then ' Korrektur vornehmen
If _sec = 30 Then
If _min = 30 Then ' es ist wo weit
If _hour = 23 Then
_sec = _sec + Zeitkorrektur
Korrekturflag = 0
End If
End If
End If
End If
End Sub
'-----------------------------------------------------------------------------------------
Sub Stundensignal
If _sec = 0 Then
If _min = 0 Then
If _hour > 6 Then ' nachts nicht Pipsen 23-6 Uhr
If _hour < 23 Then
Sound Soundpin , 20 , 40
Sound Soundpin , 40 , 40
End If
End If
End If
End If
End Sub
'-----------------------------------------------------------------------------------------
Sub Zeitsichern
If _sec = 30 Then
If _min = 0 Then
Wait 1
E_temp = Time$ ' verhindert laden und scheiben beim reset
E_time = E_temp ' Zeit sichern
E_temp = Date$
E_date = E_temp ' einmal in der Stunde
Sound Soundpin , 40 , 10 ' Bestätigungston
End If
End If
End Sub
'-----------------------------------------------------------------------------------------
Zahlen:
'Segm gfe_dcba
Data &B0011_1111 ' 0
Data &B0000_0110 ' 1
Data &B0101_1011 ' 2
Data &B0100_1111 ' 3
Data &B0110_0110 ' 4
Data &B0110_1101 ' 5
Data &B0111_1101 ' 6
Data &B0000_0111 ' 7
Data &B0111_1111 ' 8
Data &B0110_1111 ' 9
Data &B1111_0111 ' A dp
Data &B1111_1100 ' B dp
Data &B1011_1001 ' C dp
Data &B1101_1110 ' D dp
Data &B1111_1001 ' E dp
Data &B1111_0001 ' F dp
Balken:
Data &B00000000 ' 0 alles aus
Data &B00000001 ' 1 Seg 1
Data &B00000010 ' 2 Seg 2
Data &B00000100 ' 3 Seg 3
Data &B00001000 ' 4 Seg 4
Data &B00010000 ' 5 Seg 5
Data &B00100000 ' 6 Seg 6
Data &B01000000 ' 7 Seg 7
Data &B10000000 ' 8 DezPunkt