Zitat von
Dirk
@Henrik:
Eine Zusatzfrage zu deiner abgewandelten Library:
Gibt es auch eine Möglichkeit, die DCF-Zeit in TIME$ und DATE$ zu übernehmen (zu einem Zeitpunkt, den ich im Prog bestimme) OHNE einen Quarz an TOSC anzuschließen?
D.h. kriege ich die Softclock im M32 auch ohne Quarz z.B. mit einem 1Hz-Timerimpuls zum laufen und kann sie dann (z.B. jede halbe Stunde) mit der DCF-Zeit updaten?
Oder könnte man in der Interruptroutine einen Zähler bis 40 einbauen, der bei jedem 40. Aufruf die Sek. um 1 hochzählt?
Das geht im Prinzip alles. Nur eine Fleißaufgabe, für die mir im Moment die Zeit etwas fehlt.
Um Date$ und Time$, die man dann etwas anders nennen muss, mit der Originallib von Albundy zu realisieren habe ich auf die Schnelle folgendes zusammengeschustert (der gewünschte "Universaleinsekundenzähler" ist auch drin):
Code:
'*******************************************************************************
'* DEMO für DCF77 Library von W. Krueger *
'* leicht abgewandelt von H.Reimers 02.04.2006 *
'*******************************************************************************
$regfile = "m32def.dat"
$crystal = 7372800
$baud = 9600
$hwstack = 64
$swstack = 64
$framesize = 64
'Config Lcdpin = Pin , Db4 = Pd.4 , Db5 = Pd.5 , Db6 = Pd.6 , Db7 = Pd.7 , _
'E = Pd.3 , Rs = Pd.2
'Config Scl = Portc.0
'Config Sda = Portc.1
'Portc.0 = 1 'Pullup Widerstand ein
'Portc.1 = 1 'Pullup Widerstand ein
'I2cinit 'I2C Initialisierung
'-------------------- Für I2C LCD und M32 Modul --------------------------------
$lib "Lcd_i2c.lib" 'i2c Treiber für das LCD
Dim _lcd_e As Byte 'Nötig für die Enable Auswahl
Const Pcf8574_lcd = 112 'Adresse des LCD-PCF
Waitms 200
_lcd_e = 128 'Für LCDs mit 1 Controller
Config Scl = Portc.0
Config Sda = Portc.1
Portc.0 = 1 'Pullup Widerstand ein
Portc.1 = 1 'Pullup Widerstand ein
I2cinit 'I2C Initialisierung
'-------------------------------------------------------------------------------
Config Lcd = 16 * 4
Config Adc = Single , Prescaler = Auto 'Für Analogtastatur
Config Rc5 = Pinc.3 'Benutzt Timer0 und INT0
'Für IR-Tastatur
'-------------------------------------------------------------------------------
$lib "dcf77_m32_A6.lib"
$external Dcf77
Declare Sub Dcf77
Config Timer0 = Timer , Prescale = 1024 'Timer für 40Hz (25ms)
Const Startwert = 76
Timer0 = Startwert
On Timer0 Tim0_isr 'Überlauf alle 25ms
Enable Interrupts
Enable Timer0
'-------------------------------------------------------------------------------
'Config Pinc.2 = 1 'Ausgang
'Beep Alias Pinc.2 'für Summer
Config Pina.6 = Input 'DCF 77 Eingang
Set Porta.6 'Pullup einschalten
Declare Sub Get_funkzeit()
Declare Sub Make_clockstrings()
Dim Status As Byte , Zaehler As Byte , Buffer As Byte , Impuls As Byte
Dim H_sek As Byte , Sekunde As Byte , T_min As Byte , T_std As Byte
Dim Minute As Byte , Stunde As Byte , Wotag As Byte , Tag As Byte
Dim Monat As Byte , Jahr As Byte , Pari As Byte , Pau As Byte , Imp As Byte
Dim Bcd_stunde As Byte
Dim Bcd_minute As Byte
Dim Bcd_sekunde As Byte
Dim Time_s As String * 10
Dim Bcd_tag As Byte
Dim Bcd_monat As Byte
Dim Bcd_jahr As Byte
Dim Date_s As String * 15
Dim Convert_strg As String * 10
Dim Counter_25ms As Word
Dim Counter_1sec As Word
'******************** HAUPTPROGRAMM ********************************************
Main:
Cls
Cursor Off
Lcd " DCF77 TEST"
Wait 5
Cls
Do
'Cls
Call Get_funkzeit()
Loop
End
'*************** ENDE HAUPTPROGRAMM ********************************************
Sub Get_funkzeit()
Call Make_clockstrings()
'Cls
Locate 1 , 2
Lcd Time_s
Print Time_s
Locate 2 , 2
If Status.3 = 1 And Status.4 = 1 Then Lcd Date_s
Locate 4 , 2
Lcd Bin(status)
'Wait 1
End Sub
'-------------------------------------------------------------------------------
Sub Make_clockstrings()
Bcd_stunde = Makebcd(stunde)
Bcd_minute = Makebcd(minute)
Bcd_sekunde = Makebcd(sekunde)
Bcd_tag = Makebcd(tag)
Bcd_monat = Makebcd(monat)
Bcd_jahr = Makebcd(jahr)
Time_s = Bcd(bcd_stunde) + ":" + Bcd(bcd_minute) + ":" + Bcd(bcd_sekunde)
Date_s = Lookupstr(wotag , Wochentag) + " " + Bcd(bcd_tag) + "." + _
Bcd(bcd_monat) + ".20" + Bcd(bcd_jahr)
End Sub
'-------------------------------------------------------------------------------
'------------------------ Interrupt Routine ------------------------------------
Tim0_isr:
Timer0 = Startwert
Incr Counter_25ms
If Counter_25ms > 39 Then
Counter_25ms = 0
Incr Counter_1sec
End If
Call Dcf77
Return
'------------------------ Daten für Wochentag ----------------------------------
Wochentag:
Data " " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
Grüße
Henrik
Lesezeichen