isl1208實時時鐘簡介

摘自:http://mcu.preboss.org/?action-viewnews-itemid-1246

 

 

摘要:簡要介紹了實時時鐘ISL1208的原理、特點、功能及應用,並給出了與單片機的硬件連接圖及控制程序。
關鍵詞:實時時鐘;MCS51;I2C接口;串行通信;C51

1.引言
INTERSIL公司推出的ISL1208是一種I2C接口、低成本、低功耗實時時鐘,它帶有定時與晶體補償、時鐘/日曆、電源失效指示器、週期或輪詢報警、智能後備電池切換和後備電池供電的SRAM等功能。振盪器採用外部低成本32.768KHz晶振,日曆可精確到2099年,閏年自動修正。其強大的報警功能,可被設置成任意時間點報警或固定頻率輸出。若採用3.0V/3.6V鋰電池供電,供電電流僅爲400nA,最多可持續供電長達10年。另外,後備電源輸入引腳Vbat還允許斷電時使用大容量後備電容供電以保證正常工作幾個月左右。
2. ISL1208簡介
ISL1208引腳如圖1所示:

圖1 ISL1208引腳示意圖
其中:引腳X1、X2接外部晶振輸入端,可直接以32. 768kHz的晶體源驅動;Vbat接後備電源/電容,該引腳不用時接地;SDA爲串行數據輸入輸出端;SCL爲串行時鐘輸入端;IRQ/Fout爲中斷/頻率輸出端,可用作中斷/頻率輸出;Vdd和GND爲電源和接地端。

3. ISL1208內部結構及其工作原理
ISL1208內部結構框圖如圖2。由圖可知,ISL1208主要包括:I2C接口控制單元、實時時鐘控制邏輯、時鐘分頻器、電源管理單元和寄存器單元。其中寄存器單元被分成四段:實時時鐘、控制與狀態、報警寄存器和用戶SRAM;這四段寄存器各自含有不同的功能:實時時鐘和報警寄存器用於寫入/讀出時間值和報警值,其寫入形式爲BCD碼;控制與狀態寄存器可完成對其他寄存器讀寫控制、報警與頻率輸出控制、模擬與數字微調控制等功能,其存儲映射圖如表1。

圖2 ISL1208內部結構框圖
表1 寄存器存儲映射圖

ADDR
SECTIONREG
NAMEBIT
76543210
07h
Control
and
StatusSRASRTXTOSCBReservedWRTCReservedALMBATRTCF
08hINTIMALMELPMODEFOBATBFO3FO2FO1FO0
09hReserved
0AhATRBMATR1BMATR0ATR5ATR4ATR3ATR2ATR1ATR0
0BhDTRReserved DTR2DTR1DTR0

控制與狀態寄存器(Control and Status)
控制與狀態寄存器包括狀態寄存器、中斷與報警寄存器、模擬微調與數字微調寄存器。
狀態寄存器(SR):用來控制RTC失效、電池模式、報警觸發、時鐘計數器寫保護、晶體振盪器使能以及狀態位的自動復位或者提供相應的狀態信息。在時鐘上電時,需將寫RTC使能位WRTC置“1”,以便啓動時鐘計數。
中斷控制寄存器(INT):主要用於控制時鐘的週期性和單事件報警。其中頻率輸出控制位FO3-FO0使能/禁止頻率輸出功能,並選擇IRQ/FOUT引腳的輸出頻率(2-5Hz-215Hz)。在頻率模式被激活時它將覆蓋IRQ/FOUT引腳上的報警模式。報警使能位ALME使能/禁止報警功能,中斷/報警模式位IM使能單週期定時事件(IM=0)/週期定時事件(IM=1)。
模擬微調寄存器(ATR):ATR0至ATR5爲六位模擬微調位,可調整片內負載電容(CX1、CX2)的值,這一電容值用於RTC的頻率補償,其每一位都有不同的電容調節比重。有效的片內串聯負載電容CLOAD 的範圍從4.5pF至20.25pF,中間值爲12.5pF(默認)。CLOAD可通過X1/X2引腳之間兩個數字控制電容器CX1和CX2調節。
數字微調寄存器(DTR):數字微調位DTR0、DTR1和DTR2用來調整每秒鐘的平均計數值和平均誤差以獲取更好的精度。其中DTR2爲符號位(DTR2=0頻率補償>0,DTR2=1頻率補償<0),DTR1和DTR0爲刻度位:DTR1提供40ppm調整,DTR0提供20ppm調整。用以上三位可以表示-60ppm至+60ppm的補償範圍。
4. 應用舉例
4.1 硬件結構
ISL1208具有I2C接口,使其便於與各類處理器連接且硬件結構十分簡單,傳輸速率最高可達400Hz。硬件結構如圖3。其中時鐘輸入口SCL、數據輸入輸出口SDA分別與AT89C51的P1.6、P1.7腿相連,中斷輸出口IRQ/Fout接外部中斷INT0。AT89C51通過RS232口與計算機相連,通過計算機對實時時鐘產生控制。Vbat引腳接後備電容器。

圖3 ISL1208與AT89C52連接圖
4.2 軟件設計
由於ISL1208爲I2C接口,因此其接口協議也滿足I2C規範,這裏不再累述。需要提到一點是:在每次訪問寄存器時,應先輸入一個有效的辨識字節。該字節高7位(1101111)爲器件辨識符。辨識字節的最後一位定義進行讀/寫操作,當其爲“1”時選擇讀,爲“0”時選擇寫。圖4爲ISL1208讀/寫時序圖。

圖4 讀/寫ISL1208
對於ISL1208來說,由於其內部結構設計,可以很容易的實現2nHz中斷輸出和每分、每天至每年一次報警,但要求具體幾分鐘、幾小時報警一次還需在程序的編制上要比較注意。以下程序爲通過計算機、單片機來控制ISL1208每5秒鐘產生一次中斷程序,上位機程序由MATLAB編寫[4],單片機程序由C語言編寫,由於篇幅有限僅列出部分單片機程序:


#include
#define ISLwr 0xde /*寫辨識字節*/
#define ISLrd 0xdf /*讀辨識字節*/
/*--------ISL1208管腳配置---------*/
sbit ISLSCL=P1^6; /*時鐘*/
sbit ISLSDA=P1^7; /*數據*/
void sdelay(); /*短延時*/
void ISLstart(); /*I2C起始位*/
void ISLstop(); /*I2C停止位*/
void GetACK(); /*主機等待應答(GACK)*/
void OutACK(); /*主機應答(OACK)*/
/*--------讀/寫ISL1208函數--------*/
unsigned char readISL1208();
void writeISL1208(unsigned char datas);
/*-----------讀/寫寄存器-------------*/
void writeREG(unsigned char adds,unsigned char datas);
unsigned char readREG(unsigned char adds);
bit flag=0; /*啓動時鐘報警標誌位*/
unsigned char alarm=0; /*報警時間參數*/
main()
{ ……………….. /*初始化*/
for(;;) /*等待上位機發送命令*/
{ if(flag = =1)
break; }
/*寫狀態寄存器,寫RTC使能,報警自動復位*/
writeREG(0x07,0x90);
/*寫中斷寄存器,單事件報警,中斷使能*/
writeREG(0x08,0x60);
/*寫報警寄存器,報警使能*/
writeREG(0x0c,0x81);
/*寫時鐘寄存器,啓動RTC*/
writeREG(0x00,0x00);
for(;;); /*等待*/ }
void writeREG(unsigned char adds,unsigned char datas)
{ ISLstart();
writeISL1208(ISLwr);
GetACK();
writeISL1208(adds); /*寫地址*/
GetACK();
writeISL1208(datas); /*寫命令/數據*/
GetACK();
ISLstop(); }
unsigned char readREG(unsigned char adds)
{ unsigned char reg;
ISLstart();
writeISL1208(ISLwr);
GetACK();
writeISL1208(adds); /*寫地址*/
GetACK();
ISLstart();
writeISL1208(ISLrd);
GetACK();
reg=readISL1208(); /*讀就寄存器值*/
OutACK();
ISLstop();
return (reg); }
unsigned char readISL1208()
{ unsigned char i,k=0;
ISLSDA=1;
for(i=0;i<8;i++)
{ ISLSCL=1;
k=k*2;
if(ISLSDA==1)
k=k+1;
ISLSCL=0; }
return (k); }
void writeISL1208(unsigned char datas)
{ unsigned char data i;
ISLSCL=0;
for(i=0;i<8;i++)
{ ISLSDA=(bit)(datas&0x80);
datas=datas<<1;
sdelay();
ISLSCL=1;
sdelay();
ISLSCL=0; } }
void int0() interrupt 0 using 1 /*外部中斷0處理函數*/
{ unsigned char temp=0,reg;
/*單報警模式,5秒/次報警時間算法*/
alarm=(alarm+5)%60;
temp=alarm/10;
temp<<=4;
temp=(temp+alarm%10)|0x80;
/*讀狀態寄存器清除報警標誌*/
reg=readREG(0x07);
/*寫報警寄存器,確定下次報警時間*/
writeREG(0x0c,temp);


}


4.3 後背電容器的使用
具體電路結構如圖3。電容器的大小通過計算得出:若後背電容供電時間爲兩個月且Vcc=5.0V,Vbat電壓從4.7V下降到1.8V(時鐘最低工作電壓)。假定二極管漏電流ILKG很小並可忽略。則電容充電/放電方程爲:IBAT=CBAT*dV/dT,整理後得後備供電時間:dT=CBAT*dV/ IBAT。由於IBAT隨VBAT基本上呈線性變化,這樣IBAT可近似取兩點之間的平均值。IBAT與VBAT之間的典型線性關係方程式爲:IBAT=1.031E-7* VBAT +1.036E-7 A
若已給出兩點電壓,則平均電流IBATAVG=5.155E-8*(VBAT2+VBAT1)+1.036E-7 A
結合以上方程整理後得後備供電時間TBACKUP=CBAT*(VBAT2 -VBAT1)/IBATAVG s
將上述方程改寫爲:CBAT=TBACKUP* IBATAVG /(VBAT2 -VBAT1)
其中:TBACKUP=60天*86400秒/天=5.18E6 s,IBATAVG=4.387E -7 A,VBAT2=4.7V,VBAT1=1.8V.則CBAT=5.18E6* 4.387E-7 / 2.9 =0.784 F,如果要包括30%的容度,則最壞情況下的電容值應爲CBAT=1.3*0.784=1.02 F.
5. 小結
ISL1208是一種小巧(SOIC封裝)、低功耗、低成本的實時時鐘芯片,集時鐘、日曆、RAM、電源故障檢測、報警功能由於一身,硬件結構簡單、編成簡便、精度高,在多功能電錶、HVAC設備、音頻/視頻元件、尋呼機/PDA、家用電器及其它工業/醫療/汽車電子產品中都有十分廣泛的應用前景。
參考文獻
1. INTERSIL I2C Real Time Clock/Calendar ISL1208 Data Sheet. October 29,2004.
2.徐愛鈞,彭秀華. 單片機高級語言C51應用程序設計. 電子工業出版社,1998年6月.
3.張道明,郝繼飛. 基於MATLAB的MCU串行通信. 信息技術與信息化,2004(5).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章