Forum: Mikrocontroller und Digitale Elektronik DC1307 Plausibilität der Zeitwerte


von Philipp K. (numeriusnegidius)


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

von Teo D. (teoderix)


Lesenswert?

Philipp K. schrieb:
> 79:88
Ist dies das was Du eingibst o. das das was dann auch wirklich im 
DS1307 steht!?

von Philipp K. (numeriusnegidius)


Lesenswert?

Nein, das sind die Werte, die ich ausgegeben kriege.

Ich habe das ganze zur Kontrolle mal mit der ARduino RTC lib ausgelesen:

2013/6/11 53:64:47

von Dirk B. (devnull)


Lesenswert?

Ein ähnliches Problem hatte ich mit der DS1307 auch. Das Datenblatt hat 
hat recht, wenn Du Quatsch rein gibst, kommt Quatsch raus. Du wirst 
nicht umhin kommen, eine Plausibilitätsprüfung für die Werte zu bauen.

Viele Grüße,
Dirk

von Reinhard Kern (Gast)


Lesenswert?

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.

Gruss Reinhard

von Philipp K. (numeriusnegidius)


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...

von Peter D. (peda)


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.

von Wolfgang (Gast)


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.

von Peter D. (peda)


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 );

von Philipp K. (numeriusnegidius)


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!

von Peter D. (peda)


Lesenswert?

Ganz so einfach geht es nicht. Die AVR haben leider keinen extra 
VBATT-Eingang.
Man müßte die VBATT und VCC über Dioden zusammen führen oder über einen 
Supervisor-IC, z.B. MAX6363. Der liefert dann auch ein Signal zum 
Umschalten in den Stromsparmodus.

von Philipp K. (numeriusnegidius)


Lesenswert?

Dann werde ich mir das für mein nächstes Projekt aufsparen, den 1307 hab 
ich ja jetzt eh schon hier. Dein ROLLOVER Makro funktioniert übrigens 
wunderbar!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.