DC1307 Plausibilität der Zeitwerte

#3201485
Lesenswert?

Hallo allerseits,

ich möchte, dass mittels Tastendruck die Stunden- und Minutenwerte im 
DS1307 inkrementiert werden können.

So sieht etwa die Funktion für die Minuten aus:
1
void incrementminutes(){
2
  i2c_start_wait(Uhr+I2C_WRITE);
3
  i2c_write(1); //Adresse des Minuten Registers
4
  i2c_rep_start(Uhr+I2C_READ);
5
  uint8_t minute = bcdToDec(i2c_readNak());
6
  i2c_rep_start(Uhr+I2C_WRITE);
7
  i2c_write(1); //Adresse des Minuten Registers
8
  i2c_write(MinuteToBCD(minute + 1));
9
  i2c_stop();
10
}

Das Problem ist nun, dass die Minuten/Stundenzahl auf Knopfdruck zwar 
auch fröhlich erhöht wird, allerdings immer weiter: Ich kann also auch 
79:88 Uhr einstellen. Heißt das, dass ich die Plausibilitätsprüfung 
bereits im µC durchführen muss? Im Datenblatt heißt es zwar, dass 
"Illogical time and date entries result in undefined operation", ich 
hatte jedoch eigentlich gehofft, das Teil wäre schlau genug, um etwa bei 
Minuten > 59 automatisch wieder auf 0 zu springen und die Stunden um 
eins zu erhöhen.


Vielen Dank!

Philipp
#3201547
Lesenswert?

Reinhard Kern schrieb:

>
> was für ein grosses Wort für simples Zählen modulo 60.

Liegt wohl am Jurastudium... :)


Danke euch für die Antworten, ich probiers morgen mal aus!


Viele Grüße,

Philipp


Edit: Gerade mal drüber nachgedacht: Modulo 60 scheint mir im Moment so 
einleuchtend und simpel, dass ich mich ärgere, auf sowas nicht von 
selbst zu kommen. Ich hätte jetzt glatt mit if/else gearbeitet...
#3201686
Lesenswert?

Philipp K. schrieb:
> Im Datenblatt heißt es zwar, dass
> "Illogical time and date entries result in undefined operation",

Philipp K. schrieb:
> ich
> hatte jedoch eigentlich gehofft, das Teil wäre schlau genug, um etwa bei
> Minuten > 59 automatisch wieder auf 0 zu springen

Das wäre dann aber keine "undefined operation" mehr. Deine Hoffnung ist 
also eindeutig falsch.

Diese alten RTC-Chips sind wirklich nur einfache Zähler ohne jede 
Zusatzlogik oder Programm. Und Sommerzeit können sie auch nicht. Sie 
können ja nichtmal den Wochentag aus dem Datum berechnen.

Ich benutze schon ewig keine externe RTC mehr.
Heutige MCs haben doch Anschlüsse für Uhrenquarz und Stromsparmodi. Das 
macht auch die Programmierung bedeutend einfacher. Man hat schon alle 
Zeitvariablen direkt im MC und muß sie nicht umständlich hin- und 
herschaufeln oder noch extra in krude Zahlenformate konvertieren.
Gast #3201695
Lesenswert?

Reinhard Kern schrieb:
> Dirk B. schrieb:
>> eine Plausibilitätsprüfung
>
> was für ein grosses Wort für simples Zählen modulo 60. Ich arbeite
> gerade nicht mit C, aber ((minute + 1)%60) sollte genügen.

Und anscheinend schon gar nicht auf einem µC. Guck dir mal, je nach dem, 
um welchen µC es sich handelt, Rechenzeit und Codelänge für den 
"%x"-Operator an. Das läßt sich allenfalls mit dem Argument 
rechtfertigen, dass der Bediener seine Taste sowieso nicht so schnell 
gedrückt kriegt und sowieso Flash nicht knapp ist.
#3201717
Lesenswert?

Philipp K. schrieb:
> Ich hätte jetzt glatt mit if/else gearbeitet...

Mache ich auch glatt. "if" ist nämlich deutlich schneller und Code 
sparender.
Für einen Vergleich hat der AVR direkte Befehle und muß nicht erst die 
Divisionsroutine aus der Math-Lib aufrufen.

"if" ist also der elegantere Weg.
Und da man das sehr oft braucht, habe ich dafür ein Macro geschrieben:
1
#define ROLLOVER( x, max )  x = ++x >= max ? 0 : x
2
                       // count up and wrap around
3
// Aufruf:
4
 ROLLOVER( minute, 60 );
#3201750
Lesenswert?

Peter Dannegger schrieb:
>
> Ich benutze schon ewig keine externe RTC mehr.
> Heutige MCs haben doch Anschlüsse für Uhrenquarz und Stromsparmodi. .

Ich hab hier noch einen AtMega168V und 328P. Wenn ich mir das so 
anschaue, verbrauchen die im Stromsparmodus auch nicht mehr als der 
DS1307. Kann ich an den AtMega dann auch eine Knopfzelle anschließen, 
die ihn dann im Low Power Modus versorgt?

Peter Dannegger schrieb:
> Und da man das sehr oft braucht, habe ich dafür ein Macro
> geschrieben

Wow, super! Danke dir!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren