新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機入門教程之三---中斷

        AVR單片機入門教程之三---中斷

        作者: 時間:2016-11-23 來源:網絡 收藏
        首先說一下中斷的優點:中斷函數只在中斷觸發源觸發的時候才會執行,其他時間不執行. 如果不使用中斷而且如果要根據某個端口的變化而作相應的函數操作,就必須不斷地查詢端口的信號,而中斷不用,只要端口一有變化,就會系統就會自動進入中斷函數, 我覺得這就是中斷的目的,也是優點.

        然后說一下中斷的使用,要使用AVR的外部中斷,要先進行中斷初始設置(觸發電平上升沿和下降沿的設定),然后開全局中斷,這樣在觸發中斷管腳的時候就會進入中斷處理函數.無論導致引腳電平變化的原因是來自單片機內部還是外部,只要引腳上的電平發生了變化都可以觸發該引腳上的電平變化中斷.

        本文引用地址:http://www.104case.com/article/201611/320343.htm

        AVR單片機,其硬件系統不支持自動實現中斷嵌套的處理。如果在系統設計中,必須使用中斷嵌套處理,則需要由用戶編寫相應的程序,通過軟件設置來實現中斷嵌套的功能。

        如果在初始化中開了總中斷 那么AVR在進去中斷處理函數后會自動把總中斷給關了中斷出來后就會重新開中斷 所以如果不用在中斷里面嵌套另一個中斷 就不用在中斷服務程序里面開總中斷使能。。。

        AVR單片機的中斷優先級只在同時觸發中斷時優先級高的中斷先進行處理,而對于51單片機中低級別的中斷不能打斷高級別的中斷,在AVR單片機中低級別的中斷卻可以打斷高級別的中斷,這是很不一樣的,下面用一個例子來說明一下:

        //T0溢出中斷服務程序
        #pragma interrupt_handler timer0_ovf_isr:10
        void timer0_ovf_isr(void)
        {
        TCNT0 = 0xB4;
        SEI();
        dlygd(0,0);
        dlygd(0,0);
        }

        //T2溢出中斷服務程序
        #pragma interrupt_handler timer2_ovf_isr:5
        void timer2_ovf_isr(void)
        {
        TCNT2 = 0xA0;
        SEI();
        saomiao();
        }

        對于以上兩個時間溢出中斷函數我在中斷程序里面都用了SEI();由于開了總中斷,那么在中斷執行過程中,只要有其他中斷觸發,系統同樣會進入另外的中斷處理函數.

        用JTAG調試了一下 發現只要TCNT0一溢出 就觸發TIMER0的中斷 在中斷的過程中只要TCNT2一溢出 就觸發了TIMER2的中斷 這樣子級別高的中斷打斷低的中斷是沒什么問題啊 但是在TCNT0再次溢出時 還是會觸發TIMER0的中斷 這就很奇怪了 難道中斷級別低的中斷可以中斷級別高的中斷嗎??? 這就對了 在AVR單片機中,低級別的中斷是可以打斷高級別的中斷的,只要總中斷開著.



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 扎赉特旗| 河间市| 桓台县| 龙海市| 玉树县| 鹤岗市| 溧水县| 沂源县| 温州市| 宁海县| 盘锦市| 通州区| 水城县| 铅山县| 原平市| 安陆市| 丹阳市| 蓬溪县| 额尔古纳市| 绥芬河市| 平昌县| 阿城市| 大丰市| 察隅县| 根河市| 招远市| 昭觉县| 城固县| 历史| 平阳县| 六安市| 广东省| 安乡县| 丰都县| 上蔡县| 宁国市| 宽甸| 建水县| 大竹县| 平潭县| 清水河县|