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.
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
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
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
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.
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
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.
Die Lese Sequenz ist doch falsch oder? Versuchs mal repeated start nachdem du die Register Addresse geschrieben hast.
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
Uch habe mal probeweise die Uhrzeit grob beim Start eingeben: 12:35 Danach gleich ausgelesen, Ergebnis 3E:6H. Irgentwas läuft schief.
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.
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
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
"H" kommt definitiv nicht über den Bus. Das geht nur bis F, sofern das überhaupt gesendet werden sollte. Gruß Jobst
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
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
Thomas Z. schrieb: > Statt dessen setzt du die Stop Contition > und dann wieder Start Funktioniert beim DS1307 auch problemlos. Gruß Jobst
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
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
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.
Meiner Meinung nach liest der nicht nutzbares aus. Hab mal ein Oszillogramm angehängt.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.