中斷概念
一、在程序運(yùn)行期間,發(fā)生非預(yù)期的緊急事件
1、通常是為了避免查詢方式的程序設(shè)計(jì)(它低效因?yàn)橐恢辈樵,死循環(huán)一直不停查詢)
2、用的最多的是外部中斷與定時(shí)器中斷(主要產(chǎn)生一些精確地延時(shí),省去了CPU延時(shí)CPU延時(shí)就不能干其他事情了所以可以提高CPU效率)
3、外部中斷:按鍵程序
4、定時(shí)器中斷:定時(shí)與循環(huán)掃描應(yīng)用場合
二、中斷服務(wù)程序
1、中斷發(fā)生時(shí),主程序暫停,跳轉(zhuǎn)到中斷服務(wù)程序,稱為“相應(yīng)中斷”
2、執(zhí)行完畢后返回主程序繼續(xù)運(yùn)行
1、M16具有3個(gè)外部中斷
2、INT0、INT1:
3、INT2
二、中斷相關(guān)庫函數(shù)的頭文件
1、 avr/interrupt.h
三、中斷服務(wù)程序
SIGNAL(SIG_INTERRUPT0)
{
}
四、中斷有關(guān)的寄存器
1、MCUCR
2、MCUCSR
3、GICR
//ATmega16 技術(shù)文檔
由:The External interrupt are triggered by the INT0
,INT1
INT0/INT1/INT2 分別對應(yīng)單片機(jī)的16、17、3腳不過在開發(fā)過程中INT2不常用。
observe that ,if enabled the interrupts will trigger even if the INT0..2pins are configured as outputs.可得即使中斷引腳配置成輸出,只要使能了中斷,電平發(fā)生了變化就會(huì)觸發(fā)。
the feature provides a way
上圖不明顯但是可以看出高四位 是灰色的是用于其他用途。
ISC01
外部中斷有個(gè)三個(gè)INT1 INT0
看看中斷1的控制寄存器
MCUCR
ISC11
0
1
1
我們用的比較多的是后兩種方式
MCUCR 這個(gè)寄存器有8位就是配置INT0和INT1的觸發(fā)方式。
中端0的和1是一樣所以不再解釋了哦,如下圖。
下一個(gè)寄存器是MCUCSR
這個(gè)異步外部中斷2 是外部中斷2腳激活 SREG 1-bit and 相應(yīng)的中斷屏蔽位GICR 設(shè)置。加入ISC2寫
0,一個(gè)falling edge (下降沿) 開INT2
第三個(gè)寄存器是通用外部中斷控制寄存器
這個(gè)寄存器的高三位用來使能外部中斷請求 INT1
第四個(gè)寄存器是中斷標(biāo)志寄存器對于初學(xué)者一般用不到
當(dāng)外部中斷發(fā)生的時(shí)候相應(yīng)的外部中斷寄存器就會(huì)置1,被單片機(jī)內(nèi)部置1,我們可以將他讀出來,但是一般不用去讀這個(gè)標(biāo)志位,自動(dòng)就會(huì)進(jìn)入中斷服務(wù)程序。所以ATmega16
的三個(gè)外部中斷主要就樣子。而我們用的比較多的就是中斷0
這是中斷0的,這個(gè)在哪查詢到的呢?在AVR 單片機(jī)GCC程序設(shè)計(jì)這本電子書,在第四章 功能模塊編程示例 4.1首先就是中斷服務(wù)程序看下圖。
你看signame
在新版的AVR GCC 中avr/signal.h
以后就不用包含了,已經(jīng)沒有了。所以只包含avr/interrupt.h就可以了。
跟中斷有關(guān)的寄存器剛才說過了有(MCUCR/MCUCSR/GICR
外部中斷的使用步驟
一、第一步:包含頭文件
二、第二步:設(shè)置中斷觸發(fā)方式、
三、第3步:使能響應(yīng)相應(yīng)外部中斷
四、第4步:使能全局中斷
五、第五步:編寫中斷服務(wù)程序
SIGNAL(SIG_INTERRUPT0){}
根據(jù)以上步驟我們編寫一個(gè)外部中斷0的程序
第一步打開AVR
Studio
選AVR GCC 起個(gè)名字lesson6
首先對所有的AVR 的程序都必須包含的一個(gè)頭文件#include
INT0 (PD2)接在 K1上,它在常態(tài)下屬于低電平因?yàn)橛幸粋(gè)10K的下拉電阻。按下接通電源。
而對于INT1(PD3) 是在 K2上它在常態(tài)下屬于高電平 。按下到地了低電平。
#include
#include
int main(void){
}
SIGNAL(SIG_INTERRUPT0){
}
SIGNAL(SIG_INTERRUPT1){
}
以上是外部中斷就將這么多下面講定時(shí)器、一般單片機(jī)分為8位和16位定時(shí)器兩種,ATmega 16 有2個(gè) TC0 TC2 8位及一個(gè)16位的TC1 。2種功能定時(shí)、計(jì)數(shù)、實(shí)際就是一個(gè)計(jì)數(shù)的功能講值保存在計(jì)數(shù)寄存器里面。
---------------------------------------------------------------------------
定時(shí)器的概念
ATmega 16具有3個(gè)定時(shí)器 0 1 2 。
一、8位定時(shí)/計(jì)數(shù)器的模型
2、1個(gè)時(shí)鐘輸入端口,計(jì)數(shù)寄存器對時(shí)鐘輸入端口的時(shí)鐘脈沖個(gè)數(shù)進(jìn)行加1計(jì)數(shù),即每來一個(gè)時(shí)鐘脈沖,寄存器的數(shù)值自加1
理解:計(jì)數(shù)功能保存在計(jì)數(shù)寄存器里面。
二、如何實(shí)現(xiàn)精確定時(shí)?
當(dāng)然定時(shí)器的最簡單的應(yīng)用就是溢出方式的應(yīng)用。ATmega16 具有3個(gè)定時(shí)器 0 、1 、2定時(shí)器0是屬于功能最簡單的定時(shí)器。
三、M16的定時(shí)器0(定時(shí)器0是一個(gè)功能最簡單的定時(shí)器)
技術(shù)文檔:
Timer/Counter0 is a general purpose, single compare unit, 8-bit Tim
main features are:
?? Single Compare Unit Counter
?? Clear Timer on Compare Match (Auto Reload) 比較匹配發(fā)生時(shí)清除定時(shí)器(自動(dòng)加載)
?? Glitch-free, Phase Correct Pu lse Width Modulator (PWM) 無干擾脈沖,相位正確的PWM
?? Frequency Generator 頻率發(fā)生器
?? External Event Counter 外部事件計(jì)數(shù)
?? 10-bit Clock Prescaler 10位的時(shí)鐘分頻器(值得注意可以把單片機(jī)分頻得到時(shí)間長點(diǎn)的定時(shí))
?? Overflow and Compare Match Interrupt Sources (TOV0 and
OCF0)
8位Timer/Counter0
1、單通道比較計(jì)數(shù)器
2、清除比較匹配發(fā)生(自動(dòng)加載)就是比較匹配發(fā)生時(shí)清除定時(shí)器(自動(dòng)加載)這個(gè)初學(xué)者不用關(guān)心
3、釋放干擾脈沖,相位改正脈沖寬度調(diào)制器(PWM)就是無干擾脈沖相位正確的PWM
4、頻率發(fā)生器
5、外部事件計(jì)數(shù)器
6、10位時(shí)鐘預(yù)分頻器(比如單片機(jī)晶振16MHZ可以進(jìn)行一些預(yù)分頻然后提供時(shí)鐘給定時(shí)器)
7、溢出和比較匹配中斷源(TOVO
and OCFO)就是2個(gè)中斷源一個(gè)是溢出中斷
比較匹配中斷一般應(yīng)用于PWM
應(yīng)用時(shí)使用。這里只說下TOV0
就是溢出中斷。
和定時(shí)器0 有關(guān)的寄存器我們看8位定時(shí)/計(jì)數(shù)器寄存器的說明。
首先它有一個(gè)控制寄存器 TCCR0
Timer/Counter Control
Register – TCCR0
它的從第7位到第3位都是跟PWM有關(guān)的,這里我們先不去講解,而 0 1 2 這3位是非常重要的,看下圖,可以通過選擇這3位可以對CPU時(shí)鐘進(jìn)行預(yù)分頻然后提供給定時(shí)器0使用。
其實(shí)經(jīng)過分頻這個(gè)定時(shí)的時(shí)間長度跨度就非常大了。比晶振頻率慢了當(dāng)然時(shí)間長了
第2個(gè)寄存器叫TCNT0
如下圖、這個(gè)T/C寄存器
TCNT0
這就是計(jì)數(shù)寄存器,這個(gè)寄存器的數(shù)值呢,每來一個(gè)定時(shí)器的時(shí)鐘脈沖數(shù)值就自動(dòng)增1
第三個(gè)寄存器叫做輸出比較寄存器
如下圖
第四個(gè)叫做TIMSK
第五個(gè)寄存器是
列舉一下TC0相關(guān)相關(guān)寄存器
定時(shí)器0相關(guān)寄存器
T/C 控制寄存器 ----TCCR0
設(shè)置時(shí)鐘頻率
T/C寄存器
計(jì)數(shù)寄存器
T/C 中斷屏蔽寄存器 ----TIMSK
需要使用溢出中斷時(shí)
T/C 中斷標(biāo)志寄存器 ---TIFR
查詢是否溢出
下面演示下定時(shí)器0溢出方式 用查詢模式使用步驟
第一步:設(shè)置TC寄存器初值
TCNT0 =55
第二步:開啟時(shí)鐘,同時(shí)TC0啟動(dòng)
TCCR0 |= (1<<CS01);
第三步:查詢TIFR 寄存器的TOV0位
while(!(TIFR & (1<<TOV0)));
當(dāng)然要先設(shè)置時(shí)鐘頻率TCNR0 對時(shí)鐘預(yù)分頻如 要100us
2MHZ 就是0.5 微妙 ,所以定100微妙時(shí)長的話,計(jì)數(shù)200次所以先賦初值 TCNT0
=55
以下代碼查詢方式使用定時(shí)器0 的代碼
當(dāng)然還有中斷模式,中斷模式使用稍微復(fù)雜一點(diǎn)
第一步:包含中斷函數(shù)頭文件
#include
第二步:設(shè)置TC寄存器初值
TCNT0 =55;
第三步:使能TC0溢出中斷
TIMSK |= (1<<TOIE0);
第四步:編寫TCO溢出中斷服務(wù)程序
SIGNAL(SIG_SIG_OVERFLOW0)
{//此添加中斷服務(wù)程序代碼}
第五步:開啟時(shí)鐘,同時(shí)TC0啟動(dòng)
TCCR0 |= (1<<CS01);
第六步:使能全局中斷
sei();
看代碼用中斷實(shí)現(xiàn)定時(shí)器0