Das Open-Control-Projekt - Die Alternative zur C-Control-I


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:

ca. 5 Sekunden Abweichung nach 5 1/2 Monaten ... (von das |_ Team - 17.10.2021 0:48)
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)