Mizar32/RTC
Mizar32 附加的以太网板上,实时时钟芯片负责跟踪一天中的时间和日期,无论 Mizar32 是否通电。它通过一个小型的可充电电池和一个以 32768 赫兹振动的晶体来实现这一点,该晶体将频率降低,得到一个每秒跳动一次的脉冲,并使用此信号来更新秒、分钟和小时,以及日期、月份和年份。
以太网板有一个 32768 Hz 晶体和一个 DS1337 或 PCF8563 芯片,它连接在 I2C 总线上。这两个不同的芯片具有相同的引脚排列和几乎相同的功能。我们支持两者是因为我们的一家供应商在生产 PCF8563 芯片的批次时犯了一个错误,将 DS1337 打印在了外壳上。
实际的芯片可以通过它在主 I2C 总线上响应的从地址来识别:DS1337 响应 7 位十进制地址 104,而 PCF8563 响应从地址 81。
这两个芯片在 I2C 总线上以高达 400kHz 的速度响应。我们建议使用 100kHz,这是 eLua 中设置的默认 I2C。
有关寄存器布局以及如何使用原始 I2C 协议来寻址设备,请参见其数据手册。
SimpleMachines 为 Alcor6L 添加了一个模块来设置时间并读取它。
注意:此模块包含在 Mizar32 的 2013 年 eLua 0.9 固件版本中。
可以使用以下函数来设置时间
语言 | 函数 |
---|---|
eLua | mizar32.rtc.set(t)
|
PicoLisp | (mizar32-rtc-set param value)
|
在 Lua 中,t
是一个表,它可以包含以下任何字段:
字段 | 值 | 含义 |
---|---|---|
sec |
0-59 | 秒 |
min |
0-59 | 分钟 |
hour |
0-23 | 小时(24 小时制) |
day |
1-31 | 月中的日期 |
month |
1-12 | 日历月份 |
year |
1900-2099 | 年份 |
wday |
1-7 | 星期几 |
在 PicoLisp 中,param
是要设置的字段,value
是设置 param
的值。
例如(在 eLua 中),
now = {year=2013, month=9, day=16, hour=0, min=32, second=59} mizar32.rtc.set( now )
在 PicoLisp 中,
(mizar32-rtc-set *mizar32-rtc-year* 2014)
当存在一些字段而不存在其他字段时,mizar32.rtc.set()
会设置时间和日期的这些部分,并将其他部分保留为它们之前的值。
星期几字段 wday
使用以下值来表示一周中的七天:
值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
含义 | 星期日 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 |
由你来编写此字段的正确值,如果你想使用它;它不会从日期自动设置。
以下函数可用于读取时间
语言 | 函数 | 返回值 | 示例:打印年份 |
---|---|---|---|
eLua | mizar32.rtc.get() |
一个包含上面描述的七个字段的 Lua 表 | t = mizar32.rtc.get(); print("年份: ", t.year)
|
PicoLisp | (mizar32-rtc-get) |
一个包含上面描述的七个字段的列表 | (prinl "年份: " (car (nth (mizar32-rtc-get) 3)) )
|
以下代码示例使时钟显示在 LCD 显示屏上。
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