新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR單片機(jī)(學(xué)習(xí)ing)-ATMEGA16的定時(shí)/計(jì)數(shù)器

AVR單片機(jī)(學(xué)習(xí)ing)-ATMEGA16的定時(shí)/計(jì)數(shù)器

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
6)T/C1 中斷屏蔽寄存器- TIMSK


• Bit 5 – TICIE1: T/C1 輸入捕捉中斷使能
當(dāng)該位被設(shè)為"1”,且狀態(tài)寄存器中的I 位被設(shè)為"1” 時(shí), T/C1 的輸入捕捉中斷使能。一
旦TIFR 的ICF1 置位,CPU 即開始執(zhí)行T/C1 輸入捕捉中斷服務(wù)程序( 見P43 “ 中斷” )。
• Bit 4 – OCIE1A: 輸出比較 A 匹配中斷使能
當(dāng)該位被設(shè)為"1”,且狀態(tài)寄存器中的I 位被設(shè)為"1” 時(shí), T/C1 的輸出比較A 匹配中斷使
能。一旦TIFR 上的OCF1A 置位,CPU 即開始執(zhí)行T/C1 輸出比較A 匹配中斷服務(wù)程序。
• Bit 3 – OCIE1B: T/C1 輸出比較 B 匹配中斷使能
當(dāng)該位被設(shè)為"1”,且狀態(tài)寄存器中的I 位被設(shè)為"1” 時(shí),使能T/C1 的輸出比較B 匹配中
斷使能。一旦TIFR 上的OCF1B 置位,CPU 即開始執(zhí)行T/C1 輸出比較B 匹配中斷服務(wù)
程序。
• Bit 2 – TOIE1: T/C1 溢出中斷使能
當(dāng)該位被設(shè)為"1”,且狀態(tài)寄存器中的I 位被設(shè)為”1” 時(shí), T/C1 的溢出中斷使能。一旦
TIFR 上的TOV1 置位, CPU 即開始執(zhí)行T/C1 溢出中斷服務(wù)程序。
7)T/C 中斷標(biāo)志寄存器- TIFR


• Bit 5 – ICF1: T/C1 輸入捕捉標(biāo)志位
外部引腳ICP1 出現(xiàn)捕捉事件時(shí)ICF1 置位。此外,當(dāng)ICR1 作為計(jì)數(shù)器的TOP 值時(shí),一
旦計(jì)數(shù)器值達(dá)到TOP, ICF1 也置位。
執(zhí)行輸入捕捉中斷服務(wù)程序時(shí)ICF1 自動(dòng)清零。也可以對其寫入邏輯"1” 來清除該標(biāo)志位。
• Bit 4 – OCF1A: T/C1 輸出比較 A 匹配標(biāo)志位
當(dāng)TCNT1 與OCR1A 匹配成功時(shí),該位被設(shè)為"1”。
強(qiáng)制輸出比較(FOC1A) 不會置位OCF1A。
執(zhí)行強(qiáng)制輸出比較匹配A 中斷服務(wù)程序時(shí)OCF1A 自動(dòng)清零。也可以對其寫入邏輯"1” 來
清除該標(biāo)志位。
• Bit 3 – OCF1B: T/C1 輸出比較 B 匹配標(biāo)志位
當(dāng)TCNT1 與OCR1B 匹配成功時(shí),該位被設(shè)為"1”。
強(qiáng)制輸出比較(FOC1B) 不會置位OCF1B。
執(zhí)行強(qiáng)制輸出比較匹配B 中斷服務(wù)程序時(shí)OCF1B 自動(dòng)清零。也可以對其寫入邏輯"1” 來
清除該標(biāo)志位。
• Bit 2 – TOV1: T/C1 溢出標(biāo)志
該位的設(shè)置與T/C1 的工作方式有關(guān)。工作于普通模式和CTC 模式時(shí),T/C1 溢出時(shí)TOV1
置位。對工作在其它模式下的TOV1 標(biāo)志位置位,執(zhí)行溢出中斷服務(wù)程序時(shí)OCF1A 自動(dòng)清零。也可以對其寫入邏輯"1” 來清除該標(biāo)志位。
6、8 位有PWM 與異步操作的定時(shí)器/ 計(jì)數(shù)器2
小小介紹~~~
T/C2 是一個(gè)通用單通道8 位定時(shí)/ 計(jì)數(shù)器,其主要特點(diǎn)如下:
• 單通道計(jì)數(shù)器
• 比較匹配時(shí)清零定時(shí)器 ( 自動(dòng)重載)
• 無干擾脈沖, 相位正確的脈寬調(diào)制器 (PWM)
• 頻率發(fā)生器
• 10 位時(shí)鐘預(yù)分頻器
• 溢出與比較匹配中斷源(TOV2 與OCF2)
• 允許使用外部的32 kHz 手表晶振作為獨(dú)立的I/O 時(shí)鐘源
其實(shí)這里重要的應(yīng)該是異步操作,這里只是簡單介紹一下下,后面會有實(shí)驗(yàn)專門來操作的,盡量給力~~~這里我也不詳細(xì)介紹了,重要的是后面的寄存器
寄存器:
定時(shí)器/ 計(jì)數(shù)器TCNT2、輸出比較寄存器OCR2 為8 位寄存器。中斷請求( 圖中簡寫為
Int.Req.)。信號在定時(shí)器中斷標(biāo)志寄存器TIFR 都有反映。 所有中斷都可以通過定時(shí)器中
斷屏蔽寄存器TIMSK 單獨(dú)進(jìn)行屏蔽。圖中未給出TIFR 與TIMSK。
T/C 的時(shí)鐘可以為通過預(yù)分頻器的內(nèi)部時(shí)鐘或 通過由TOSC1/2 引腳接入的異步時(shí)鐘,詳
見本節(jié)后續(xù)部分。異步操作由異步狀態(tài)寄存器ASSR 控制。時(shí)鐘選擇邏輯模塊控制引起
T/C計(jì)數(shù)值增加(或減少)的時(shí)鐘源。 沒有選擇時(shí)鐘源時(shí)T/C處于停止?fàn)顟B(tài)。時(shí)鐘選擇邏輯模
塊的輸出稱為clkT2。
雙緩沖的輸出比較寄存器OCR2 一直與TCNT2 的數(shù)值進(jìn)行比較。波形發(fā)生器利用比較結(jié)
果產(chǎn)生PWM 波形或在比較輸出引腳OC2 輸出可變頻率的信號。參見P111 “ 輸出比較單
元” 。比較匹配結(jié)果還會置位比較匹配標(biāo)志OCF2,用來產(chǎn)生輸出比較中斷請求。
7、8位T/C2的寄存器
1)T/C2的控制寄存器


• Bit 7 – FOC2: 強(qiáng)制輸出比較
FOC2僅在WGM指明非PWM模式時(shí)才有效。但是,為了保證與未來器件的兼容性,使用
PWM 時(shí),寫TCCR2 要對其清零。寫1 后,波形發(fā)生器將立即進(jìn)行比較操作。比較匹配輸
出引腳 OC2 將按照COM21:0 的設(shè)置輸出相應(yīng)的電平。要注意FOC2 類似一個(gè)鎖存信號,
真正對強(qiáng)制輸出比較起作用的是COM21:0 的設(shè)置。
FOC2 不會引發(fā)任何中斷,也不會在使用OCR2 作為TOP 的CTC 模式下對定時(shí)器進(jìn)行清
零。
讀FOC2 的返回值永遠(yuǎn)為0。
• Bit 6, 3 – WGM21:0: 波形產(chǎn)生模式
這幾位控制計(jì)數(shù)器的計(jì)數(shù)序列,計(jì)數(shù)器最大值TOP 的來源,以及產(chǎn)生何種波形。T/C 支
持的模式有:普通模式,比較匹配發(fā)生時(shí)清除計(jì)數(shù)器模式(CTC),以及兩種PWM 模式。

• Bit 5:4 – COM21:0: 比較匹配輸出模式
這些位決定了比較匹配發(fā)生時(shí)輸出引腳OC0 的電平。如果COM01:0 中的一位或全部都
置位, OC0 以比較匹配輸出的方式進(jìn)行工作。同時(shí)其方向控制位要設(shè)置為1 以使能輸出
驅(qū)動(dòng)。
當(dāng)OC0 連接到物理引腳上時(shí), COM01:0 的功能依賴于WGM01:0 的設(shè)置。Table 51 給
出了當(dāng)WGM01:0 設(shè)置為普通模式或CTC 模式時(shí)COM01:0 的功能。



• Bit 2:0 – CS22:0: 時(shí)鐘選擇
這三位時(shí)鐘選擇位用于選擇T/C 的時(shí)鐘源,見Table 54。

2)定時(shí)器/ 計(jì)數(shù)器寄存器- TCNT2


通過T/C 寄存器可以直接對計(jì)數(shù)器的8 位數(shù)據(jù)進(jìn)行讀寫訪問。對TCNT2 寄存器的寫訪問
將在下一個(gè)時(shí)鐘阻止比較匹配。在計(jì)數(shù)器運(yùn)行的過程中修改TCNT2 的數(shù)值有可能丟失一
次TCNT2 和OCR2 的比較匹配。
3)輸出比較寄存器- OCR2

輸出比較寄存器包含一個(gè)8 位的數(shù)據(jù),不間斷地與計(jì)數(shù)器數(shù)值TCNT2 進(jìn)行比較。匹配事
件可以用來產(chǎn)生輸出比較中斷,或者用來在OC2 引腳上產(chǎn)生波形。
4)異步狀態(tài)寄存器- ASSR


• Bit 3 – AS2: 異步 T/C2
AS2為"0”時(shí)T/C2由I/O時(shí)鐘clkI/O驅(qū)動(dòng);AS2為"1”時(shí)T/C2由連接到TOSC1引腳的晶體振蕩
器驅(qū)動(dòng)。改變AS2 有可能破壞TCNT2、OCR2 與TCCR2 的內(nèi)容。
• Bit 2 – TCN2UB: T/C2 更新中
T/C2工作于異步模式時(shí),寫TCNT2將引起TCN2UB置位。當(dāng)TCNT2從暫存寄存器更新完
畢后TCN2UB 由硬件清零。TCN2UB 為0 表明TCNT2 可以寫入新值了。
• Bit 1 – OCR2UB: 輸出比較寄存器2 更新中
T/C2工作于異步模式時(shí),寫OCR2將引起OCR2UB置位。當(dāng)OCR2從暫存寄存器更新完畢
后OCR2UB 由硬件清零。OCR2UB 為0 表明OCR2 可以寫入新值了。
• Bit 0 – TCR2UB: T/C2 控制寄存器更新中
T/C2工作于異步模式時(shí),寫TCCR2將引起TCR2UB置位。當(dāng)TCCR2從暫存寄存器更新完
畢后TCR2UB 由硬件清零。TCR2UB 為0 表明TCCR2 可以寫入新值了。
如果在更新忙標(biāo)志置位的時(shí)候?qū)懮鲜鋈魏我粋€(gè)寄存器都將引起數(shù)據(jù)的破壞,并引發(fā)不必
要的中斷。
讀取TCNT2、OCR2 和TCCR2 的機(jī)制是不同的。讀取TCNT2 得到的是實(shí)際的值,而
OCR2 和TCCR2 則是從暫存寄存器中讀取的。
定時(shí)器/ 計(jì)數(shù)器2 的異步操作(這里還是挺重要的~~
T/C2 工作于異步模式時(shí)要考慮如下幾點(diǎn):
• 警告:在同步和異步模式之間的轉(zhuǎn)換有可能造成TCNT2、OCR2 和TCCR2 數(shù)據(jù)的損
毀。安全的步驟應(yīng)該是:
1. 清零OCIE2 和TOIE2 以關(guān)閉T/C2 的中斷
2. 設(shè)置AS2 以選擇合適的時(shí)鐘源
3. 對TCNT2、OCR2 和TCCR2 寫入新的數(shù)據(jù)
4. 切換到異步模式:等待TCN2UB、OCR2UB 和TCR2UB 清零
5. 清除T/C2 的中斷標(biāo)志
6. 需要的話使能中斷
• 振蕩器最好使用32.768 kHz手表晶振。給TOSC1 提供外部時(shí)鐘,可能會造成T/C2 工
作錯(cuò)誤。系統(tǒng)主時(shí)鐘必須比晶振高4 倍以上。
• 寫TCNT2,OCR2和TCCR2時(shí)數(shù)據(jù)首先送入暫存器,兩個(gè)TOSC1時(shí)鐘正跳變后才鎖
存到對應(yīng)到的寄存器。在數(shù)據(jù)從暫存器寫入目的寄存器之前不能執(zhí)行新的數(shù)據(jù)寫入
操作。3 個(gè)寄存器具有各自獨(dú)立的暫存器,因此寫TCNT2 并不會干擾OCR2 的寫
操作。異步狀態(tài)寄存器ASSR 用來檢查數(shù)據(jù)是否已經(jīng)寫入到目的寄存器。
• 如果要用T/C2 作為MCU 省電模式或擴(kuò)展Standby 模式的喚醒條件,則在TCNT2,
OCR2A和TCCR2A更新結(jié)束之前不能進(jìn)入這些休眠模式,否則MCU可能會在T/C2設(shè)
置生效之前進(jìn)入休眠模式。這對于用T/C2 的比較匹配中斷喚醒MCU 尤其重要,因
為在更新OCR2 或TCNT2 時(shí)比較匹配是禁止的。如果在更新完成之前(OCR2UB為0)MCU 就進(jìn)入了休眠模式,那么比較匹配中斷永遠(yuǎn)不會發(fā)生, MCU 也永遠(yuǎn)無法
喚醒了。
• 如果要用T/C2作為省電模式或擴(kuò)展Standby模式的喚醒條件,必須注意重新進(jìn)入這些
休眠模式的過程。中斷邏輯需要一個(gè)TOSC1 周期進(jìn)行復(fù)位。如果從喚醒到重新進(jìn)入
休眠的時(shí)間小于一個(gè)TOSC1 周期,中斷將不再發(fā)生,器件也無法喚醒。如果用戶懷
疑自己程序是否滿足這一條件,可以采取如下方法:
1. 對TCCR2、TCNT2 或OCR2 寫入合適的數(shù)據(jù)
2. 等待ASSR 相應(yīng)的更新忙標(biāo)志清零
3. 進(jìn)入省電模式或擴(kuò)展Standby 模式
• 若選擇了異步工作模式,T/C2 的 32.768 kHz 振蕩器將一直工作,除非進(jìn)入掉電模式
或 Standby 模式。用戶應(yīng)該注意,此振蕩器的穩(wěn)定時(shí)間可能長達(dá)1 秒鐘。因此,建
議用戶在器件上電復(fù)位,或從掉電/Standby 模式喚醒時(shí)至少等待1 秒鐘后再使用
T/C2。同時(shí),由于啟動(dòng)過程時(shí)鐘的不穩(wěn)定性,喚醒時(shí)所有的T/C2 寄存器的內(nèi)容都可
能不正確,不論使用的是晶體還是外部時(shí)鐘信號。用戶必須重新給這些寄存器賦值。
• 使用異步時(shí)鐘時(shí)省電模式或擴(kuò)展Standby 模式的喚醒過程:中斷條件滿足后,在下一
個(gè)定時(shí)器時(shí)鐘喚醒過程啟動(dòng)。也就是說,在處理器可以讀取計(jì)數(shù)器的數(shù)值之前計(jì)數(shù)
器至少又累加了一個(gè)時(shí)鐘。喚醒后MCU 停止4 個(gè)時(shí)鐘,接著執(zhí)行中斷服務(wù)程序。中
斷服務(wù)程序結(jié)束之后開始執(zhí)行SLEEP 語句之后的程序。
• 從省電模式喚醒之后的短時(shí)間內(nèi)讀取TCNT2 可能返回不正確的數(shù)據(jù)。因?yàn)門CNT2 是
由異步的TOSC 時(shí)鐘驅(qū)動(dòng)的,而讀取TCNT2 必須通過一個(gè)與內(nèi)部I/O 時(shí)鐘同步的寄
存器來完成。同步發(fā)生于每個(gè)TOSC1 的上升沿。從省電模式喚醒后I/O 時(shí)鐘重新激
活,而讀到的TCNT2 數(shù)值為進(jìn)入休眠模式前的值,直到下一個(gè)TOSC1 上升沿的到
來。從省電模式喚醒時(shí)TOSC1 的相位是完全不可預(yù)測的,而且與喚醒時(shí)間有關(guān)。因
此,讀取TCNT2 的推薦序列為:
1. 寫一個(gè)任意數(shù)值到OCR2 或TCCR2
2. 等待相應(yīng)的更新忙標(biāo)志清零
3. 讀TCNT2
• 在異步模式下,中斷標(biāo)志的同步需要3 個(gè)處理器周期加一個(gè)定時(shí)器周期。在處理器可
以讀取引起中斷標(biāo)志置位的計(jì)數(shù)器數(shù)值之前計(jì)數(shù)器至少又累加了一個(gè)時(shí)鐘。輸出比
較引腳的變化與定時(shí)器時(shí)鐘同步,而不是處理器時(shí)鐘。
5)定時(shí)器/ 計(jì)數(shù)器中斷屏蔽寄存器- TIMSK
• Bit 7 – OCIE2: T/C2 輸出比較匹配中斷使能
當(dāng)OCIE2 和狀態(tài)寄存器的全局中斷使能位I 都為"1” 時(shí),T/C2 的輸出比較匹配A 中斷使
能。當(dāng)T/C2 的比較匹配發(fā)生,即TIFR 中的OCF2 置位時(shí),中斷服務(wù)程序得以執(zhí)行。
• Bit 6 – TOIE2: T/C2 溢出中斷使能
當(dāng)TOIE2 和狀態(tài)寄存器的全局中斷使能位I 都為"1” 時(shí),T/C2 的溢出中斷使能。當(dāng)T/C2
發(fā)生溢出,即TIFR 中的TOV2 位置位時(shí),中斷服務(wù)程序得以執(zhí)行。
6)定時(shí)器/ 計(jì)數(shù)器 中斷標(biāo)志寄存器- TIFR


• Bit 7 – OCF2: 輸出比較標(biāo)志 2
當(dāng)T/C2 與OCR2( 輸出比較寄存器2) 的值匹配時(shí),OCF2 置位。此位在中斷服務(wù)程序里
硬件清零,也可以通過對其寫1 來清零。當(dāng)SREG 中的位I、OCIE2 和OCF2 都置位時(shí),
中斷服務(wù)程序得到執(zhí)行。
• Bit 6 – TOV2: T/C2 溢出標(biāo)志
當(dāng)T/C2 溢出時(shí), TOV2 置位。執(zhí)行相應(yīng)的中斷服務(wù)程序時(shí)此位硬件清零。此外, TOV2
也可以通過寫1 來清零。當(dāng)SREG 中的位I、TOIE2 和TOV2 都置位時(shí),中斷服務(wù)程序
得到執(zhí)行。在PWM 模式中,當(dāng)T/C2 在0x00 改變記數(shù)方向時(shí), TOV2 置位。
這里也用到特殊功能寄存器:補(bǔ)充:


好了,現(xiàn)在基本上好了~~累死了
下面就是實(shí)驗(yàn)了,哈哈
4位秒表啊~~~吼吼
先貼張圖片看看那


然后就是Proteus仿真~~~
出了點(diǎn)問題~~整了半天~~哭
個(gè)人認(rèn)為是個(gè)Bug~~你懂得,我以前用51的時(shí)候就有這個(gè)問題,顯示不完整,可能是更新太快了~

評論


技術(shù)專區(qū)

關(guān)閉