Mizar32/RTC
Introduction
editThe Real Time Clock chip on Mizar32's add-on ethernet board keeps track of the time of day and the date, whether the Mizar32 is powered on or not. It does this by having a small rechargeable battery and a crystal that vibrates at 32768 cycles per second, which it divides down to get a pulse that beats exactly once per second and uses this signal to keep the seconds, minutes and hours up to date, as well as the date, month and year.
Hardware view
editThe ethernet board has a 32768 Hz crystal and a DS1337 or a PCF8563 chip which is connected on the I2C bus. The two different chips have the same pin-out and almost identical functions; the reason we support both is due to a production error by one of our suppliers who printed DS1337 on the casing of a batch of PCF8563 chips.
Which actual chip is present is identified by the slave address that it responds to in the main I2C bus: the DS1337 responds to 7-bit decimal address 104, while the PCF8563 responds to slave address 81.
Both chips respond up to a speed of up to 400kHz on the I2C bus. We recommend using 100kHz, the default I2C that is set in eLua.
For the register layout and how to address the devices using the raw I2C protocol, please see their datasheets.
Software view
editSimpleMachines has added a module to Alcor6L to set the time and to read it.
Note: This module is included from Mizar32's 2013 firmware release of eLua 0.9.
Setting the time
editYou set the time using the functions:
Language | Function |
---|---|
eLua | mizar32.rtc.set(t)
|
PicoLisp | (mizar32-rtc-set param value)
|
In Lua, t
is a table which can have any of the following fields present:
Field | Value | Meaning |
---|---|---|
sec |
0-59 | Seconds |
min |
0-59 | Minutes |
hour |
0-23 | Hours (24-hour clock) |
day |
1-31 | Day of month |
month |
1-12 | Calendar month |
year |
1900-2099 | Year |
wday |
1-7 | Day of week |
In PicoLisp, param
is field to set and value
is the value at which param
is set.
For example (in eLua),
now = {year=2013, month=9, day=16, hour=0, min=32, second=59} mizar32.rtc.set( now )
In PicoLisp,
(mizar32-rtc-set *mizar32-rtc-year* 2014)
When some fields are present but not others, mizar32.rtc.set()
sets those parts of the time and date and leaves the other parts with the same value as they had before.
The day of the week field, wday
, uses the following values to represent the seven days of the week:
Value | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Meaning | Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday |
It is up to you to write the correct value into this field if you wish to use it; it is not set automatically from the date.
Reading the current time and date
editThe following functions can be used to read time:
Language | Function | Return value | Example: Print year |
---|---|---|---|
eLua | mizar32.rtc.get() |
A Lua table with the seven fields described above | t = mizar32.rtc.get(); print("Year: ", t.year)
|
PicoLisp | (mizar32-rtc-get) |
A list with the seven fields described above | (prinl "Year: " (car (nth (mizar32-rtc-get) 3)) )
|
The following code example makes a clock appear on the LCD display.
mizar32.lcd.reset() while true do local t = mizar32.rtc.get() mizar32.lcd.goto( 1, 5 ) mizar32.lcd.print( string.format("%02d:%02d:%02d", t.hour, t.min, t.sec ) ) mizar32.lcd.goto( 2, 4 ) mizar32.lcd.print( string.format("%02d/%02d/%04d", t.day, t.month, t.year ) ) end