'-----------------------------------------------------------------------------------------
'Titel : 1000erDezimalUhr
'Name : KiloDezimalUhr
'Datei : KiloDezimalUhr.bas
'Autor : Arno Schweißinger
'Datum : 28.10.2012
'Version : 0.02
'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: 29.10.2012
' V0.02: 01.11.2012 Routine Sub Ausgabe_stellen
'
'-----------------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 1000000
'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
Taster2 Alias Pind.7 ' Stunden
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 Loeschen4094
Declare Sub Stundensignal
Declare Sub Korrektur
Declare Sub Ausgabe
Declare Sub Ausgabe_stellen
Declare Sub Zahlout
Declare Sub Dezimalzeit
Const Starttime = "10:35:00"
Const Zeitkorrektur = 0 ' plus/minus x Sekunden am Tag, Max 30 Sek je Tag
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 Cache As Long ' Sub Dezimalzeit
Dim Temp As Byte ' Zwischenspeicher
'-------------------------
' Hauptprogramm
'-------------------------
'Begin
Call Init_prog
Do
If _sec <> Old_sec Then ' Sekundentakt
Old_sec = _sec
Call Dezimalzeit
Call Ausgabe
Call Stundensignal
Call Tastatur ' Taster auslesen
Call Korrektur ' wird einmal am Tag ausgeführt
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$ = Starttime
End Sub
'-----------------------------------------------------------------------------------------
Sub Dezimalzeit
Sekunden = Secofday() ' Vergangene Sekunden des Tages
' Umrechnen ins Dezimalsystem
Sekunden = Sekunden * 625 ' Dezimaltag hat 100*100*100 Sekunden 10000=2*2*2*2 *5*5*5*5
'625 = 5*5*5*5
Sekunden = Sekunden / 54 ' ein Tag hat 86400 Sekunden 864=2*2*2*2 *2*3*3*3
'54 = 2*3*3*3
Cache = Sekunden / 100000
Segmente(3) = Cache ' 100er
Cache = Cache * 100000
Sekunden = Sekunden - Cache
Cache = Sekunden / 10000
Segmente(2) = Cache ' 10er
Cache = Cache * 10000
Sekunden = Sekunden - Cache
Cache = Sekunden / 1000
Segmente(1) = Cache ' 1er
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 500
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 Loeschen4094 ' MOS 4093
For J = 2 To 4 ' Portd.2 bis Portd.4
For I = 0 To 7
Reset Dat ' der Übersicht wegen, einmal low immer low
Set Cl
Waitus 10 ' Clocksignal am 4093 erzeugen
Reset Cl
Next I
Set Portd.j
Waitus 100 ' 4093 Ausgänge setzen
Reset Portd.j ' kein strobe senden!!!!! LEDs flackern sonst
Next J
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
If _hour < 23 Then
Sound Soundpin , 20 , 40
Sound Soundpin , 40 , 40
End If
End If
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 &B0110_0111 ' A
Data &B0111_1100 ' B
Data &B0011_1001 ' C
Data &B0101_1110 ' D
Data &B0111_1001 ' E
Data &B0111_0001 ' F
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