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