Bascom rtc ds3231 1Hz-Signal aktivieren

gerd51

Mitglied
18. Jan. 2013
43
0
6
Sprachen
  1. BascomAVR
Hallo erstmal,

ich würde gerne bei der RTC DS3231 das 1HZ-Signal zur Interrrupt-SAteuerung nutzen. Dies muss allerdings bei der RTC erst aktiviert werden. Laut Datenblatt http://datasheets.maximintegrated.com/en/ds/DS3231.pdf‎ muss, wenn ich das richtig verstandenhabe, über den I2C-bus an Adresse 0E ein control-byte gesendet werden.
1. Frage: Wie muss das Byte aussehen? ( Bitfolge 1100_0000 tut es nicht Fehler?)
2. Frage : Steht der I2C-Aufruf an der richtigen Stelle (also vor dem Main)?
Habe zu Kontrollzwecken an den SQW-Ausgang über einen Pullup von 4,7k eine Led angeschlossen, die im besten Fall im 1HZ-Takt blinken solte.
Hier mal den
code-Schnipsel:

' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.1
Config Scl = Portc.0
' Address des DS3231 $D0=schreiben $D1=lesen
Const Ds3231w = &HD0
Const Ds3231r = &HD1


I2cstart ' Start
I2cwbyte Ds3231w ' DS3231 schreiben
I2cwbyte 0e ' DS3231 Adresszeiger auf 0E stellen
I2cwbyte '?????????????????????????????????????????? control schreiben
I2cstop

Danke schon mal für die Mühe

Gruß Gerd
 
Hallo Gerd,

ob der Aufruf an der richtigen Stelle steht, kann ich so nicht sagen, da ich den Rest nicht kenne.
Aber:
I2cwbyte 0e ' DS3231 Adresszeiger auf 0E stellen
wird so nicht funktionieren, probier mal &H0e

Gruß

- gp177 -
 
Hallo erstmal,

@gp177
sorry, das war nur ein Tippfehler, im Originalcode heißt es schon &H0E. Klappt aber trotzdem nicht.
 
...Habe zu Kontrollzwecken an den SQW-Ausgang über einen Pullup von 4,7k eine Led angeschlossen, die im besten Fall im 1HZ-Takt blinken solte...
Erklär mal genauer...
Das ist ein OpenDrain-Ausgang - der kann durch den internen FET (fast) auf Gnd gezogen werden. In den Testconditions stehen 3mA, wobei der Ausgang dann auf 0,4V runtergeht.
Was der FET da wirklich verträgt, finde ich in dem DB nicht, ich würde also unter 3mA bleiben wollen. Leuchtet Deine LED da dann überhaupt?
 
I2cstart ' Start
I2cwbyte Ds3231w ' DS3231 schreiben
I2cwbyte 0e ' DS3231 Adresszeiger auf 0E stellen
I2cwbyte '?????????????????????????????????????????? control schreiben
I2cstop


Hallo Gerd!

Du wählst natürlich das Config-Register an, sendest danach aber kein Byte um es einzustellen.
Aus dem Grunde wird es auch nicht funktionieren.

Wie du den INT/SQW-Pin der DS3231 konfigurierst bleibt dir überlassen.
Infos zum Config-Register gibt es jedenfalls im Datenblatt. :wink:

DS3231-config-Reg.gif

Wie du sehen kannst, bietet der INT/SQW-Pin verschiedene Signalisierungen.....
Batteriesignal, Alarmsignale usw.

Mit Bit4 und Bit3 (RS2 & RS1) stellst du jedenfalls die Ausgangsfrequenz ein (siehe Tabelle im Datenblatt).


Möglich wäre also zum Beispiel folgende Config....
Code:
I2cstart
I2cwbyte Ds3231w
I2cwbyte &H0E
I2cwbyte &B0000_0000
I2cstop


Grüße,
Cassio
 
C0hex sollte doch genauso gehen, oder?

Hallo!

Ich weiß nicht, ob die Bitfolge &B1100_0000 (respektive &HC0) sinnvoll ist.

Sobald das Bit7 auf "1" gesetzt ist, wird der interne Oszillator abgeschaltet und die DS3231 auf Batterie geschaltet.
Könnte mir vorstellen, dass dann auch kein 1Hz Signal (RS2=0 und RS1=0) am INT/SQW-Pin ausgegeben wird.


Grüße,
Cassio
 
Hmm...
Also ich verstehe die Beschreibung von !EOSC eher so, daß der Oszillator bei einer 1 abgeschaltet wird, wenn der Sensor auf der Batterie läuft, also eben wenn Vcc eine bestimmte Grenze unterschreitet. Insbesondere der (vor)letzte Satz legt nahe, daß bei anliegender Vcc der Oszillator immer arbeitet. Unabhängig von !EOSC.
Kann jetzt natürlich sein, daß im Batteriebetrieb wegen abgeschaltetem Oszillator auch der Ausgang nicht schaltet - ich gehe aber eh davon aus, daß die Test-LED über dieselbe Vcc mit Spannung versorgt wird...

Wo jetzt im Batteriebetrieb !EOSC=1 versagen würde, versagt BBSQW=0 doch ebenso -> wenn Vcc wegfällt, wird der !INT/SQW-Pin tristate...

Das entscheidende ist, INTCN auf 0 zu setzen, um den Ausgang oszillieren zu lassen, wenn statt der gut 8kHz 1Hz erwünscht ist, müssen auch noch RS2..RS1 auf 00 gesetzt werden.

Mir ist, wie gesagt die Anbindung der LED an den Pin nicht klar (und, ob dieser den zum leuchten nötigen Strom nach Gnd überhaupt bewältigen würde).
 
Hallo,

also hier mal das Datenblatt als PDF: Anhang anzeigen DS3231_Extremely Accurate I2C-Integrated RTC-TXO-Crystal.pdf

dann mal der Reihe nach ...
Pin 3 : INT/SQW
Active-Low Interrupt or Square-Wave Output. This open-drain pin requires an external pullup resistor. It may be left open if not used. This multifunction pin is determined by the state of the INTCN bit in the Control Register (0Eh). When INTCN is set to logic 0, this pin outputs a square wave and its frequency is determined by RS2 and RS1 bits. When INTCN is set to logic 1, then a match between the timekeeping registers and either of the alarm registers activates the INT/SQW pin (if the alarm is enabled). Because the INTCN bit is set to logic 1 when power is first applied, the pin defaults to an interrupt output with alarms disabled.

Also muß das INTCN-Bit im Control-Register 0Eh auf 0.
(INTCN könnte InterruptConnect oder so heißen?)

Control-Register 0Eh (Bitnummer in Klammern):
/EOSC(7) , BBSQW(6) , CONV(5) , RS2(4) , RS1(3) , INTCN(2) , A2IE(1) , A1IE(0)

Also sind zuerst mal die Bits 4, 3, 2 betroffen.

Bit 7: Enable Oscillator (EOSC). When set to logic 0, the oscillator is started. When set to logic 1, the oscilla-tor is stopped when the DS3231 switches to VBAT. This bit is clear (logic 0) when power is first applied. When the DS3231 is powered by VCC, the oscillator is always on regardless of the status of the EOSCbit.
/EOSC wird wohl EnableOscillator heißen und da das Null-Aktiv ist schaltet man mit einer Null in dem Bit den Oszillator an. Das gilt nach dem Text aber für den Batteriebetrieb. Wenn das IC über Vcc versorgt wird ist der Oszillator immer an. Egal was im Bit steht.
Wenn man also auch beim Batteriebetrieb den Oszillator laufen haben will, dann sollte man das Bit auf Null setzen (ist Default).

Bit 6: Battery-Backed Square-Wave Enable (BBSQW). When set to logic 1 and the DS3231 is being powered by the VBATpin, this bit enables the square-wave output when VCC is absent. When BBSQW is logic 0, the INT/SQW pin goes high impedance when VCC falls below the power-fail trip point. This bit is disabled (logic 0) when power is first applied.
Also wenn man auch im Batteriebetrieb ein Ausgangssignal am SQW-Pin haben möchte, dann muß das Bit auf 1 gesetzt werden da der Pin sonst im Batteriebetrieb hochohmig wird. Gegenüber dem Default (1) muß man hier also evtl umschalten.

Bits 4 and 3: Rate Select (RS2 and RS1). These bits control the frequency of the square-wave output when the square wave has been enabled. The following table shows the square-wave frequencies that can be select-ed with the RS bits. These bits are both set to logic 1 (8.192kHz) when power is first applied.
Also hier stellt man nun die Ausgangsfrequenz vom SQW-Pin ein. 00 = 1Hz . Da per Default 11 drin steht muß man also auch hier umschalten.

Bit 2: Interrupt Control (INTCN). This bit controls the INT/SQW signal. When the INTCN bit is set to logic 0, a square wave is output on the INT/SQW pin. When the INTCN bit is set to logic 1, then a match between the timekeeping registers and either of the alarm registers activates the INT/SQW (if the alarm is also enabled). The corresponding alarm flag is always set regardless of the state of the INTCN bit. The INTCN bit is set to logic 1 when power is first applied.
Das hatten wir oben ja schonmal. Der Pin ist per Default auf 1 für Interruptausgang. Der muß also auch selber auf Null umgeschaltet werden um ein 1Hz-Signal am SQW-Pin zu haben.

Also muß das Byte folgendermaßen aussehen ... 0 0 0 0 _ 0 0 0 0
Da sind nun die entsprechenden Bit drin und bei den restlichen die Default-Werte.

Das Register 0Fh kann lediglich zusätzlich den 32kHz-Ausgang anschalten.

Also am Anfang eine Start-Kondition erzeugen.
Dann zuerst die Schreibadresse des ICs senden (1101000 0) : D0h
Dann die Registeradresse senden : 0Eh
Danach das Datenbyte senden : 00h
Nun eine Stop-Kondition erzeugen.

Wenn man das gemacht hat, dann sollte am Ausgang SQW ein 1Hz-Signal zu sehen sein.

Gruß
Dino
 
Sag ich doch...
...INTCN auf 0 zu setzen, um den Ausgang oszillieren zu lassen, wenn statt der gut 8kHz 1Hz erwünscht ist, müssen auch noch RS2..RS1 auf 00 gesetzt werden...
Mit 00hex als Datenbyte sollte das 1Hz-Signal dann zu sehen sein, wenn der IC über Vcc versorgt wird. Im Batteriebetrieb wird der Pin wegen BBSQW=0 (statisch) tristate.
Das von Gerd versuchte C0hex als Datenbyte sollte aber dasselbe Resultat erzielen, INTCN und die beiden RS sind hier auch 0, hier würde im Batteriemodus sogar der Ausgangspin "aktiv" bleiben, allerdings wird dann der Oszillator angehalten.
Aber mit "normaler" Versorgung über Vcc sollte es in beiden Versionen am Ausgang "ticken"...

Gerd, wie ist das jetzt mit der Test-LED?
 
Hallo erstmal,
vielen Dank für die rege Diskussion. Habe das Byte &B0100_0000 gesendet und es funktioniert einwandfrei. Die Diode blinkt im Sekundentakt (allerdings, wie vermutet, recht funzelig) . Die ds3231 ist tatsächlich supergenau verglichen mit ds1307. Ich hatte bereits den Uhrenteil vor zwei Monaten aktiviert und bis heute nicht die geringste Abweichung zur dcf77, die parallel läuft.

Gruß Gerd
 
Vcc->4k7->LED->PIN(->FET->Gnd)?
Ich tippe bei Vcc=5V auf ca 1mA

Hmm...
kannst Du trotzdem mal Deinen Schaltplan zeigen? Wird der IC nun über Vcc versorgt, oder nicht?
 
Hi,

Vcc->4k7->LED->PIN(->FET->Gnd)?
Ich tippe bei Vcc=5V auf ca 1mA
wenn man ultrahelle LEDs mit 5000mcd ud mehr benutzt, dann kann man auch mit LED-Strömen von unter 1mA arbeiten. Ich habe da zB bei Vcc=5V Vorwiderstände von 6,8k verwendet und es ist so gut sichtbar wie bei einer normalen LED mit 5-10mA. Daraufhin hab ich mir erstmal ne größere Anzahl vom 3mm-LEDs in ultrahell und rot/grün/blau/... besorgt ;)

Gruß
Dino
 
Hi,

@lotadaC

Die Schaltung sollte nur als Test dienen, ob das 1Hz-Signal auch richtig rüberkommt. In der Originalschaltung soll mit dem Signal eine genauer 1Hz-Takt auf int0 gelegt werden.
Die Testschaltung hänge ich mal an. Trotz fleißigen Googlens ist es mir übrigens nicht gelungen einen deutschen Laden zu finden der die DS3231 vertreibt. Bei ebay allerdings gab´s einen Chinesen mit Auslieferungslager in Frankfurt. Der hat die RTC als Modul, alles fix und fertig gelötet mit 6 Ausgangsstiften für knapp 4€. Wenn man die Einzelteile (Batteriehalter, Chip, Batterie etc) rechnet sind die teurer, von der SMD-Lötarbeit mal gar nicht zu reden.
Der IC wird mit VCC=5V betrieben. laut Datenblatt muss die Batterie immer angeschlossen werden, auch wenn sie (originaltext: "dead") ist.
Mit dem gesendeten Byte läuft der Takt nur, wenn VCC angeschlossen ist. Werde mal versuchen &H00 zu senden, mal sehen was passiert.
test.png
@Dino3

Hi, willst du es dir nicht doch nochmal überlegen ein Internet-Tutorial zu schreiben? Hast doch schon jede Menge zusammen.
 
Hi,

@straddel

Danke für den Link. Kannte ich nicht, muss ich damals überlesen haben. Vom Preis her ist das aber auch völlig uninteressant. Trotzdem Danke, kann man ja vielleicht mal für was anderes gebrauchen.

Gruß Gerd
 
Digikey hat den auch... zu ähnlich hohen Preisen...

Im Datenblatt des ICs steht, daß Vbat auf Gnd zu legen ist, wenn keine Batterie verwendet wird. Was bei Deiner Schaltung mit Vcc und Vbat jetzt so verschaltet ist, entzieht sich meiner Kenntnis. Mit Deinem Control-Byte hast Du (wie Dir sicher selbst bereits klar ist) eingestellt, daß der Int-Ausgang zwischen Gnd und Tristate wechselt (INTCN=0), und zwar mit 1Hz (RS=00), und zwar auch dann, wenn das IC auf "BatteryMode" läuft (BBSQW=1). Wann ist das der Fall? Wenn Vbat>Vcc und Vcc<2,575V.

Deine Ansteuerung der LED ist auch ... ähm ... interessant...
Welche Werte haben denn die beiden Widerstände konkret?
Mit dem Pullup begrenzt Du den max Strom durch den internen FET, immerhin. Ist der FET offen, fließt der dann über den Vorwiderstand (nochmaliger Spannungsabfall) und die LED. Schaltet der interne FET durch, ist die LED (mir dem R) über den FET überbrückt.
Eigentlich gehört die LED entweder direkt zwischen den Pullup und den INT-Pin (wenn sie bei dem geringen Strom leuchtet), oder ein entsprechender Treiber (Transisor/FET/Komperator/Inverter/Logikgatter/...) dahinter.
Zum "nur mal eben testen" würde es ein flotteres Multimeter auch tun;)

Nachtrag: Achso, ob 00hex geht, weißt Du noch nicht...
Eigentlich sollte der FET mit 01000000 auch im BatMode zappeln, allerdings versorgst Du den Pullup, und damit die LED in Deiner Schaltung ja über Vcc...
Im Vcc-Betrieb hingegen ist egal, was in den beiden MSB steht, da die den BatteryMode betreffen. Mit EOSC kannst Du den Oscillator beim Wechsel in den BattMode anhalten, mit BBSQW den Int-Pin im BattMode (dauerhaft) Tristate setzen...
 
Hi,

@lotadaC

Sorry hatte nur für dich schnell die Schaltung vom Board skizziert und dabei den Vorwiderstand der LED mitgezeichnet. Der lag allerdings nur da, weil ich die LED vorher als Port-Kontrolle benutzt hatte. Hier die richtige Zeichnung. Beim Senden von &H00 blinkt die Led wie gewünscht, allerdings nur, wenn VCC angeschlossen ist. Nur mit VBat erlischt die Led. Ich benötige die Batterie nur zur Stützung der eigentlichen Uhrenfunktion. Den 1-Hz-Takt benötige ich nur, wenn auch VCC anliegt, so dass die Frage für mich nur akademisch ist. Wenn´s dich aber interessiert kann ich den Ausgang gerne mal ans Oszi hängen.
test.png

Gruß Gerd
 
Daß die LED ohne Vcc aus ist, ist klar. die Wird ja über den Pullup versorgt, der an Vcc liegt.
Das Oszi sieht den Pin auch nicht zwischen Gnd und tristate schalten - insofern hast Du auch nicht mehr als mit der LED von. Du müßtest den Pullup auf 5V legen, aber den Vcc-Pin des Modules eben nicht (also daß das Modul eben nicht Vcc=5V bekommt, der Pullup (und damit auch die LED) aber mit 5V versorgt ist). Für die TWI-Kommunikation wirst Du aber am Modul 5V-Vcc brauchen, also Modul mit Vcc=5V versorgen, via TWI beschreiben, blinken sehen, Vcc am Modul trennen (Batteriebetrieb) - wobei die LED weiterhin mit dem Pullup an 5V hängt, je nach den beiden oberen Bits geht das Blinken weiter, oder hört auf

Im "Normalbetrieb" (Vcc-Pin=5V) sollten die oberen beiden Bits dann egal sein - im Batteriebetrieb muß aber EOSC=0 und BBSQW=1 sein, damits weiterblinkt.

Klar ist das rein akademisch - aber zumindest ich bin neugierig...;)
 
Hi lotadaC,

Hast recht, ist ja auch interessant. Habe dem Modul die VCC entzogen. Beim Senden des Bytes 00hex leuchtet die LED weiter, blinkt aber nicht.Beim Senden des Bytes 80hex klappt, wie du bereits vermutet hast, alles wie gewünscht: Led blinkt mit und ohne VCC (hier allerdings stark funzelig).

Gruß Gerd

PS: Das Teil scheint überhaupt ganz interessant zu sein. Werde mich demnächst mal ausgiebiger damit beschäftigen (Alarmregister 1und 2 etc.). Können ja diesbezüglich in Kontakt bleiben. (So wie es zur Zeit aussieht hast du die richtigen Ideen und ich die RTC.)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)