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.
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.
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
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
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.
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.
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.
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.
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
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.
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
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.
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.
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.