S35390A driver for 8051 part 2

Posted by: 邱小新 at 下午4:11 in ,
原始碼下載

● 警報中斷 alarm interrupt

  1. alarm 的設置很簡單,只要先設置好警報時間,再設置中斷模式即可。
  2. 中斷模式有很多種,主要使用 alarm interrupt 模式,即 INT1AE=1,INT1ME=0,INT1FE=0。
  3. 當警報觸發時,INT1 pin 會從 HIGH 變成 LOW,直到設置 INT1AE=0,INT1 pin 才又恢復成 HIGH。
  4. 當警報觸發時,register status1 中的 INT1 會變成 1,只要讀取 status1 後自動變成 0,即下次再讀取 INT1 的值為 0。
  5. 當警報觸發時,而且 INT1AE=1,每隔一秒就會重置 status1(INT1=1)。也就是讀取完 status1 後,再次讀取 INT1 的值為 0,但是在下一秒再次讀取 status1,則 INT1 又會變成 1,每隔一秒就再次變成 1,除非當 INT1AE=0,則此動作就取消。
  6. 手動設定連接 INT1 pin 的 port 是沒有作用的,也就是手動設定 INT1 並不會觸發中斷。
  7. S35390A 的 alarm interrupt 剛好符合 8051 的 external interrupt,可以直接用 external interrupt 來偵測。如果沒有多餘的腳位,則可改成讀取 status1 來判斷 interrupt。
  8. 如果一開始就把 INT1 pin 拉 LOW,就會造成當 alarm interrupt 發生後要取消回 HIGH 時,不會自動回復成 HIGH,而是一直呈現在 LOW 的狀態下。

void s35390a_write_alarm1(unsigned char xdata *value) { unsigned char i=10, j; while (--i) { // set alarm time i2c_start(); if(i2c_write(ADDR_INT1 | I2C_WRITE)) continue; for (j=0; j<RTC_ALARM_LENGTH; j++) { if(i2c_write(value[j])) break; } if (j<RTC_ALARM_LENGTH) continue; i2c_stop(); // start alarm j = s35390a_read_status_2(); j = j & INT1_MASK | INT1AE; s35390a_write_status_2(j); break; } }

● free SRAM register

  1. S35390A 可使用的 SRAM 只有二個 bytes,一個是完整的 Free register,一個是分散在各地的 Scratch bits。
  2. Scratch bits 中的 SC0/SC1 存在 status1,所以任意時間都可以用。而 SC2~SC7 存在 INTx register,只有當 INTxME=0 and INTxFE=1,才可以使用。

0 意見

張貼留言