- AVR單片機C語言應用100例
- 嚴雨 廉潔編著
- 2679字
- 2018-12-27 17:25:31
1.2.3 ATmega128單片機的系統時鐘
圖1.7所示為ATmega128單片機的系統時鐘構成。在實際工作中,使用這些時鐘的不同選擇和組合來驅動ATmega128工作。

圖1.7 ATmega128單片機的系統時鐘構成
ATmega128單片機的系統時鐘由以下5個部分構成。
● CPU時鐘:clkCPU與ATmega128單片機的內核各個模塊相連接,如通用寄存器、狀態寄存器及保存堆棧指針的數據存儲器,終止CPU時鐘將使內核停止工作。
●I/O時鐘:clkI/O用于驅動主要的I/O模塊,如定時/計數器模塊、SPI總線接口模塊和USART模塊等,I/O時鐘還用于驅動外部中斷模塊。但是,有些外部中斷由異步邏輯檢測,因此即使I/O時鐘停止了,這些中斷仍然可以得到監控。另外,TWI(I2 C)總線接口模塊的啟動檢測在沒有clkI/O的情況下也是使用異步邏輯來檢測的,所以該數據總線模塊在ATmega128單片機的任何睡眠模式下都可以正常工作。
●Flash時鐘:clkFlash用于控制Flash存儲器接口的操作,此時鐘通常與CPU時鐘同時掛起或激活。
● 異步定時器時鐘:clkASY異步定時器時鐘允許定時/計數器由外部32kHz時鐘晶體驅動,使得這些定時/計數器即使在ATmega128的睡眠模式下仍然可以正常工作。
● ADC時鐘:clkADC是ADC模塊的專用時鐘,這樣可以在ADC工作時停止CPU和I/O時鐘,以降低數字電路產生的噪聲,從而提高ADC轉換精度。
1. 時鐘源選擇
ATmega128單片機可以通過對熔絲位的配置來選擇時鐘源,如表1.4所示。
表1.4 使用熔絲位配置時鐘源

當ATmega128單片機從自掉電模式或省電模式被喚醒后,被選擇的時鐘源用來為啟動過程定時,以保證振蕩器在開始執行指令之前進入穩定狀態。當ATmega128單片機從復位開始工作時,還能提供額外的延遲時間,以保證其開始正常工作之前電源達到穩定電平,這個啟動時間的定時工作由看門狗振蕩器完成。看門狗溢出時間所對應的WDT振蕩器周期數如表1.5所示,其頻率由工作電壓決定。
表1.5 看門狗溢出時間所對應的WDT振蕩器周期數

說明
1. 在ATmega128出廠時,CKSEL=“0001”,SUT=“10”,默認設置的時鐘源是內部RC振蕩器,啟動時間最長,這種設置可以保證用戶能夠通過ISP或并行編程器得到所需的時鐘源。
2. 熔絲位是用于對ATmega128單片機進行配置的一系列位,可以在編程時使用編程/下載工具寫入ATmega128單片機,從而控制ATmega128單片機進行相應的工作。
2. 晶體振蕩器
ATmega128單片機使用晶體振蕩器電路如圖1.8所示。引腳XTAL1與XTAL2分別用作片內振蕩器的反向放大器的輸入和輸出。

圖1.8 ATmega128單片機使用晶體振蕩器電路
晶體振蕩器可以使用石英晶體,也可以使用陶瓷諧振器。
熔絲位CKOPT用來選擇這兩種放大器模式的其中之一。當CKOPT被編程時,振蕩器在輸出引腳產生滿幅度的振蕩,這種模式適合于噪聲環境,以及需要通過XTAL2驅動第2個時鐘緩沖器的情況,而且這種模式的頻率范圍比較寬。當保持CKOPT為未編程狀態時,振蕩器的輸出信號幅度比較小。其優點是大大降低了功耗,但是頻率范圍比較窄,而且不能驅動其他時鐘緩沖器。
對于諧振器,CKOPT未編程時的最大頻率為8MHz,CKOPT編程時的最大頻率為16MHz。電容C1 和C2的數值要一樣,不管使用的是石英晶體還是陶瓷諧振器。最佳的數值與使用的石英晶體或陶瓷諧振器有關,還與雜散電容和環境的電磁噪聲有關。
振蕩器可以工作于3種不同的模式,每一種都有一個優化的頻率范圍。工作模式通過熔絲位CKSEL3~CKSEL1來選擇,如表1.6所示。
表1.6 晶體振蕩器的相關參數選擇

說明
CKPOT=1,CKSEL3~CKSEL0=101的選項不適用于晶體,只適用于陶瓷諧振器。
熔絲位CKSEL0和SUT1~SUT0決定了ATmega128單片機的啟動時間,如表1.7所示。
表1.7 ATmega1 28單片機的啟動時間

3. 低頻晶體振蕩器
ATmega128單片機可以使用32.768kHz的鐘表晶體作為器件的時鐘源。此時,必須將熔絲位CKSEL設置為“1001”,以選擇低頻晶體振蕩器,該晶體的連接方式和使用晶體振蕩器相同。通過對熔絲位CKOPT的編程,用戶可以使能XTAL1和XTAL2的內部電容,從而節省外部電容,內部電容容量的標稱值為36pF。使用低頻晶體振蕩器之后,啟動時間由熔絲位SUT確定,如表1.8所示。
表1.8 低頻晶體振蕩器的啟動時間

4. 外部RC振蕩器
如果ATmega128單片機的應用系統不需要特別精確的定時,則可以使用圖1.9所示的外部RC振蕩器作為時鐘源,其頻率可以通過公式:

進行大略的計算。其中,C至少要22pF。通過對熔絲位CKOPT的編程,用戶可以使能XTAL1和GND之間的片內36pF電容,從而無須外加電容。

圖1.9 外部RC振蕩器
RC振蕩器可以工作于4個不同的模式,每個模式有相應的優化頻率范圍,工作模式通過對熔絲位CKSEL3~CKSEL0的編程來決定,如表1.9所示。
表1.9 RC振蕩器的工作模式

RC振蕩器的啟動時間由熔絲位SUT決定,如表1.10所示。
表1.10 RC振蕩器啟動時間

5. 校準片內RC時鐘源
ATmega128單片機有一個經過校準的片內RC振蕩器,可以給ATmega128單片機提供固定的1.0、2.0、4.0或8.0MHz的時鐘頻率(這些頻率都是5 V、25℃下的標稱值)。校準片內時鐘源使用熔絲位CKSEL進行控制,如表1.11所示。當使用這個時鐘(此時不能對CK-OPT進行編程)時,無須外部振蕩器件。當ATmega128單片機復位時,硬件將標定字節加載到OSCCAL寄存器中,自動完成對內部RC振蕩器的標定。在5V、25℃和頻率為1.0MHz時,這種標定可以提供標稱頻率±3%的時鐘精度。在使用這個振蕩器作為系統時鐘時,看門狗仍然使用自己的看門狗定時器作為溢出復位的依據。
表1.11 使用校準片內RC時鐘源

注意
芯片出廠默認設置為1.0MHz。
當使用RC時鐘源時,ATmega128單片機的啟動時間由熔絲位SUT決定,如表1.12所示。
表1.12 校準片內RC振蕩器啟動時間

振蕩器標定寄存器OSCCAL的內部結構如表1.13所示。將標定數據寫入OSCCAL寄存器,可以對內部振蕩器進行調節,以消除由于生產工藝所帶來的振蕩器頻率偏差。復位時,1 MHz的標定數據(標定數據的高字節,地址為0x00)自動加載到OSCCAL寄存器。
表1.13 OSCCAL寄存器

如果需要內部RC振蕩器工作于其他頻率,其標定數據必須人工加載。首先通過編程器讀取標定數據,然后將標定數據保存到Flash或E2 PROM之中。這些數據可以通過軟件讀取,然后加載到OSCCAL寄存器。當OSCCAL為零時,振蕩器以最低頻率工作;當對其寫入不為零的數據時,內部振蕩器的頻率將增加,寫入0xFF,即得到最高頻率。標定的振蕩器將用來為訪問E2 PROM和Flash定時。需要注意的是,有寫E2 PROM和Flash的操作時,不要將頻率標定到超過標稱頻率的10%;否則,寫操作有可能失敗,如表1.14所示。
注意
振蕩器只對1.0、2.0、4.0和8.0MHz 4種頻率進行了標定;對于其他頻率,則無法保證。
表1.14 內部校準RC時鐘源范圍

6. 外部時鐘源
ATmega128單片機可以使用外部時鐘源作為芯片驅動。這時,XTAL1引腳必須按圖1.10所示進行連接,同時熔絲位CKSEL必須編程為“0000”。若熔絲位CKOPT也被編程,用戶就可以使用內部的XTAL1和GND之間的36pF電容,此時不需要外加電容。

圖1.10 外部時鐘源電路圖
當選擇了外部時鐘源之后,ATmega128單片機的啟動時間由熔絲位SUT確定,如表1.15所示。為了保證ATmega128單片機能夠穩定工作,不能突然改變外部時鐘源的振蕩頻率。當工作頻率突變超過2%,將會產生異常現象。所以,應該在ATmega128單片機保持復位狀態時,改變外部時鐘的振蕩頻率。晶體可以直接與XTAL1和GND引腳連接,無須外部電容器。此振蕩器針對32.768kHz的鐘表晶體作了優化,不建議在TOSC1引腳輸入振蕩信號。
表1.15 外部時鐘源啟動時間
