跳转到内容

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

进一步阅读

[编辑 | 编辑源代码]
华夏公益教科书