DS1307 ungültige Sekundenanzahl

Gast #4822851
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
Gast #4822863
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.
#4822890
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);
Gast #4822897
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
Angehängte Dateien:
Gast #4822925
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
Angehängte Dateien:
#4822936
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.
#4822949
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.
Gast #4822951
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
Angehängte Dateien:

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