Andree-HB
02.12.2010, 20:36
Ich nutze die mitgelieferte Bascom-Lib für DCF77, wie kann ich dort jeweils aus Zeit und Datum die Einzelvariablen herausziehen ?
Also z.B. Time(dcf_sec) in unterteilen/ansprechen, damit ich z.B. nur die Minuten für eine Weitervararbeitung bekomme.
Aus der Lib werde ich ehrlicherweise nicht wirklich schlau...
mat-sche
02.12.2010, 20:45
Hi Andree,
ich habe es so gelöst:
Dim Dcf_buff(7) As Byte
Do...
_sec = Makedec(dcf_buff(1)) : _min = Makedec(dcf_buff(2)) : _hour = Makedec(dcf_buff(3))
_day = Makedec(dcf_buff(5)) : _month = Makedec(dcf_buff(6)) : _year = Makedec(dcf_buff(7))
_weekday = Makedec(dcf_buff(4))
loop..
jetzt liegen alle Datum/Zeitvariablen in dem Dcf-Puffer. Damit kannst Du fleißig weiterarbeiten.
Habe auch noch eine Routine für die Abspeicherung/Lesen aus einem DS1307, seit langem stabil laufend, da. Bei Interesse einfach melden
Gruß MAT
Andree-HB
03.12.2010, 06:59
Prima, das wäre echt super, denn ich habe die gleiche RTC noch in der Schublade....
mat-sche
03.12.2010, 09:15
Moin!
ich habe es bei mir so implementiert, dass zu einer bestimmten Zeit geschaut wird, ob die Uhr im Programm gleich mit der im DS1307 läuft. Das Stellen der Uhr im DS 1307 wird dann gemacht wenn ein gültiges DCF Signal empfangen wurde. In der Bascomhilfe findest Du zu den Statusbit auch eine nähere Erklärung.
'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Config DCF77 & DS1307
Config Dcf77 = Pinb.6 , Timer = 1 , Inverted = 0 , Timer1sec = 1 , Update = 0 , Updatetime = 0 , Check = 1 , Debug = 0 , Gosub = Sectic               'Switchpower = 1 , Powerlevel = 1 , Powerpin = Pina.2
Enable Interrupts
Config Date = Dmy , Separator = .                                                                                                                     'deutsches Datumsformat
Dim Dcf_buff(7) As Byte
Dim Zeit_flag_set As Bit , Zeit_flag_get As Bit , Dcf77_set As Bit , Dcf_sig As Bit                                                                   'Variablen zum stellen der DS1307 Uhr und Systemuhr
Dcf_sig = 0
'Adresse der DS1307
Ds1307w = &HD0                                              'Schreibadresse der RTC
Ds1307r = &HD1 
do...
'------------------------------------------------------------------------------- Routine für die DCF77 Clock und stellen auslesen vom DS1307
Locate 2 , 2 : Lcd Time$ ; "   " ; Lookupstr(_weekday , Wochentag) ; "  " ; Date$ ; " "
Showpic 205 , 5 , Bant
If Dcf_sig = 1 Then
   Showpic 225 , 5 , Bempf
   Else
   Showpic 225 , 5 , Bx_empf
End If
If Dcf_status.2 = 1 And _sec = 58 Then                                                                                                                'nach erfolgreichem Empfang eines kompl. DCF77 Telegrammes wird Merker gesetzt
     Set Dcf_sig
       If Zeit_flag_set = 0 Then
           Gosub Setdatum                                                                                                                             'Sub zum stellen des Datums über TWI - DS1307
           Gosub Setzeit                                                                                                                              ''Sub zum stellen des Uhrzeit über TWI - DS1307
       End If
End If
If _sec = 58 And Dcf_status.2 = 0 Then                                                                                                                'wird kein kompl.DCF77 Telegramm empfangen =>Merkerrücksetzung
     Reset Dcf_sig
End If
If Dcf_sig = 0 And Time$ = "04:00:00" Then
   Dcf77_set = 0                                                                                                                                      'Uhr wird täglich um 4 nach ds1307 gestellt wenn kein DCF-Signal vorhanden ist
   Gosub Getdatumzeit
End If
If Dcf77_set = 0 
Then
   Gosub Getdatumzeit                                                                                                    
Dcf77_set = 1
End If
If Tagzaehler_old <> _weekday Then                                                                                                                    'bei jeden neuen Tag wird die Uhrzeit-Lichtwerte-Temperatur für RolladenHoch/Runter geladen
   Tagzaehler_old = _weekday
   Tagzaehler = _weekday
   Eeprom_flag2 = Lookup(_weekday , Tag)                                                                                                              'Zuordnung Tag zu EEPROM-Daten
   Readeeprom Rolladen_long , Eeprom_flag2                                                                                                            'für den jeweilige Tag werden die Zeitdaten für Rolladensteuerung aus dem EEPROM geladen
   Readeeprom Lichtdata_eeprom(1) , &H1C
   Readeeprom Lichtdata_eeprom(2) , &H1E
End If
loop...
'----------------------------subs
Setzeit:
'Einstellen der Zeit
'_sec = Makebcd(_sec)
'_min = Makebcd(_min)
'_hour = Makebcd(_hour)
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 0
'I2cwbyte _sec
'I2cwbyte _min
'I2cwbyte _hour
'I2cstop
 Setdatum:
'Einstellen der Tage
'_day = Makebcd(_day)
'_month = Makebcd(_month)
'_year = Makebcd(_year)
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 3
'I2cwbyte _weekday
'I2cwbyte _day
'I2cwbyte _month
'I2cwbyte _year
'I2cstop 
'DS1307 auslesen
Sub Uhrzeit
I2cstart                                                    'TWI Start
I2cwbyte Ds1307w                                            'Übergabe der Slaveadresse
I2cwbyte 0                                                  'Registerzähler wird auf null gesetzt
Getdatumzeit:
I2cstart                                                    'Zweite Startkondition
I2cwbyte Ds1307r                                            'Übergabe der Leseadresse
I2crbyte _sec , Ack                                         'Auslesen des Sekundenregisters
I2crbyte _min , Ack                                         'Auslesen des Minutenregisters
I2crbyte _hour , Ack                                        'Auslesen des Stundenregisters
I2crbyte _weekday , Ack
I2crbyte _day , Ack                                         'Auslesen des Tagesregisters
I2crbyte _month , Ack                                       'Auslesen des Monatsregisters
I2crbyte _year , Nack                                       'Auslesen des Jahresregisters
I2cstop                                                     'TWI Stoppkondition
_sec = Makedec(_sec)                                        'Umwandlung des BCD-Codes
_min = Makedec(_min)                                        'in eine Dezimalzahl
_hour = Makedec(_hour)
_year = Makedec(_year)
_month = Makedec(_month)
_weekday = Makedec(_weekday)
_day = Makedec(_day)
End Sub
Die Übertragung über TWI habe ich etwas anders als gewohnt gemacht und habe jetzt schnell mal die Übertragung gebastelt. Sollte so laufen. Wenn nicht, dann schau mal ins Datenblatt vom ds1307.
Gruß MAT
peterfido
03.12.2010, 12:25
Die Minuten stehen in _min 
Die DCF-Zeit-Variablen gehen ja 1 Minute (bzw ca 30 Sekunden) vor, da ja die Zeit für die nächste Minute übertragen wird.
Ich lese stets 4 Mal pro Sekunde die RTC aus und stelle diese nur, wenn eine gütlige Zeit empfangen wurde.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.