Probleme mit DS1307 und dessen Zeitausgabe

#7936543
Lesenswert?

Hallo, ich habe irgentwie Probleme den DS1307 zu verstehen. Dieser Sollte ja seine Sekunden, Minuten und Stunden in 2BCD ausgeben. Wie in meinem ASM-Listing ersichtlich lese ich den auch dementsprechend aus. Nur das mir dieser nicht die richtigen Daten liefert. Ist der Fehler in meinem Programm oder liegt der Fehler am DS1307. Hab derzeit nur diesen Einen DS1307 da, auf einem Fertigmodul von Amazon. Kenne sonst nur den PCF8583, allerdings ist dieser nicht bei mir vorrätig. Programmplatzanzeige und Frequenzanzeige funktionieren ohne Probleme. Im Anhang sind alle relevanten Dateien zu diesem Projekt.

Danke im voraus.

Angehängte Dateien:
#7936580
Lesenswert?

Thomas Z. schrieb:

Mediafox F. schrieb:

ohne +5V sehe ich die 1Hz auch nur mit Batterie.

Dann hängt der Pullup von Pin7 wohl an Vbat. Ich würde probehalber den Clock mal ausschalten. Nicht das die 0x10 der default sind. Nur so kannst du sicher sein, dass du den RTC beschreiben kannst

Man kann den SQWE abschalten. Der DS1307 wird also angesteuert. Im Anhang man was ich meine. Das schaut gar nicht nach 2BCD aus.

Angehängte Dateien:
#7936583
Lesenswert?

Mediafox F. schrieb:

Nur das mir dieser nicht die richtigen Daten liefert.

Was liefert er und was wäre deiner Meinung nach richtig?

Ist der Fehler in meinem Programm oder liegt der Fehler am DS1307.

Welche Daten laufen über den Airbus, d.h.was dekodiert der Logikanalysator? Nur wenn vom DS1307 die richtigen Daten über den Bus kommen, hat dein Programm eine Chance.

: Bearbeitet durch User
#7936589
Lesenswert?

Rainer W. schrieb:

Mediafox F. schrieb:

Nur das mir dieser nicht die richtigen Daten liefert. Ist der Fehler in meinem Programm oder liegt der Fehler am DS1307.

Was liefert er und was wäre deiner Meinung nach richtig? Welche Daten laufen über den I2C-Bus? Was dekodiert der Logikanalysator auf dem I2C. Nur wenn vom DS1307 die richtigen Daten über den Bus kommen, hat dein Programm eine Chance.

Anscheinend läuft der RTC über, also anstatt von 9 aus zu springen, zählt der weiter. Also statt 59 geht's auf 60. Dann liest mein Programm nicht mehr 0x59 oder 0x00, sondern 0x5A, was nicht BCD entspricht. Bei den Sekunden hab ich das Problem nicht, da zählt der schön von 0 bis 59.

#7936599
Lesenswert?

Falls das Verhalten des Chips nicht klar ist: Unter Linux gibt es Kommandozeilen-Tools zum Debuggen von I2C. Wenn dein Computer keine I2C Schnittstelle hat, kannst du einen Digispark (ATtiny85) als Adapter benutzen. Der wird vom Linux Kernel unterstützt.

Siehe

: Bearbeitet durch User
#7936812
Lesenswert?

Mediafox F. schrieb:

Danach gleich ausgelesen, Ergebnis 3E:6H. Irgentwas läuft schief.

Dann versuche es einmal mit systematischer Fehlersuche. Welche Daten laufen dabei über den I2C-Bus laufen?

Wenn ein 7-Segment Decoder/Ansteuerung solchen Mist ausgibt, versagt entweder der Dekoder oder der Fehlerabfang. Um das zu unterscheiden, musst du die Daten kennen, die in den Dekoder reingelaufen sind.

Mit "Irgentwas läuft schief" kommst du da nicht weiter.

: Bearbeitet durch User
#7937088
Lesenswert?

Hab mir die Leseroutine nochmals angeschaut, nun blinkt der Doppelpunkt und hab 1HZ am SQWE-Ausgang. Nur bleibt der nun bei 00:00 hängen. Liegt der Fehler eventuell hier:

RTC_CHECK:

1
; ------------------------
2
; jetzt lesen
3
; Sekunden
4

5
ldi temp, 0b11010000
6
mov i2cadr, temp
7
rcall i2c_start
8
ldi i2cdata, 0x00      
9
rcall i2c_write
10

11
clc
12
ldi temp, 0b11010001    ; DS1307 Read
13
mov i2cadr, temp
14
rcall  i2c_rep_start    ; Send repeated start condition and address
15

16
clc                       ; ACK
17
rcall i2c_read
18
mov temp, i2cdata
19
andi temp, 0x7F        ; nur 0..59
20
mov RTC_SEC, temp
21

22
; Minuten  
23
clc                       ; ACK
24
rcall i2c_read
25
mov RTC_MIN, i2cdata
26
andi RTC_MIN, 0x7F        ; nur 0..59
27

28

29
; Stunden
30
sec                       ; NACK
31
rcall i2c_read
32
mov RTC_HOUR, i2cdata
33
andi RTC_HOUR, 0x3F       ; nur 0..23 (bei 24h Modus)
34
rcall  i2c_stop
35
ret
#7937096
Lesenswert?

Mediafox F. schrieb:

Liegt der Fehler eventuell hier:

Nein. wie sollte es? Hast Du gelesen und verstanden was ich (und auch rawi) zuvor geschrieben habe?

Füge dies in Deinen Code ein und deaktiviere alles, was mit I²C zu tun hat!

1
RTC_CHECK:
2
    LDI    RTC_HOUR, 0x12
3
    LDI    RTC_MIN, 0x35
4
    LDI    temp, 0x40
5
    MOV    RTC_SEC, temp
6
RET

Gruß Jobst

: Bearbeitet durch User
#7937104
Lesenswert?

Jobst M. schrieb:

Mediafox F. schrieb:

Liegt der Fehler eventuell hier:

Nein. wie sollte es? Hast Du gelesen und verstanden was ich (und auch rawi) zuvor geschrieben habe?

Füge dies in Deinen Code ein und deaktiviere alles, was mit I²C zu tun hat!

1
> RTC_CHECK:
2
>     LDI    RTC_HOUR, 0x12
3
>     LDI    RTC_MIN, 0x35
4
>     LDI    temp, 0x40
5
>     MOV    RTC_SEC, temp
6
> RET
7
>

Gruß Jobst

Hat sich jemand "main.asm" angeschaut?

1
; I²C Init
2
rcall i2c_init
3
rcall RTC_INIT

Dann hier weiter:

RTC_INIT:

1
; CH-Bit löschen (Sekunden-Register)
2
ldi temp, 0b11010000
3
mov i2cadr, temp
4
rcall i2c_start
5
ldi i2cdata, 0x00      ; Register 0 = Sekunden
6
rcall i2c_write
7
ldi i2cdata, 0x00      ; Sekunden = 00
8
rcall i2c_write
9
rcall i2c_stop
10

11
; (Minuten-Register)
12
ldi temp, 0b11010000
13
mov i2cadr, temp
14
rcall i2c_start
15
ldi i2cdata, 0x01      ; Register 1 = Minuten
16
rcall i2c_write
17
ldi i2cdata, 0x35      ; Minuten = 35
18
rcall i2c_write
19
rcall i2c_stop
20

21

22
; (Stunden-Register)
23
ldi temp, 0b11010000
24
mov i2cadr, temp
25
rcall i2c_start
26
ldi i2cdata, 0x02      ; Register 2 = Stunden
27
rcall i2c_write
28
ldi i2cdata, 0x12      ; Stunden = 12
29
rcall i2c_write
30
rcall i2c_stop
31

32
; SQWE setzen (Control Reg = 0x07)
33
ldi temp, 0b11010000
34
mov i2cadr, temp
35
rcall i2c_start
36
ldi i2cdata, 0x07      ; Register 7 = Control
37
rcall i2c_write
38
ldi i2cdata, 0x10      ; SQWE=1, 1Hz
39
rcall i2c_write
40
rcall i2c_stop
41

42
rcall RTC_CHECK
43
ret

Man sieht am Oszi nur die Sendedaten am Bus, zurück kommem derzeit nur Sekunden und Nullen, deshalb 00:00.

Mit dem deinem Test von oben steht 12:35 im Display.

: Bearbeitet durch User
#7937695
Lesenswert?

Habe jetzt deinen asm-Code nicht komplett angesehen.

Aber hier meine Routinen für die DS1307 an einem Atmega64. Lief über 10 Jahre in einer Heizungssteuerung.

Mit der Routine "Uhr_Starten" wird die DS1307 initialisiert und einmal Datum und Uhrzeit gestellt.

Mit "TWI_Uhr_lesen" werden die Werte ausgelesen und im RAM abgelegt.

Angehängte Dateien:
#7937773
Lesenswert?

Mediafox F. schrieb:

I2C_Aktivitaet_Lesen.bmp

Wichtige Regeln - erst lesen, dann posten!

Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen. Siehe Bildformate.

Sind die Forenregeln wirklich so schwer zu verstehen?

Meiner Meinung nach liest der nicht nutzbares aus.

Logikanalysator kann dein Oszi nicht?

Dann dekodiere die Daten von Hand. Schreib hin, was du dekodierst, was du erwartest und was dir daran nicht gefällt, falls du eine zweite Meinung zur Nutzbarkeit haben möchtest. Vergleiche die Daten auf dem Bus mit dem, was du beim Einlesen im Debugger davon siehst.

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