Proteus—AVR單片機(ATMEGA16單片機)系統(tǒng)時鐘及時鐘選項設(shè)置
在設(shè)置之前呢,我得把ATMEGA16里面的datasheet里面的資料說說,當(dāng)然是關(guān)于系統(tǒng)時鐘和時鐘選項的
一、系統(tǒng)時鐘及時鐘選項(這里主要是介紹原理,三里面會介紹如何設(shè)置,其實你會了一,那后面的二和三就相當(dāng)簡單了~~你懂得,就是根據(jù)一來的)
1. 時鐘系統(tǒng)及其分布:
Figure 11為AVR的主要時鐘系統(tǒng)及其分布。這些時鐘并不需要同時工作。為了降低功耗,
可以通過使用不同的睡眠模式來禁止無需工作的模塊的時鐘。
1)CPU 時鐘- clkCPU
CPU時鐘與操作AVR內(nèi)核的子系統(tǒng)相連,如通用寄存器文件、狀態(tài)寄存器及保存堆棧指針
的數(shù)據(jù)存儲器。終止CPU 時鐘將使內(nèi)核停止工作和計算。
2)I/O 時鐘- clkI/O
I/O時鐘用于主要的I/O 模塊,如定時器/ 計數(shù)器、SPI 和USART。I/O 時鐘還用于外部中斷
模塊。要注意的是有些外部中斷由異步邏輯檢測,因此即使I/O 時鐘停止了這些中斷仍然
可以得到監(jiān)控。此外, USI 模塊的起始條件檢測在沒有clkI/O 的情況下也是異步實現(xiàn)的,
使得這個功能在任何睡眠模式下都可以正常工作。
3)Flash 時鐘- clkFLASH
Flash 時鐘控制Flash 接口的操作。此時鐘通常與CPU 時鐘同時掛起或激活。
4)異步定時器時鐘- clkASY
異步定時器時鐘允許異步定時器/ 計數(shù)器與LCD 控制器直接由外部32 kHz 時鐘晶體驅(qū)
動。使得此定時器/ 計數(shù)器即使在睡眠模式下仍然可以為系統(tǒng)提供一個實時時鐘。
5)ADC 時鐘- clkADC
ADC具有專門的時鐘。這樣可以在ADC工作的時候停止CPU和I/O時鐘以降低數(shù)字電路產(chǎn)
生的噪聲,從而提高ADC 轉(zhuǎn)換精度。
2.時鐘源
ATmega16芯片有如下幾種通過Flash熔絲位進行選擇的時鐘源。時鐘輸入到AVR時鐘發(fā)
生器,再分配到相應(yīng)的模塊。(這個還是很好理解的,就是通過CKSEL3~0位既4位來確定是使用外部晶振、外部低頻晶振、外部RC振蕩器、標定的內(nèi)部RC振蕩器還是外部時鐘,很簡單吧)
3.默認時鐘源
器件出廠時CKSEL = “0010”, SUT = “10”。這個默認設(shè)置的時鐘源是1 MHz 的內(nèi)部RC
振蕩器,啟動時間為最長。這種設(shè)置保證用戶可以通過ISP 或并行編程器得到所需的時鐘
源。(這里STU可能還不明白,后面還有介紹的~~)
4.晶體振蕩器(從現(xiàn)在開始,就真正要介紹他們的系統(tǒng)時鐘和時鐘選項了)
XTAL1 與XTAL2 分別為用作片內(nèi)振蕩器的反向放大器的輸入和輸出,如Figure 12 所示,
這個振蕩器可以使用石英晶體,也可以使用陶瓷諧振器。熔絲位CKOPT 用來選擇這兩種
放大器模式的其中之一。當(dāng)CKOPT 被編程時振蕩器在輸出引腳產(chǎn)生滿幅度的振蕩。這種
模式適合于噪聲環(huán)境,以及需要通過XTAL2 驅(qū)動第二個時鐘緩沖器的情況。而且這種模
式的頻率范圍比較寬。當(dāng)保持CKOPT 為未編程狀態(tài)時,振蕩器的輸出信號幅度比較小。
其優(yōu)點是大大降低了功耗,但是頻率范圍比較窄,而且不能驅(qū)動其他時鐘緩沖器。
對于諧振器, CKOPT 未編程時的最大頻率為8 MHz, CKOPT 編程時為16 MHz。C1
和C2 的數(shù)值要一樣,不管使用的是晶體還是諧振器。最佳的數(shù)值與使用的晶體或諧振器
有關(guān),還與雜散電容和環(huán)境的電磁噪聲有關(guān)。Table8 給出了針對晶體選擇電容的一些指
南。對于陶瓷諧振器,應(yīng)該使用廠商提供的數(shù)值。若想得到更多的有關(guān)如何選擇電容以及
振蕩器如何工作的信息,請參考多用途振蕩器應(yīng)用手冊。
振蕩器可以工作于三種不同的模式,每一種都有一個優(yōu)化的頻率范圍。工作模式通過熔絲
位CKSEL3..1 來選擇,如Table 4 所示。(這里可能會有一點疑問,不是CKSEL3~0用來選擇器件的,怎么CKSEL3~1用來選擇什么鳥頻率范圍,對嘍,就是這個樣子,CKSEL3~1就是用來選擇你選擇好的晶體振蕩器工作模式的(順便給出了范圍),這就是為什么上面CKSEL3~0為什么選擇器件有個范圍的原因了。然后就是CKSEL0位呢?熔絲位CKSEL0以及STU1~0用來選擇啟動時間的,下面會有介紹的)
如Table 5 所示,熔絲位CKSEL0 以及SUT1..0 用于選擇啟動時間。
5)低頻晶體振蕩器
為了使用32.768 kHz 鐘表晶體作為器件的時鐘源,必須將熔絲位CKSEL 設(shè)置為“1001”
以選擇低頻晶體振蕩器。晶體的連接方式如Figure 12 所示(此圖跟晶體振蕩器的連接圖一樣的~~)。通過對熔絲位CKOPT 的編程,用戶可以使能XTAL1 和XTAL2 的內(nèi)部電容,從而去除外部電容。內(nèi)部電容的標稱數(shù)
值為36 pF。
選擇了這個振蕩器之后,啟動時間由熔絲位SUT 確定,如Table 6 所示。
6)外部RC振蕩器
對于時間不敏感的應(yīng)用可以使用Figure 13 的外部RC 振蕩器。頻率可以通過方程f =
1/(3RC) 進行粗略地鼓估計。電容C 至少要22 pF。
通過編程熔絲位CKOPT,用戶可以使能XTAL1 和GND 之間的片內(nèi) 36 pF 電容,從而無需外部電容。
振蕩器可以工作于四個不同的模式,每個模式有自己的優(yōu)化頻率范圍。工作模式通過熔絲
位CKSEL3..0 選取,如Table 7 所示。
選擇了這個振蕩器之后,啟動時間由熔絲位SUT 確定,如Table 8 所示。
7)標定的片內(nèi)RC振蕩器
標定的片內(nèi)RC 振蕩器提供了固定的1.0、2.0、4.0 或8.0 MHz 的時鐘。這些頻率都是
5V、25°C 下的標稱數(shù)值。這個時鐘也可以作為系統(tǒng)時鐘,只要按照Table 9 對熔絲位
CKSEL進行編程即可。選擇這個時鐘(此時不能對CKOPT進行編程)之后就無需外部器件
了。復(fù)位時硬件將標定字節(jié)加載到OSCCAL 寄存器,自動完成對RC 振蕩器的標定。在
5V,25°C 和頻率為1.0 MHz 時,這種標定可以提供標稱頻率 ± 1% 的精度。當(dāng)使用這個振
蕩器作為系統(tǒng)時鐘時,看門狗仍然使用自己的看門狗定時器作為溢出復(fù)位的依據(jù)。
選擇了這個振蕩器之后,啟動時間由熔絲位SUT 確定,如Table 10 所示。XTAL1 和
XTAL2 要保持為空(NC)。
8)振蕩器標定寄存器- OSCCAL(這個寄存器主要是對內(nèi)部振蕩器進行調(diào)節(jié)的,可以消除由于生產(chǎn)工藝所帶來的振蕩器頻率偏差~~后面有詳細介紹的,說實話,我還真的沒有用過~~)
? Bits 7..0 – CAL7..0: 振蕩器標定數(shù)據(jù)
將標定數(shù)據(jù)寫入這個地址可以對內(nèi)部振蕩器進行調(diào)節(jié)以消除由于生產(chǎn)工藝所帶來的振蕩
器頻率偏差。復(fù)位時1 MHz 的標定數(shù)據(jù)( 標識數(shù)據(jù)的高字節(jié),地址為0x00) 自動加載到
OSCCAL 寄存器。如果需要內(nèi)部RC 振蕩器工作于其他頻率,標定數(shù)據(jù)必須人工加載。
首先通過編程器讀取標識數(shù)據(jù),然后將標定數(shù)據(jù)保存到Flash 或EEPROM 之中。這些數(shù)據(jù)
可以通過軟件讀取,然后加載到OSCCAL 寄存器。當(dāng)OSCCAL 為零時振蕩器以最低頻
率工作。當(dāng)對其寫如不為零的數(shù)據(jù)時內(nèi)部振蕩器的頻率將增長。寫入0xFF 即得到最高頻
率。標定的振蕩器用來為訪問EEPROM 和Flash 定時。有寫EEPROM 和Flash 的操作
時不要將頻率標定到超過標稱頻率的10%,否則寫操作有可能失敗。要注意振蕩器只對
1.0、2.0、4.0 和8.0 MHz 這四種頻率進行了標定,其他頻率則無法保證。
9)外部時鐘
為了從外部時鐘源驅(qū)動芯片, XTAL1 必須如Figure 14 所示的進行連接。同時,熔絲位
CKSEL必須編程為“0000”。若熔絲位CKOPT也被編程,用戶就可以使用內(nèi)部的XTAL1和
GND 之間的36 pF 電容。
10)定時/計數(shù)器振蕩器
對于擁有定時器/ 振蕩器引腳(TOSC1 和TOSC2) 的AVR 微處理器,晶體可以直接與這
兩個引腳連接,無需外部電容。此振蕩器針對32.768 kHz 的鐘表晶體作了優(yōu)化。不建議
在TOSC1 引腳輸入振蕩信號。
二、IAR for AVR設(shè)置熔絲位(暫時還真的不會啊~~等會了再貼出來吧~~~,先簡短的略過吧)
三、Proteus中的相關(guān)設(shè)置
啊~~~馬上就哦了
Proteus中ATMEGA16的component如下:
這里我就不一一介紹了吧,主要的說說就哦了:
CKOPT位1是未編程,0代表編程
CKSEL這個必須知道,熔絲位設(shè)置,這里面有你想設(shè)置的熔絲位,什么晶體振蕩器,低頻晶體振蕩器,外部RC振蕩器,標定的片內(nèi)RC振蕩器以及外部時鐘都是從這里找的~~~(我一般選擇片內(nèi)RC振蕩器,而且是8MHZ的)
然后是boot loder size,這個是一個引導(dǎo)程序大小的設(shè)置,暫時放著先不管~~
STU這個設(shè)置對于啟動時間還是很重要的出廠時的設(shè)置是10,電源是緩慢上升的(上面可是有圖有解釋的~~~這里我就不改動了)
現(xiàn)在看看我的設(shè)置吧,但是我還不知道怎么用外部晶振~~~這篇文章持續(xù)更新,以后知道了再給補上,上面說的都是些基礎(chǔ)~~你懂得,畢竟我也是個小菜鳥,呵呵