Softclock
(armin77, 10.04.2013, 14:37:19)
Braucht man eine genaue Uhrzeit im Programm, möchte aber kein DCF Modul oder eine RTC wie den DS1307 benutzen, gibt
es die einfache Möglichkeit einer Soft-Clock.
Hier wird an die TOSC1 und TOSC2 Eingänge ein Uhrenquarz mit 32,768 kHz angeschlossen.
Damit erreicht man einen Takt von genau einer Sekunde.
Der Quarz sollte so nah wie möglich an die Pins des AVR angeschlossen werden.
Beim ATMega8 sind TOSC1 und TOSC2 gleichzeitig die Anschlüsse XTAL1 und XTAL2.
Es muß daher bei Benutzung der Soft-Clock der interne RC-Oszillator für die Taktfrequenz des AVR benutzt werden.
Bei den größeren AVR sind TOSC1 und TOSC2 als zusätzliche Pins herausgeführt.
Dort kann, wie gewohnt, an XTAL1 und XTAL2 ein Quarz für die Taktfrequenz angeschlossen werden.
Bei der Benutzung des Befehl dimensioniert Bascom automatisch folgende Variablen mit
denen sich die Uhr stellen läßt oder Schaltzeitpunkte erstellen lassen.
_sec , _min , _hour, _day , _month , _year
Beispiel:
_min = 13
incr _hour
Beispiel:
_min = 13
incr _hour
Hier ein Beispielprogramm:
$regfile = "m8adef.dat"
$Crystal=1000000
$hwstack=40
$swstack=30
$framesize=32
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off
Enable Interrupts
Config Clock = Soft
Config Date = dmy , Separator = . 'Datum konfigurieren Tag/Monat/Jahr, Teiler ist ein Punkt
Time$ = "10:45:13" 'Vorgabe Uhrzeit
Date$ = "10.04.13" 'Vorgabe Datum
Do
Locate 1 , 1
Lcd "Uhrzeit: " ; Time$
Locate 2 , 1
Lcd "Datum: " ; Date$
Loop
End
$Crystal=1000000
$hwstack=40
$swstack=30
$framesize=32
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off
Enable Interrupts
Config Clock = Soft
Config Date = dmy , Separator = . 'Datum konfigurieren Tag/Monat/Jahr, Teiler ist ein Punkt
Time$ = "10:45:13" 'Vorgabe Uhrzeit
Date$ = "10.04.13" 'Vorgabe Datum
Do
Locate 1 , 1
Lcd "Uhrzeit: " ; Time$
Locate 2 , 1
Lcd "Datum: " ; Date$
Loop
End
Zusätzlich kann mit dem Befehl:
Config Clock = Soft , Gosub = Sectic
....
do
.....
.....
loop
end
Sectic:
....
.....
Return
....
do
.....
.....
loop
end
Sectic:
....
.....
Return
eine Interrupt Routine konfiguriert werden, die jede Sekunde ausgeführt wird.
Sie muß zwingend den Namen Sectic haben und mit Return wie alle anderen Unterprogramme enden.
Hier zwei Bilder vom Versuchsaufbau: