44 lines
966 B
Common Lisp
44 lines
966 B
Common Lisp
(defvar *rtc-port* 0)
|
|
|
|
(defun rtc-set (hr min)
|
|
"(rtc-set hr min)
|
|
Set the time on a DS3231 RTC. Times are in BCD, so use
|
|
the appropriate reader macro, e.g. (rtc-set #x12 #x34)
|
|
for 12:34. Assumes seconds are zero."
|
|
(with-i2c (str *rtc-port* #x68)
|
|
(write-byte 0 str)
|
|
(write-byte 0 str)
|
|
(write-byte min str)
|
|
(write-byte hr str)))
|
|
|
|
(defun bcd-to-dec (x)
|
|
"(bcd-to-dec x)
|
|
Convert the BCD-encoded number x to a decimal value."
|
|
(+
|
|
(* 10 (ash x -4))
|
|
(logand x #xf)))
|
|
|
|
(defun dec-to-bcd (x)
|
|
"(dec-to-bcd x)
|
|
Converts the decimal value to a BCD-encoded number.
|
|
Number must be in the range 0 to 99.")
|
|
|
|
(defun rtc-get ()
|
|
(with-i2c (str *rtc-port* #x68)
|
|
(write-byte 0 str)
|
|
(restart-i2c str 3)
|
|
(mapcar bcd-to-dec
|
|
(reverse
|
|
(list
|
|
(read-byte str)
|
|
(read-byte str)
|
|
(read-byte str))))))
|
|
|
|
(defun rtc-now ()
|
|
"(rtc-now)
|
|
Set the time using the RTC."
|
|
(apply now (rtc-get)))
|
|
|
|
(defun now-rtc ()
|
|
|