PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DCF77-Lib - Wie kann ich lediglich die Minuten nutzen ?



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.