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