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.
Code:
'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 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