ECHTZEITUHR 1.bas | |
Quelle: www.C-Control-Support.net Weitere Infos im C-Control-Forum / C-Control I Info | Download ![]() |
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'III BASIC++ DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 IIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' ANWENDUNG: ECHTZEITUHR mit DCF77 SYNCHRONISIERUNG
' SYNC BIT IM CONFIG REGISTER
'--------------------------------------------------------------------
' Dieses Beispiel zeigt die Vorgehensweise um die SYSTEMUHR zu stellen
' bzw. abzufragen.
'
' Beschreibung:
' Das Betriebssystem stellt alle für eine Zeitsteuerung (inklusive
' des Datums)notwendigen Variablen als SYSTEMVARIABLEN zur Verfügung.
' Die Variablen können für die Einstellung der Uhr natürlich auch
' beschrieben werden
' Für eine automatische Einstellung ist an FREQ1 der Anschluss eines
' DCF77 Empfangsmoduls vorgesehen.
' Die interne Echtzeituhr läuft ohne DCF77 Synchronisierung mit einer
' für Quarzuhren typischen Ungenauigkeit.
' Das Beispiel setzt voraus, dass ein DCF77 EMPFANGSMODUL angeschlossen
' ist.
' Das Programm zeigt in einer Schleife Uhrzeit und die Minute der letzten
' Synchronisation an.
' Für diesen Zweck gibt es im KONFIGURATIONS REGISTER ein Bit (Bit5), das
' vom Betriebssystem gesetzt wird, wenn eine empfangene Zeitinformation
' auf die ECHTZEITUHR übertragen wurde (die interne Uhr also streng synchron
' läuft)
' Dieses Bit wird überprüft. Ist es gesetzt, leuchtet eine LED an Port
' 8 kurz auf, die aktuelle Minute wird in Zeile 2 des LCD geschrieben.
' danach wird das Bit wieder gelöscht, um die nächste Synchronisation
' erkennen zu können.
' Das LCD zeigt also in der zweiten Zeile die Minute der letzten
' Synchronisation.
'--------------------------------------------------------------------
' Das Konfigurations-Register bietet folgende Optionen.
'
' Bit 0 Schaltet beide PWM-DACs in den SERVO-Mode
' Bit 1 Schaltet den Frequenzzähler 1 in den EREIGNISZÄHLER Mode
' Bit 2 Schaltet den Frequenzzähler 2 in den EREIGNISZÄHLER Mode
' Bit 3 Aktiviert die PULLUP-Widerstände an PORT 1 bis 8
' Bit 4 Aktiviert die PULLUP-Widerstände an PORT 9 bis 15
' Bit 5 Zeigt an wenn die interne Uhr mit DCF77 synchronisiert wurde
' Bit 6 Signalisiert einen Fehler bei der IIC-Kommunikation
' Bit 7 Zustand der Start-Taste
'---------------------------------------------------------------------
'
' ANMERKUNG:
' Um eine möglichst grosse Sicherheit bei der Decodierung zu erreichen,
' benötigt der Decoder bei der ersten Synchronisaton mindestens 3
' komplette Datenrahmen. Ist ein kontinuierlicher Empfang des Zeitsignals
' gewährleistet, so findet alle zwei Minuten eine Synchronissation statt.
' Ausnahme ist eine Synchronisation zur vollen Stunde, da der DCF77 Decoder
' im Betriebsystem jeweils zwei Datenrahmen vergleicht, den Unterschied in
' der Minute berücksichtigt, aber den Wechsel in der Stunde
' unberücksichtigt lässt und zunächst als falsch interpretiert.
'
' Wenn zwei Datenrahmen vollständug decodiert sind, wartet das Betriebssystem
' auf die erste Sekunde der neuen Minute und stellt die Interne Uhr auf die DCF
' Zeit ein. Wenn während dieser Zeit "falsche" Sekundenimpulse vom Empfänger
' erzeugt werden (z.B. durch Störungen)kann es dazu führen, dass der Anfang der
' neuen Minute ncht richtig erkannt wird und die Uhr um bis zu zwei Sekunden
' falsch gestellt wird.
'
'-----------------------------------------------------------------------
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define BACKLIGHT port[16]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
'-------------------------------------------------
'-- CHECK SYNC BIT SUBROUTINE -
'-------------------------------------------------
FUNCTION CHECK_DCF()
define STATUS as byte
define LSYNC as byte
CONFIG.INIT
CONFIG.GET STATUS
'-------- SYNCHRON BIT ABFRAGEN ------------ ----
if (STATUS and 00100000b) <>0 then LSYNC=MINUTE
'-------------- SYNCHRON BIT LÖSCHEN -------------
CONFIG.PUT (STATUS and 11011111b)
CONFIG.OFF
RETURN LSYNC
END FUNCTION
'-------------------------------------------------
'-- SHOW TIME AND MINUTE OF SYNC -
'-------------------------------------------------
#MAIN
define LSYNC as byte
LCD.INIT
LCD.OFF
BACKLIGHT=off
#LOOP
LSYNC=CHECK_DCF()
LCD.INIT switchonly
'------- ZEIT AUF LCD AUSGEBEN -------------------
LCD.POS 1,5
if HOUR<10 then LCD.PRINT "0" 'FÜHRENDE NULL SCHREIBEN
LCD.PRINT HOUR & ":" 'STUNDEN AUSGEBEN
if MINUTE<10 then LCD.PRINT "0" 'FÜHRENDE NULL SCHREIBEN
LCD.PRINT MINUTE & ":"
if SECOND<10 then LCD.PRINT "0" 'FÜHRENDE NULL SCHREIBEN
LCD.PRINT SECOND
LCD.PRINT " "
'-- MINUTE DER LETZTEN SYNCHRONISATION AUSGEBEN --
LCD.POS 2,1
LCD.PRINT "SYNC: "& LSYNC & " "
LCD.OFF
goto LOOP
Powered by C-Control I Info |