Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit Řbrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 13.05.2021 0:47)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' 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
    PRINT
  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

Bisherige Antworten:

Re: Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 (von Karl-Heinz - 5.06.2021 17:13)
Re: Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 (von Christian - 24.05.2021 12:30)
Re: Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 (von Joachim - 13.05.2021 2:13)
    Re: Demoprogramm: Echtzeituhr (Real Time Clock, RTC) mit DS3231 (von Christian - 13.05.2021 12:04)