![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 05. Mai 2021 ' =========================================================================== ' "AZDelivery 3 x Real Time Clock RTC DS3231 I2C Echtzeituhr" für 11,99 EUR: ' https://www.amazon.de/dp/B077XN4LL4 ' Die E-Books sind nur bedingt "kostenlos". Man bezahlt mit seinen Daten! ' Das RTC-Modul basiert auf dem DS3231 und verfügt über einen I²C-Bus. Das ' Modul wird an den I²C-Bus der Open-Maxi angeschlossen. Die Betriebs- ' spannung darf 3 bis 5 Volt betragen. Laut Internet besteht Explosions- ' gefahr, wenn das Modul mit größer 3,3 Volt betrieben wird, denn es ' befindet sich auf dem Modul eine Ladeschaltung für einen LIR2032- ' Lithium-Ionen-Akku, aber das Modul wird mit einer viel preiswerteren ' CR2032-Lithium-Knopfzellenbatterie ausgeliefert. In diesem Fall ist die ' Ladeschaltung zu deaktivieren. Siehe dazu folgenden Foren-Beitrag: ' http://ccintern.dharlos.de/forum/lesen.php?eintrag=17128 ' Manual/Datenblatt zum DS3231: ' https://datasheets.maximintegrated.com/en/ds/DS3231.pdf ' Obwohl mit DS3231 beworben, ist auf meinem RTC-Modul ein DS3231M verbaut. ' Mit der M-Version läuft die Uhr weniger präzise. Hier das Datenblatt: ' https://datasheets.maximintegrated.com/en/ds/DS3231M.pdf ' Dieses Programm geht aus dem folgenden Programm von Norbert hervor: ' http://ccintern.dharlos.de/forum/lesen.php?eintrag=17122 ' Aus dem Manual/Datenblatt: ' Beim Lesen oder Schreiben der Zeit- und Datumsregister werden sekundäre ' (Benutzer-) Puffer verwendet, um Fehler beim Aktualisieren der internen ' Register zu vermeiden. Beim Lesen der Zeit- und Datumsregister werden die ' Benutzerpuffer bei jedem START mit den internen Registern synchronisiert, ' und wenn der Registerzeiger auf Null wechselt. Die Zeitinformationen ' werden aus diesen Sekundärregistern gelesen, während die Uhr weiterläuft. ' Dadurch entfällt die Notwendigkeit, die Register erneut zu lesen, falls ' die Hauptregister während eines Lesevorgangs aktualisiert werden. ' An dieser Stelle möchte ich mich bei Dirk von "das |_ Team" und bei ' Norbert für ihre tatkräftige Unterstützung bedanken. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DIM a,b,c BYTE 'temporäre Variablen DIM databyte BYTE DEFINE DS3231_ADDR &hd0 'I²C-Adresse vom RTC-Modul DS3231 ' --- Hauptprogramm --------------------------------------------------------- PrintSpc=ON 'SPACE vor einem dezimalen PRINT End2Host=ON 'Bei Programmende gleich in den Host-Modus wechseln ClockDis=ON 'Weiterzählen der internen Uhr deaktivieren dump SECOND=58 'Uhrzeit, mit der die RTC gestellt wird MINUTE=59 HOUR=23 SetRTCTime WHILE TRUE SECOND=0 MINUTE=0 HOUR=0 ?"Interne Uhrzeit des Controllers vor Stellen: "; printtime : ? GetRTCTime ?"Uhrzeit nach Stellen per RTC: "; printtime : ? : ? PAUSE 25 WEND END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Uhrzeit formatiert ausgeben PROCEDURE printtime PUT HOUR/10 + ASC("0") PUT HOUR MOD 10 + ASC("0") PUT ASC(":") PUT MINUTE/10 + ASC("0") PUT MINUTE MOD 10 + ASC("0") PUT ASC(":") PUT SECOND/10 + ASC("0") PUT SECOND MOD 10 + ASC("0") RETURN END PROCEDURE ' Uhrzeit des RTC-Moduls setzen PROCEDURE SetRTCTime i2c_init i2c_start IF i2c_write(DS3231_ADDR)=FALSE THEN ?"NoAck von der RTC DS3231" END END IF i2c_write 0 'Adresse des Registers i2c_write dec2bcd(SECOND) i2c_write dec2bcd(MINUTE) i2c_write dec2bcd(HOUR) i2c_stop RETURN END PROCEDURE ' Uhrzeit vom RTC-Modul lesen PROCEDURE GetRTCTime i2c_init i2c_start IF i2c_write(DS3231_ADDR)=FALSE THEN ?"NoAck von der RTC DS3231" END END IF i2c_write 0 'Adresse des Registers i2c_stop i2c_start i2c_write(DS3231_ADDR+1) SECOND=bcd2dec(i2c_read(TRUE)) MINUTE=bcd2dec(i2c_read(TRUE)) HOUR=bcd2dec(i2c_read(FALSE)) 'nur bis zur Stunde einlesen i2c_stop RETURN END PROCEDURE ' Dump aller Register der RTC DS3231 ' vgl. "Figure 1. Timekeeping Registers" im Manual PROCEDURE dump ?"Dump aller Register der RTC DS3231:" i2c_init i2c_start IF i2c_write(DS3231_ADDR)=FALSE THEN ?"NoAck von der RTC DS3231" END END IF i2c_write 0 'Adresse des Registers i2c_stop i2c_start i2c_write(DS3231_ADDR+1) ?"Adresse des Registers: Wert" FOR a=&h00 TO &h12 b=i2c_read(a<>&h12) 'Acknowledge senden, außer bei a=&h12 PUT ASC("$") hex a PUT ASC(":") PUT ASC(" ") PUT ASC("$") hex b PUT ASC(" ") PUT ASC("%") bin b NEXT a ? i2c_stop RETURN END PROCEDURE ' BIN$ für BYTE ' Verändert die Variablen c und databyte PROCEDURE bin(databyte) FOR c=0 TO 7 IF (databyte AND &h80) THEN PUT ASC("1") ELSE PUT ASC("0") END IF databyte=databyte SHL 1 NEXT c RETURN END PROCEDURE ' HEX$ für BYTE in Kleinbuchstaben unter Verwendung von nur einer Variable ' Besonderheit: Die Variable wird nicht verändert PROCEDURE hex(databyte) PUT (databyte SHR 4)+48+(((databyte SHR 4)>9) AND 39) PUT (databyte AND 15)+48+(((databyte AND 15)>9) AND 39) RETURN END PROCEDURE ' Dezimal nach BCD umwandeln ' Input darf 0 bis 99 sein FUNCTION dec2bcd(databyte) RETURN 16*(databyte/10)+(databyte MOD 10) END FUNCTION ' BCD nach Dezimal umwandeln ' Input darf 0 bis 153 (gleich &h99) sein FUNCTION bcd2dec(databyte) RETURN 10*(databyte SHR 4)+(databyte AND &hf) END FUNCTION ' --- INCLUDE-Dateien ------------------------------------------------------- INCLUDE "omax_i2c.pro" 'INCLUDE-Datei für I²C-Bus-Routinen für Open-Maxi INCLUDE "om_fw.pro" 'INCLUDE-Datei für Firmwareroutinen ' --- Programmende --------------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |