找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6327|回復: 1
打印 上一主題 下一主題
收起左側

avr單片機外部中斷0,1,2初始化配置及說明

[復制鏈接]
跳轉到指定樓層
樓主
ID:185578 發(fā)表于 2017-4-2 15:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  ATmega16提供3個外部中斷,分別由INT0、INT1和INT2引腳觸發(fā)。
  需要注意的是,如果將ATmega16設置為允許外部中斷,則即使把INT0、INT1和INT2引腳設置為輸出方式,外部中斷仍然會被觸發(fā)。外部中斷可選擇采用上升沿觸發(fā)、下降沿觸發(fā)和低電平觸發(fā)(INT2中斷只能采用沿觸發(fā)方式。
#include<iom16v.h>
#include<macros.h>
/*1.狀態(tài)寄存器SREG



bit7      bit6      bit5      bit4      bit3      bit2      bit1      bit0
  I        T        H        S        V        N        Z        C
I:全局中斷使能位。
    在I置位后,單獨的中斷使能由不同的中斷寄存器控制。若I為0,則禁止中斷。

MCU 控制寄存器- MCUCR        MCU 控制寄存器包含中斷觸發(fā)控制位與通用 MCU 功能
Bit        7      6    5    4    3    2    1    0
            SM2    SE    SM1  SM0  ISC11 ISC10 ISC01 ISC00
外部中斷 1 由引腳 INT1 激發(fā),如果 SREG 寄存器的 I 標志位和相應的中斷屏蔽位置位的話。在檢測邊沿前 MCU 首先采樣 INT1 引腳上的電平。如果選擇了邊沿觸發(fā)方式或電平變化觸發(fā)方式,那么持續(xù)時間大于一個時鐘周期的脈沖將觸發(fā)中斷,過短的脈沖則不能保證觸發(fā)中斷。如果選擇低電平觸發(fā)方式,那么低電平必須保持到當前指令執(zhí)行完成。
SE:MCU休眠使能位
SM1~SM0:MCU休眠模式選擇
    SM2            SM1              SM0                  休眠模式
      0              0                0                    空閑
      0              0                1              ADC 噪聲抑制模式
      0              1                0                  掉電模式
      0              1                1                  省電模式
      1              0                0                    保留
      1              0                1                    保留
      1              1                0              Standby(1) 模式
      1              1                1            擴展Standby(1) 模式

                          ISC11 ISC10 說明
                            0      0    INT1 為低電平時產生中斷請求
                            0      1    INT1 引腳上任意的邏輯電平變化都將引發(fā)中斷
                            1      0    INT1 的下降沿產生異步中斷請求
                            1      1    INT1 的上升沿產生異步中斷請求
外部中斷 0 由引腳 INT0 激發(fā),如果 SREG 寄存器的 I 標志位和相應的中斷屏蔽位置位的話。在檢測邊沿前 MCU 首先采樣 INT0 引腳上的電平。如果 選擇了邊沿觸發(fā)方式或電平變化觸發(fā)方式,那么持續(xù)時間大于一個時鐘周期的脈沖將觸發(fā)中斷,過短的脈沖則不能保證觸發(fā)中斷。如果選擇低電平觸發(fā)方式,那么低電平必須保持到當前指令執(zhí)行完成
                          ISC01  ISC00 說明
                            0        0    INT0 為低電平時產生中斷請求
                            0        1    INT0 引腳上任意的邏輯電平變化都將引發(fā)中斷
                            1        0    INT0 的下降沿產生異步中斷請求
                            1        1    INT0 的上升沿產生異步中斷請求
*/
/*MCU 控制與狀態(tài)寄存器-MCUCSR-
  Bit        7      6    5      4      3      2    1      0
              JTD    ISC2  –    JTRF WDRF  BORF  EXTRF PORF
                            * Bit 6 – ISC2: 中斷 2 觸發(fā)方式控制
                            異步外中斷 2 由外部引腳 INT2 激活,如果 SREG 寄存器的 I 標志和 GICR 寄存器相應的
                            中斷屏蔽位置位的話。若 ISC2 寫 0 , INT2 的下降沿激活中斷。若 ISC2 寫 1 , INT2 的上
                            升沿激活中斷。 INT2 的邊沿觸發(fā)方式是異步的。只要 INT2 引腳上產生寬度大于50ns
        (1s=1000ms,1 ms=1000μs,1μs=1000ns )
                            所示數(shù)據(jù)的脈沖就會引發(fā)中斷。若選擇了低電平中斷,低電平必須保持到當前指令完成,
                            然后才會產生中斷。而且只要將引腳拉低,就會引發(fā)中斷請求。改變 ISC2 時有可能發(fā)生
                            中斷。因此建議首先在寄存器 GICR 里清除相應的中斷使能位 INT2 ,然后再改變ISC2。
                            最后,不要忘記在重新使能中斷之前通過對 GIFR 寄存器的相應中斷標志位 INTF2 寫 '1’
                            使其清零。
*/
/*
通用中斷控制寄存器- GICR
                            Bit        7      6    5      4      3      2      1      0
                                        INT1  INT0 INT2    –    –      –    IVSEL    IVCE
                            * Bit 7 – INT1: 使能外部中斷請求 1
                            當 INT1 為 '1’ ,而且狀態(tài)寄存器SREG 的 I 標志置位,相應的外部引腳中斷就使能了。
                            MCU通用控制寄存器– MCUCR的中斷敏感電平控制1位 1/0 (ISC11與ISC10)決定中斷是
                            由上升沿、下降沿,還是 INT1 電平觸發(fā)的。只要使能,即使 INT1 引腳被配置為輸出,
                            只要引腳電平發(fā)生了相應的變化,中斷可將產生。
                            * Bit 6 – INT0: 使能外部中斷請求 0
                            當 INT0 為 '1’ ,而且狀態(tài)寄存器SREG 的 I 標志置位,相應的外部引腳中斷就使能了。
                            MCU通用控制寄存器– MCUCR的中斷敏感電平控制0位 1/0 (ISC01與ISC00)決定中斷是
                            由上升沿、下降沿,還是 INT0 電平觸發(fā)的。只要使能,即使 INT0 引腳被配置為輸出,
                            只要引腳電平發(fā)生了相應的變化,中斷可將產生。
                          * Bit 5 – INT2: 使能外部中斷請求 2
                            當 INT2 為 '1’ ,而且狀態(tài)寄存器SREG 的 I 標志置位,相應的外部引腳中斷就使能了。
                          MCU通用控制寄存器– MCUCR 的中斷敏感電平控制2位 1/0 (ISC2與ISC2)決定中斷是由
                          上升沿、下降沿,還是 INT2 電平觸發(fā)的。只要使能,即使 INT2 引腳被配置為輸出,只
                          要引腳電平發(fā)生了相應的變化,中斷可將產生

*/
/*
通用中斷標志寄存器- GIFR
                            Bit        7      6    5      4    3      2    1      0
                                      INTF1 INTF0 INTF2  –    –    –    –    –
                          * Bit 7 – INTF1: 外部中斷標志 1
                          INT1引腳電平發(fā)生跳變時觸發(fā)中斷請求,并置位相應的中斷標志INTF1。如果SREG 的位
                          I以及GICR寄存器相應的中斷使能位INT1為”1” ,MCU即跳轉到相應的中斷向量。進入中
                          斷服務程序之后該標志自動清零。此外,標志位也可以通過寫入 ”0” 來清零。
                          * Bit 6 – INTF0: 外部中斷標志 0
                          INT0引腳電平發(fā)生跳變時觸發(fā)中斷請求,并置位相應的中斷標志INTF0。如果SREG 的位
                          I以及GICR寄存器相應的中斷使能位INT0為”1” ,MCU即跳轉到相應的中斷向量。進入中
                          斷服務程序之后該標志自動清零。此外,標志位也可以通過寫入 ”0” 來清零。
                          * Bit 5 – INTF2: 外部中斷標志 2
                          INT2引腳電平發(fā)生跳變時觸發(fā)中斷請求,并置位相應的中斷標志INTF2。如果SREG 的位
                          I以及GICR寄存器相應的中斷使能位INT2為”1” ,MCU即跳轉到相應的中斷向量。進入中
                          斷服務程序之后該標志自動清零。此外,標志位也可以通過寫入 ”0” 來清零。注意,當
                          INT2中斷禁用進入某些休眠模式時,該引腳的輸入緩沖將禁用。這會導致INTF2標志設置
                          信號的邏輯變化

*/
//外部中斷0向量端口
#pragma interrupt_handler INTER_0:iv_INT0
//外部中斷1向量端口
#pragma interrupt_handler INTER_1:iv_INT1
//外部中斷2向量端口        
#pragma interrupt_handler INTER_2:iv_INT2
void INTER_init_0(unsigned char a)//a取值0-3
{
switch(a)
{
case 0:MCUCR&=~(1<<ISC01);MCUCR&=~(1<<ISC00);break;//INT0 為低電平時產生中斷請求
case 1:MCUCR&=~(1<<ISC01);MCUCR|=1<<ISC00;break;// INT0 引腳上任意的邏輯電平變化都將引發(fā)中斷
case 2:MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//INT0 的下降沿產生異步中斷請求
case 3:MCUCR|=1<<ISC01;MCUCR|=1<<ISC00;break;//INT0 的上升沿產生異步中斷請求
default : MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//設置錯誤時,下降沿產生異步中斷請求
}
GICR|=(1<<INT0);//使能外部中斷INT0
GIFR&=~(1<<INTF0);//清零中斷標志
SREG|=0x80;//使能全局中斷
}
void INTER_init_1(unsigned char a)//a取值0-3
{
switch(a)
{
case 0:MCUCR&=~(1<<ISC11);MCUCR&=~(1<<ISC10);break;//INT1 為低電平時產生中斷請求
case 1:MCUCR&=~(1<<ISC11);MCUCR|=1<<ISC10;break;// INT1 引腳上任意的邏輯電平變化都將引發(fā)中斷
case 2:MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//INT1 的下降沿產生異步中斷請求
case 3:MCUCR|=(1<<ISC11)|(1<<ISC10);break;//INT1 的上升沿產生異步中斷請求
default : MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//設置錯誤時,下降沿產生異步中斷請求
}
GICR|=(1<<INT1);//使能外部中斷INT1
GIFR&=~(1<<INTF1);//清零中斷標志
SREG|=0x80;//使能全局中斷
}
void INTER_init_2(unsigned char a)
{
if(a)
MCUCSR|=(1<<ISC2)//上升沿觸發(fā);
else
MCUCSR&=~(1<<ISC2)//下降沿觸發(fā);
GICR|=(1<<INT2);//使能INT2。
GIFR&=~(1<<INTF2);//清零中斷標志
SREG|=0x80;//使能全局中斷
}
void INTER_0(void)
{
//add your code here!
}
void INTER_1(void)
{
//add your code here!
}
void INTER_2(void)
{
//add your code here!
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:259500 發(fā)表于 2017-12-10 15:48 | 只看該作者
沒看太懂誒!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表