Forum: Mikrocontroller und Digitale Elektronik DS1307 ungültige Sekundenanzahl


von Display78 (Gast)


Lesenswert?

Hallo,

ich habe versucht, aus einer DS1307 die Zeit auszulesen. Soweit sogut, 
es klappt ganz gut. Allerdings spinnen die Sekunden etwas d.h. es geht 
weiter als bis 60 Sekunden (ich glaube bis ca. 100). Eine Minute ist 
aber eine Minute. Was ist da los? Ich brauche die Sekundenanzahl, da es 
ein Temperaturlogger werden soll.

Danke im Voraus,
Display78

von Karl M. (Gast)


Lesenswert?

Hi,

da Du uns keine weiteren Infos lieferst, wird es auf "Zeile 42" 
herauslaufen.

Dein Beitrag liest sich wie folgt "mein Programm geht nicht, ich bin 
unfähig, wer kennt mein Programm und kann mir helfen ?"

Schade ich kann nicht hellsehen.

von Scharfanalyse (Gast)


Lesenswert?

Display78 schrieb:
> Was ist da los?

Du machst etwas falsch.

von Wilhelm M. (wimalopaan)


Lesenswert?

Stichwort: BCD-Codierung

von Joe F. (easylife)


Lesenswert?

Display78 schrieb:
> d.h. es geht
> weiter als bis 60 Sekunden (ich glaube bis ca. 100)

Ja, vermutlich bis 89.

Grund ist: das Sekundenregister ist nicht binär, sondern BCD.
In den Bits 0-4 steht der "Einer", in den Bits 4-5 der "Zehner".
Siehe Table 2 (S. 8).
Genauso auch die Stunden.

von 千里眼 (Gast)


Lesenswert?

Display78 schrieb:
> Allerdings spinnen die Sekunden etwas d.h. es geht
> weiter als bis 60 Sekunden (ich glaube bis ca. 100).

Dann liest du vielleicht das Jahr aus - das geht bis 99.

von Axel R. (Gast)


Lesenswert?

千里眼 schrieb:
> Display78 schrieb:
>> Allerdings spinnen die Sekunden etwas d.h. es geht
>> weiter als bis 60 Sekunden (ich glaube bis ca. 100).
>
> Dann liest du vielleicht das Jahr aus - das geht bis 99.

Dann säße er schon 'ne ganze Weile an seinem Problem :))

von Joe F. (easylife)


Lesenswert?

Vorschlag:
1
seconds = ((reg00 >> 4) & 0x07) * 10 + (reg00 & 0x0F);
2
minutes = ((reg01 >> 4) & 0x07) * 10 + (reg01 & 0x0F);
3
4
hours = reg02 & 0x0F;
5
if (reg02 & 0x40) // am/pm mode
6
{
7
  if (reg02 & 0x10)
8
    hours += 10;
9
    
10
  if (reg02 & 0x20) // pm
11
    hours += 12;
12
} 
13
else // 24h mode
14
{
15
  hours += ((reg02 >> 4) & 0x03) * 10;
16
}   
17
18
day   = ((reg03 >> 4) & 0x07);
19
date  = ((reg04 >> 4) & 0x03) * 10 + (reg04 & 0x0F);
20
month = ((reg05 >> 4) & 0x01) * 10 + (reg05 & 0x0F);
21
year  = ((reg06 >> 4) & 0x0F) * 10 + (reg06 & 0x0F);

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

>Dann säße er schon 'ne ganze Weile an seinem Problem
Nicht unbedingt, da das Jahr ja auch von ihm stammt.
Wahrscheinlich ein Fehler beim Rein und Raus (Zeit setzen und lesen).

von Display78 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Quelltext ist im Anhang (ist ein Picaxe-Basic Programm).
BCD-Codierung habe ich schon versucht, aber wenn ich die verwende, 
kommen falsche Werte raus. Mit allen anderen Werten geht es! Sekunden 
gehen bis 89.

Display 78

von Frank K. (fchk)


Lesenswert?

Siehe Datenblatt Seite 8 Table 2.

Bit 7 des Sekundenregisters darfst Du für die Sekunden nicht 
berücksichtigen.

fchk

von Joe F. (easylife)


Lesenswert?

Display78 schrieb:
> BCD-Codierung habe ich schon versucht, aber wenn ich die verwende,
> kommen falsche Werte raus

Wie hast du das versucht? Dieser Code fehlt.

von Display78 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hier mal der umfangreichere Code (es wird auch auf ein I2C eeprom 
24C32WP zugegriffen). Wenn ich alle Werte wie im Beispiel auf picaxe.com 
setze, sind diese total falsch. Mit diesem Code funtioniert eigendlich 
alles, bis auf die Sekunden. Zur Not kann ich auch auf die 
Sekundenangabe verzichten,es wird aber genauer mit.

Display78

von Joe F. (easylife)


Lesenswert?

Display78 schrieb:
> Wenn ich alle Werte wie im Beispiel auf picaxe.com
> setze, sind diese total falsch.

Nein, dann sind sie richtig.
In deinem Fall sind sie falsch.

  let hour    = 19
  let mins    = 55
  let seconds = 00

setzt die Uhrzeit in Wirklichkeit auf

13:37:00

denn 19 ist hexadezimal $13 (steht für BCD 13 Uhr),
und dezimal 55 ist hexadezimal $37

Für dich sieht es dann hinterher so aus, als ob die Uhrzeit stimmt, da 
du die gespeicherte Zeit nicht von BCD in Dezimal wandelst.

Du wirst aber feststellen, dass nicht nur die Sekunden alle 10 Sekunden 
um 6 Sekunden nach vorne springen, sondern auch die Minuten nach 
spätestens 10 Minuten nicht mehr stimmen.

: Bearbeitet durch User
von Joachim R. (jorath)


Lesenswert?


von Joe F. (easylife)


Lesenswert?

Setze mal die Uhrzeit korrekt als BCD Werte:
1
# set clock & date
2
3
let day     = $05  
4
let year    = $16  
5
let month   = $12  
6
let date    = $09  
7
let hour    = $19  
8
let mins    = $55  
9
let seconds = $00


und nach
1
readi2c 0,(seconds,mins,hour,day,date,month,year)

fügst du ein:
1
# convert BCD to decimal
2
3
seconds = ((seconds >> 4) & $07) * 10 + (seconds & $0F)
4
minutes = ((minutes >> 4) & $07) * 10 + (minutes & $0F)
5
hours   = ((hours   >> 4) & $03) * 10 + (hours & $0F)
6
day     = ((day     >> 4) & $07)
7
date    = ((date    >> 4) & $03) * 10 + (date & $0F)
8
month   = ((month   >> 4) & $01) * 10 + (month & $0F)
9
year    = ((year    >> 4) & $0F) * 10 + (year & $0F)

Dann sollte es korrekt funktionieren.

: Bearbeitet durch User
von Display78 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

So, jetzt geht es. Ich bekomme die Zeit jetzt auf Zehn Sekunden genau 
von der RTC, was ausreichend ist. Ich musste die Werte, wie Joe F. schon 
gesagt hat, wieder von BCD zu Decimal konvertieren. Im Anhang ist der 
jetzt funktionierende Sourcecode.

Display78

von Wilhelm M. (wimalopaan)


Lesenswert?

Tja: in Antwort Nr. 3 steht schon das Stichwort BCD-Codierung. Damit 
sollte es auch sekunden(!)genau gehen. Manchmal wundert man sich, warum 
Fragen gestellt werden, wenn die Antworten gar nicht beachtet werden...

von Joe F. (easylife)


Lesenswert?

Achso, jetzt verstehe ich was du mit "auf 10 Sekunden genau" meinst.
Die Zeit springt also jetzt immer um 10 Sekunden, ja?
Und die Minuten, Stunden etc. dann auch.

x/16*10

funktioniert eben nicht.
Mach die Konvertierung lieber richtig.

: Bearbeitet durch User
von Display78 (Gast)


Lesenswert?

Ich beschäftige mich auch schon mit AVRs, aber als ich das Projekt 
angefangen habe schien mir Picaxe dafür besser geeigne als ein AVR( 
damit kenne ich mich noch nicht so gut aus). Aber danke für die Hilfe.

Display78

von Joe F. (easylife)


Lesenswert?

Versuche es dann wenigstens mal mit
(x*10)/16
Etwas weniger "dreckig".

von Heiner (Gast)


Lesenswert?

Der TO-Troll ist leider beratungsresistent.

lg. Héiner

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.