Schnittstelle DS1307 RTC mit PIC16f882

Ich versuche, DS1307 RTC mit der erwähnten MCU zu verbinden. Ich möchte einen lebenslangen Timer erstellen, der die Zeit anzeigt, in der dieses Projekt im Feld gearbeitet hat, und diesen Timer auf einem LCD anzeigen.

Ich bin neu bei Mikrocontrollern, aber die Verwendung von LCD- und I2C-Bibliotheken, die bereits im MikroC pro für PIC-Compiler integriert sind, wird mich hoffentlich vor Low-Level-Programmierung bewahren.

Wenn ich das richtig verstehe, wären die Schritte zum Schreiben oder Lesen von etwas aus der RTC:

1) I2C_Start();
2) I2C_Write(DS1307_Address);
3) I2C_Write(Register Address);
4) I2C_Write(Data to be written);
5) I2C_Stop();

und zum lesen:

1) I2C_Start();
2) I2C_Write(DS1307_Address);
3) I2C_Write(Register Address);
4) I2C_Repeated_Start();
5) I2C_Write(DS1307_Address);
6) I2C_Rd();
7) I2C_Stop();

Mein Problem ist, was wird das DS1307_Addresssein, wenn es das einzige Gerät im Bus ist?

Mein Ansatz wird sein, das BIT7 von 00h oder CHBit des DS1307 niedrig zu setzen, wenn das Gerät läuft, und es hoch zu setzen, kurz bevor es heruntergefahren wird. Ich möchte nicht, dass das RTC auch die Projekt-Auszeit zählt. Ist dieser Ansatz umsetzbar?

Mein Schaltplan ist wie folgt:

Die Adressen von I2C-Geräten sind normalerweise in ihrem Datenblatt angegeben.
Ihre Lesesequenz benötigt einen weiteren Schritt zwischen 3 und 4 - einen "I2C-Neustart".
@EugenSch. Ich habe das Datenblatt mehrmals durchgesehen, kann es anscheinend nicht finden. Können Sie bitte einen Blick darauf werfen: datasheets.maximintegrated.com/en/ds/DS1307.pdf
@brhans Danke brhans, ich werde meine Frage und meinen Code aktualisieren.
Seite 12. Das Lesen von Datenblättern ist eine der wichtigsten Fähigkeiten für jemanden, der mit Elektronik zu tun hat. Mit Hilfe von Strg-F dauert es etwa 20 Sekunden.
@EugenSch. Danke Eugene, hätte Strg-F ausprobieren sollen, werde mich beim nächsten Mal an diesen Tipp erinnern.
@brhans Es scheint keine Restart()-Funktion in der MikroC-Bibliothek zu geben. Werden Start() und Stop() dieselbe Funktion wieder korrekt ausführen?
Es gibt eine I2C_Repeated_StartFunktion. Schauen Sie sich die Beispiele auf dieser Seite an
@EugenSch. Deine 20er-Diagnose ist ziemlich genau richtig ;-) .
@EugenSch. Ich möchte nur das 7. Bit aus dem Sekundenregister bearbeiten, ohne die Sekunden darin zu ändern. Wie kann das möglich sein, wenn ich jedes Mal ein ganzes Byte schreiben soll, wie: I2C1_Wr (0x80) und I2C1_Wr (0x00)
Sie können kein einziges Bit ändern. Sie müssen lesen, maskieren, schreiben. Aber ich sehe hier ein kleines Problem. Die Sekunden können während dieser Sequenz aktualisiert werden (allerdings nicht mehr als einmal, aber immerhin), sodass Sie eine Sekunde verlieren. Wenn Sie sich nicht wirklich um den langsam akkumulierten Fehler kümmern, können Sie ihn ignorieren.

Antworten (1)

Laut Datenblatt Seite 12:

Das Slave-Adressbyte enthält die 7-Bit-DS1307-Adresse, die 1101000 ist, gefolgt vom Richtungsbit (R/W), das für einen Schreibvorgang 0 ist.

Die gesuchte Adresse lautet also 1101000 .