跳轉到內容

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

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書