DS1307 und Kalender

herby

Neues Mitglied
18. Feb. 2009
24
0
0
Sprachen
Hallo,
ich versuche seit Tagen den Kalender im DS1307 (laut Datenblatt bis zum Jahr 2100 gültig) in Betrieb zu nehmen.

Mit Date$ kann ich auch ein Datum hineinschreiben, aber es sind auch unmögliche Daten möglich, z.B. 31.02.2009
Wenn der Kalender funktionieren würde, sollte eigentlich die Abfrage mit
Datum = Date$ doch ein gültiges Datum zurückgeben. Aber Fehlanzeige, nach Überlauf der Uhrzeit über 23:59:59 kommt sogar der 32 Februar zurück ! :cheers: Toll jetzt werden wenigstens die Monate verlängert.:pleasantry:

Hat hier jemand Erfahrung mit diesem Teil und kann mir evtl. ein paar Tipps zur Lösung geben?

Gruß
Herbert
 
Hallo Herbert,

es ist ganz einfach: Wenn du das richtige Datum eingibst, wird das auch richtig weitergeführt! Unsinnige Datumeingaben werden nicht auf Plausibilität geprüft, das musst du in deinem Programm machen.
 
Hi Herbert,

möchte mich StevieL anschließen. Ich benutze in einem meiner Projekte seit zwei Jahren des DS1307 ohne Probleme. Es ist aber in der Tat so, dass dieser nur die normalen "Überläufe" von Monaten <=31 beherrscht. Wenn Du ihm also von vorn herein falsche Daten vorgibst so kann dieser nicht automatisch korrigieren.

Wenn ich das Datenblatt aber richtig verstanden habe geht das Spiel nur bis zum 63.02.xxxx. Hmmm, wäre nur interessant, was er danach macht, entweder 01.03. oder 01.02. wäre ein versuch Wert.... :p

Spass bei Seite! So Bausteine haben in der Regel eine Plausibilitätsüberprüfungen sondern das wird in der Tat der SW überlassen.

Grüße und viel Spass,
Markus
 
Hallo, und vielen Dank für eure Antworten.

Wenn ich das Datenblatt mit meinem Stümperenglisch richtig verstehe:

Date of the Month, Day of the Week and Year with leap-year Compesation
valid up to Year 2100.

heißt das doch nichts anderes als das ein Kalender vorhandes ist, der auch falsche Daten nicht akzeptiert oder?

Oder soll das nur bedeuten das der Laufende Kalender immer richtig rechnet?

Aber das dürfte doch bei Eingabe 28.02.09 nach dem Tagesüberlauf nicht der 29.02.09 als nächstes Tagesdatum augegeben werde, macht der Chip aber.

Warum ???

Echt total ratlos!:rolleyes:
Gruß
Herby
 
Hi Herby,

Date of the Month, Day of the Week and Year with leap-year Compesation
valid up to Year 2100.
Das heißt nur...
Der Baustein hat einen Kalender (Register dafür) in denen
der Tag des Monats (01,02,...,31),
der Tag der Woche (Wochentag Mo, Di, ...)
und Jahrezahl mit Schaltjahreskompensation bis 2100
drin ist.
Das heißt aber nicht, das der Baustein mit seiner Logik
Falscheingaben bereinigen kann. Die Überlauflogik für Tag/Monat/...
ist nur für richtige Werte auch definiert.
Heißt ... nach dem 31.01. kommt der 01.02. :)
heißt aber nicht ... nach dem 34.01. kommt der 01.02. !! :rolleyes:

Gruß
Dino
 
leap-year compensation bedeutet, dass der Chip über eine gültige Korrektur der Schaltjahre bis 2100 verfügt. Diese Aussage bezieht sich nicht auf falsche Inhalte.

Wenn die RTC richtig gesetzt ist sollte sie auch richtig arbeiten. Wenn dies nicht der Fall ist dann sollten wir gemeinsam suchen an wa es liegt.

Achtung: Der DS1307 arbeitet mit BCD-Formaten. Hast Du das berücksichtigt. BCD 23 ist nicht &B10111 sondern &B00100011. Eventuell entsteht hier bereits das Problem beim Beschreiben des RTC und bei der Interpretation der ausgelesenen Daten.

OTon: The end of the month date is automatically adjusted for months with less than 31 days, including corrections for leap year.

Bedeutet er macht definitiv Schaltjahreskorrekturen. Aber, hmmm 2009 ist definitiv KEIN Schaltjahr.

Grüße,
Markus
 
Danke Markus,
leap-year compensation bedeutet, dass der Chip über eine gültige Korrektur der Schaltjahre bis 2100 verfügt. Diese Aussage bezieht sich nicht auf falsche Inhalte.

Wenn die RTC richtig gesetzt ist sollte sie auch richtig arbeiten. Wenn dies nicht der Fall ist dann sollten wir gemeinsam suchen an wa es liegt.

Achtung: Der DS1307 arbeitet mit BCD-Formaten. Hast Du das berücksichtigt. BCD 23 ist nicht &B10111 sondern &B00100011. Eventuell entsteht hier bereits das Problem beim Beschreiben des RTC und bei der Interpretation der ausgelesenen Daten.

OTon: The end of the month date is automatically adjusted for months with less than 31 days, including corrections for leap year.

Bedeutet er macht definitiv Schaltjahreskorrekturen. Aber, hmmm 2009 ist definitiv KEIN Schaltjahr.

Das habe ich leider auch festgestellt.
Mit dem BCD ist kein Problem. habe ich aus dem Beispiel von Bascom entnommen.
Zum Überprüfen auf Schaltjahre hast Du eine tolle Routine gepostet, die funzt wunderbar.
Nun muß ich armer Thor also eine Eingabe- und Plausibilitätsprüfung selber basteln. Naja, die Eingaben sollen mit einer RC5 - 5 Tasten Fernbedienung erfolgen. Gut, die Eingabe von Uhrzeit und div. anderer Daten funktioniert schon, dann werde ich wohl diese Hürde auch noch nehmen.

Achso mein derzeitiges Projekt:

Wecker mit einigen Sonderfunktionen auf MEGA 32 in Bascom programmiert
Ansteuerung eines ELV (0-10V) .. man will ja nicht so schnell wach werden.
Temperaturmessung mit DS1820 Kette (3 Stck)
Schaltausgang für .....
Alle Funktionen und Einstellungen nur über RC5

Eingegebene Schaltzeiten werden im EEprom abgelegt damit man nach einem Stromausfall nicht wieder das Rad neu erfinden muß-
usw.

Läuft schon soweit, will jetzt noch den Kalender und damit auch den akt. Wochentag haben, damit man am Wochenenden auch ausschlafen kann!

Wenn ich das alles zum Funktioneren gebracht habe, werde ich das Projekt mal Posten.

Gruß Herbert

PS. Spruch des Tages:
Gestern standen wir noch am Rande des Abgrundes, heute sind wir einen Schritt weiter.
 
Hallo,
danke Markus für dein Angebot den Fehler gemeinsam zu suchen.
Ich denke das ich der Lösung schon sehr nahe bin. meine Datumseingabe und die Pausibilitätsprüfung funktioniren schon. U.a. auch mit hilfer der von Dir programmierten Schaltjahresfunktion. Tolles Teil, hat mir einige graue Haare und viele zermartete Hirnzellen erspart. Danke.:flowers:

Was mir jetzt eigentlich nur noch fehlt ist eine Routine die aus dem Datum den Wochentag berechnet. Vieleicht hast Du dafür eine Anregung für mich in Deinem Hobbyastronomenfundus.:D :D

Achso, fas hätte ich es vergessen::banghead:

In dem Beispielprogramm von Bascom für den DS1307 ist in der Sub
Setdate ein Fehler:
Es wir erst ab Byte 4 in den Baustein geschrieben, Byte 3 < Weekday> wird nicht in dem RTC gespeichert und kann dadurch auch nicht mit getdatetime zurückgelesen werden.
Wenn mann sich die Kommentare genauer betrachtet erkennt man das Settime nur kopiert und nachlässig editiert wurde.
Richtig müßte Setdatetime so aussehen:

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 3 ' starting address in 1307
I2cwbyte Weekday ' send Date to Weekday
I2cwbyte _day ' Day
I2cwbyte _month ' Month
I2cwbyte _year ' Year
I2cstop
Return

Ich denke das da schon mancher Probleme mit hatte.
 
Hallo Herbert,

wie es für die Programierung üblich ist, gibt es mehrere Wege um nach Rom zu kommen. Welchen möchtest Du gehen, den Schweren oder den Leichten?

Der Leichte Weg:
Eine Wochentagsberechnung gibt es fertig in BASCOM die benutzt werden kann.

Action:
Returns the Day of the Week of a Date.

Syntax:
Target = DayOfWeek()
Target = DayOfWeek(bDayMonthYear)
Target = DayOfWeek(strDate)
Target = DayOfWeek(wSysDay)
Target = DayOfWeek(lSysSec)

Remarks:
Target = A Byte – variable, that is assigned with the day of the week
BDayMonthYear = A Byte – variable, which holds the Day-value followed by Month(Byte) and Year (Byte)
StrDate = A String, which holds a Date-String in the format specified in the CONFIG DATE statement
WSysDay = A Word – variable, which holds the System Day (SysDay)
LSysSec = A Long – variable, which holds the System Second (SysSec)

The Function can be used with five different kind of Input:
1. Without any parameter. The internal Date-values of SOFTCLOCK (_day, _month, _year) are used.
2. With a user defined date array. It must be arranged in same way (Day, Month, Year) as the internal SOFTCLOCK date. The first Byte (Day) is the input by this kind of usage. So the Day of the Week can be calculated of every date.
3. With a Date-String. The date-string must be in the Format specified in the Config Date Statement
4. With a System Day – Number.
5. With a System Second - Number

The Return-Value is in the range of 0 to 6, Monday starts with 0.
The Function is valid in the 21th century (from 2000-01-01 to 2099-12-31).

Der schwere Weg:
Ich selbst hab es noch nicht programmiert aber ich möchte Deinen Tatendrang nicht bremsen :D
Unter http://de.wikipedia.org/wiki/Wochentagsberechnung ist sehr gut beschrieben wie es funktioniert. Viel Spass damit!


Liebe Grüße und schönen Abend,
Markus
 
Hallo Markus,
danke für den Zaun mit dem Winkpfahl!
Wie ist dasbei Louis de Fune'? :Bretter, Bretter Bretter......

sieh einen Oldie bitte nach das er in diesem Neudeutschem Karm nicht richtig lesen kann.....

Gruß und ein guts Nächtle

Herbert
 
null problemo

hallo herby,

ist wirklich kein thema - dazu bin ich ja da! ob dus glaubst oder nicht, auch ich übersehe heute noch viele dinge und wann hat manchmal ja auch probleme vor lauter bäume den wald zu erkennen!

mach dir keine gedanken und frag ruhig weiter.

grüße,
markus
 
Wochentagproblem

Hallo Herbert !

vielleicht bin ich schon etwas zu spät mit der Antwort aber ich habe mich auch lange mit dem Wochentagproblem herumgequält.
Du machst das richtig, beim Datum setzten
kann man auch eine Zahl (von 1-7) hineinschreiben für den Wochentag
und du kannst diese zahl auch auslesen

ich kopiere dir hier nur den wichtigsten programm auszug wie ich das gelöst habe. Obs Profesionell ist weis ich nicht ich find's einfach und bei mir funktionierts !

Ich definiere am Programmbeginn wie folgt die wochentage:

Dim Wochentag(7) As String * 2
Wochentag(1) = "Mo"
Wochentag(2) = "Di"
Wochentag(3) = "Mi"
Wochentag(4) = "Do"
Wochentag(5) = "Fr"
Wochentag(6) = "Sa"
Wochentag(7) = "So"

lese später die uhr so aus:

'================== Uhr auslesen ===================
Sub Uhr_auslesen()
I2cstart ' Generate start code
I2cwbyte Ds1307w ' sende Startadresse für schreiben(w)
I2cwbyte 0 ' start adress in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' sende Leseadresse für lesefunktion(r)
I2crbyte _sec , Ack ' Sec auslesen
I2crbyte _min , Ack ' min auslesen
I2crbyte _hour , Ack ' Std auslesen
I2crbyte Weekday , Ack ' Wochentag
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
'========== Ende Uhr auslesen =================



Tag = Makedec(weekday)
Print "Wochentag " ; Wochentag(tag)

ich bekomme immer vom DS1307 eine Wochentags Zahl geliefert von 1 bis 7 und wenn die interne Uhr 7 erreicht hat beginnt sie wieder bei 1.

wichtig ist nur beim setzen der Uhr dir richtige zahl reinschreiben.
funktioniert bei mir einwandfrei.

vielleicht konnte ich eine Anregung geben
schöne Grüße
Christian

PS.: meine erster Beitrag in einem Forum nicht bös sein wenn ich was falsch gemacht habe
 
Hi Chris,

PS.: meine erster Beitrag in einem Forum nicht bös sein wenn ich was falsch gemacht habe
Nasenfaktor paßt , sieht gut aus :D ;)

So wird das mit dem Wochentag auch unter Perl gemacht (Linux). Nur da hat
man die Wochentage von 0-7 wobei 0=7 ist. Und die Arrays beginnen dort
auch bei 0. Also so ...

@Tagesnamen = ('So' , 'Mo' , 'Di' , 'Mi' , 'Do' , 'Fr' , 'Sa' , 'So');
$Wochentag = @Tagesnamen[$Tagesnummer];

Zur Vervollständigung und als Info - Ist in allen Sprachen ähnlich :) .
Hat man also mal eine Sprache richtig gelernt kommt man auch mit anderen
ganz gut zurecht (nach ner kleinen Einarbeitungszeit) ;)

Weiter so ! :)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)