Forum: Mikrocontroller und Digitale Elektronik Probleme mit DS1307 und dessen Zeitausgabe


von Mediafox F. (mediafox_f)


Angehängte Dateien:

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.

von Thomas Z. (usbman)


Lesenswert?

Schau mal nach ob am Pin7 des RTCs ein 1Hz Signal anliegt. Ev muss da 
noch ein Pullup dran falls keiner auf dem Modul bestückt ist.
Wenn nein geht deine I2C Kommunikation nicht, oder der Quarz schwingt 
nicht.

: Bearbeitet durch User
von Mediafox F. (mediafox_f)


Lesenswert?

Thomas Z. schrieb:
> Schau mal nach ob am Pin7 des RTCs ein 1Hz Signal anliegt. Ev muss da
> noch ein Pullup dran falls keiner auf dem Modul bestückt ist.
> Wenn nein geht deine I2C Kommunikation nicht, oder der Quarz schwingt
> nicht.

Die 1Hz sind da, ohne +5V sehe ich die 1Hz auch nur mit Batterie. 
Scheint OK zu sein

von Thomas Z. (usbman)


Lesenswert?

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

: Bearbeitet durch User
von Mediafox F. (mediafox_f)


Angehängte Dateien:

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.

von Rainer W. (rawi)


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
von Mediafox F. (mediafox_f)


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.

von Thomas Z. (usbman)


Lesenswert?

Die Lese Sequenz ist doch falsch oder? Versuchs mal repeated start 
nachdem du die Register Addresse geschrieben hast.

von Nemopuk (nemopuk)


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
- https://github.com/harbaum/I2C-Tiny-USB
- https://wiki.st.com/stm32mpu/wiki/I2C_i2c-tools
- 
https://www.abelectronics.co.uk/kb/article/1092/i2c-part-3-i2c-tools-in-linux

: Bearbeitet durch User
von Mediafox F. (mediafox_f)


Angehängte Dateien:

Lesenswert?

Uch habe mal probeweise die Uhrzeit grob beim Start eingeben: 12:35
Danach gleich ausgelesen, Ergebnis 3E:6H.
Irgentwas läuft schief.

von Harald K. (kirnbichler)


Lesenswert?

Mediafox F. schrieb:
> Ergebnis 3E:6H.
> Irgentwas läuft schief.

Wenn das auf Deinem 7-Segment-display 'rauskommt, riecht das sehr streng 
danach, daß Deine Routine zur Ansteuerung der 7 Segmente nicht das tut, 
was sie soll.

von Thomas Z. (usbman)


Lesenswert?

nun wie schon gesagt: Figure 6 beschreibt eindeutig dass man den 
Repeated_Start zum lesen verwenden soll. Das machst du nicht und willst 
es offensichtlich auch nicht. Statt dessen setzt du die Stop Contition 
und dann wieder Start

von Rainer W. (rawi)


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
von Jobst M. (jobstens-de)


Lesenswert?

"H" kommt definitiv nicht über den Bus. Das geht nur bis F, sofern das 
überhaupt gesendet werden sollte.

Gruß
Jobst

von Mediafox F. (mediafox_f)


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:

    ; ------------------------
    ; jetzt lesen
    ; Sekunden

    ldi temp, 0b11010000
    mov i2cadr, temp
    rcall i2c_start
    ldi i2cdata, 0x00
    rcall i2c_write

    clc
    ldi temp, 0b11010001    ; DS1307 Read
    mov i2cadr, temp
    rcall  i2c_rep_start    ; Send repeated start condition and address

    clc                       ; ACK
    rcall i2c_read
    mov temp, i2cdata
    andi temp, 0x7F        ; nur 0..59
    mov RTC_SEC, temp

    ; Minuten
    clc                       ; ACK
    rcall i2c_read
    mov RTC_MIN, i2cdata
    andi RTC_MIN, 0x7F        ; nur 0..59


    ; Stunden
    sec                       ; NACK
    rcall i2c_read
    mov RTC_HOUR, i2cdata
    andi RTC_HOUR, 0x3F       ; nur 0..23 (bei 24h Modus)
    rcall  i2c_stop
    ret

von Jobst M. (jobstens-de)


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
von Jobst M. (jobstens-de)


Lesenswert?

Thomas Z. schrieb:
> Statt dessen setzt du die Stop Contition
> und dann wieder Start

Funktioniert beim DS1307 auch problemlos.

Gruß
Jobst

von Mediafox F. (mediafox_f)


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?

    ; I²C Init
    rcall i2c_init
    rcall RTC_INIT

Dann hier weiter:


RTC_INIT:

    ; CH-Bit löschen (Sekunden-Register)
    ldi temp, 0b11010000
    mov i2cadr, temp
    rcall i2c_start
    ldi i2cdata, 0x00      ; Register 0 = Sekunden
    rcall i2c_write
    ldi i2cdata, 0x00      ; Sekunden = 00
    rcall i2c_write
    rcall i2c_stop

    ; (Minuten-Register)
    ldi temp, 0b11010000
    mov i2cadr, temp
    rcall i2c_start
    ldi i2cdata, 0x01      ; Register 1 = Minuten
    rcall i2c_write
    ldi i2cdata, 0x35      ; Minuten = 35
    rcall i2c_write
    rcall i2c_stop


    ; (Stunden-Register)
    ldi temp, 0b11010000
    mov i2cadr, temp
    rcall i2c_start
    ldi i2cdata, 0x02      ; Register 2 = Stunden
    rcall i2c_write
    ldi i2cdata, 0x12      ; Stunden = 12
    rcall i2c_write
    rcall i2c_stop

    ; SQWE setzen (Control Reg = 0x07)
    ldi temp, 0b11010000
    mov i2cadr, temp
    rcall i2c_start
    ldi i2cdata, 0x07      ; Register 7 = Control
    rcall i2c_write
    ldi i2cdata, 0x10      ; SQWE=1, 1Hz
    rcall i2c_write
    rcall i2c_stop

    rcall RTC_CHECK
    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
von Jobst M. (jobstens-de)


Lesenswert?

Mediafox F. schrieb:
> 3E:6H.

Mediafox F. schrieb:
> Mit dem deinem Test von oben steht 12:35 im Display.

Sehr gut!

Aber das H dürfte dort nicht stehen. Egal was kommuniziert wird.
Finde heraus, woher das kommt!

Gruß
Jobst

von Mario M. (thelonging)


Lesenswert?

In "RTC_CHECK" wird nach "i2c_read" noch "i2c_put_ack" aufgerufen, 
obwohl das nach "i2c_read" sowieso ausgeführt wird! Das dürfte die 
gelesenen Werte verfälschen. Die angezeigten Werte "H" und "E" sind in 
der Siebensegment-Tabelle enthalten.

von Mediafox F. (mediafox_f)


Angehängte Dateien:

Lesenswert?

Meiner Meinung nach liest der nicht nutzbares aus. Hab mal ein 
Oszillogramm angehängt.

von Thomas F. (igel)


Angehängte Dateien:

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.

von Mediafox F. (mediafox_f)


Angehängte Dateien:

Lesenswert?

Lasse gerade mein anderes Programm ohne RTC laufen, da der DS1307 
garnichts mehr von sich gab.
Läuft mit normalen Timer und erledigt mal vorerst die Zeitanzeige.
Das Projekt mit befindet sich im Anhang.

von Mario M. (thelonging)


Lesenswert?

Mario M. schrieb:
> In "RTC_CHECK" wird nach "i2c_read" noch "i2c_put_ack" aufgerufen

Warum behebst Du nicht den genannten Fehler?

P.S.: Im Oszillogramm sieht man die zusätzlichen Takte bei den letzten 
drei Bytes. Außerdem fehlt nach den ersten beiden Bytes der "repeated 
start".

: Bearbeitet durch User
von Rainer W. (rawi)


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.

von Nemopuk (nemopuk)


Lesenswert?

Die Signalpegel sind gut. Zur weiteren Analyse wäre jetzt ein 
Logic-Analyzer hilfreich. Darf gerne auch ein 8 € Teil aus China sein.

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.