專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)學(xué)習(xí)(六)中斷與定時(shí)器

作者:zww 1988   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月18日   【字體:
中斷的概念
  • M16的外部中斷
  • 定時(shí)器的概念
  • M16的定時(shí)器
  • 中斷方式使用定時(shí)器
  • 中斷概念

    一、在程序運(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)行

     
    一、M16具有3個(gè)外部中斷

    1、M16具有3個(gè)外部中斷

    2、INT0、INT1:

       1):支持4種觸發(fā)模式,與CPU時(shí)鐘是同步觸發(fā)

    3、INT2

       1)支持2種觸發(fā)模式、與CPU時(shí)鐘是異步觸發(fā)

    二、中斷相關(guān)庫函數(shù)的頭文件

    1、 avr/interrupt.h

    三、中斷服務(wù)程序

    SIGNAL(SIG_INTERRUPT0)

    {

       //此處添加中斷服務(wù)代碼

    四、中斷有關(guān)的寄存器

    1、MCUCR

    2、MCUCSR

    3、GICR

    //ATmega16 技術(shù)文檔



    由:The External interrupt are triggered by the INT0 ,INT1 and INT2 pins.說明外部中斷是通過這3個(gè)腳進(jìn)行觸發(fā)?聪聢D


    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 of generating a software interrupt.這個(gè)特征可提供一個(gè)可發(fā)生軟中斷的方式。但對與初學(xué)者可以不用理解呵呵。

    上圖不明顯但是可以看出高四位 是灰色的是用于其他用途。  ISC11  ISC10 是配置中斷1的觸發(fā)方式。

    ISC01   ISC00 這兩位是配置中端0的觸發(fā)方式。

    外部中斷有個(gè)三個(gè)INT1 INT0   INT2

    看看中斷1的控制寄存器 MCUCR   control  register

    ISC11  ISC10  這兩位組合4中方式申請中斷  0 0 低電平發(fā)生中斷申請  也就是只要INT1引腳上有低電平時(shí)候就申請中斷。一般不采用因?yàn)榉(wěn)定性和可靠性太差。(估計(jì)是低電平不停申請)

      1 的時(shí)候任意的邏輯電平變化INT1 發(fā)生一個(gè)中斷申請。(就是說上升,下降都產(chǎn)生)

      0 一個(gè)falling edge  下降沿  發(fā)生一個(gè)中斷申請

      1 一個(gè)rising edge 上升沿  發(fā)生一個(gè)中斷申請

    我們用的比較多的是后兩種方式

    MCUCR 這個(gè)寄存器有8位就是配置INT0和INT1的觸發(fā)方式。

    中端0的和1是一樣所以不再解釋了哦,如下圖。

    下一個(gè)寄存器是MCUCSR 

     這個(gè)是控制和狀態(tài)寄存器(MCU CONTROL AND STATUS REGISTER MCUCSR) 它的第6位用來配置中端2 INT2的觸發(fā)方式如下圖



    看datasheet的解釋如下圖

     



     


    這個(gè)異步外部中斷2 是外部中斷2腳激活 SREG 1-bit and 相應(yīng)的中斷屏蔽位GICR 設(shè)置。加入ISC2寫 0,一個(gè)falling edge (下降沿) 開INT2  激活中斷, IF ISC2 是寫 1,是一個(gè) rising edge (上升沿) 開INT2 激活中斷, INT2的邊沿觸發(fā)方式(registered 注冊)是異步的。跟外部中斷2有關(guān)系的



     

    第三個(gè)寄存器是通用外部中斷控制寄存器


    這個(gè)寄存器的高三位用來使能外部中斷請求 INT1  INT0 INT2 只有這三位相應(yīng)位置1  比如使用INT0 必須把INT0 這個(gè)位寫1,表示這中斷打開了。參看下面2圖的說明

     

     

     

    第四個(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  和中斷1.所以我們學(xué)習(xí)也就只是學(xué)習(xí)中斷0和中斷1.還有就是中斷庫函數(shù)的頭文件 avr/interrupt.h  用include 包含進(jìn)去。然后如果使用中斷必須寫一個(gè)中斷服務(wù)程序中斷服務(wù)程序一般是 SIGNAL(SIG_INTERRUPT0){}

    這是中斷0的,這個(gè)在哪查詢到的呢?在AVR 單片機(jī)GCC程序設(shè)計(jì)這本電子書,在第四章 功能模塊編程示例 4.1首先就是中斷服務(wù)程序看下圖。

    你看signame  中斷類型,SIG_INTERRUPT0   就是外部中斷 INT0的。  我們一般用第一個(gè)就可以,SIGNAL(signame)他們兩個(gè)區(qū)別不是很大,所以我們用第一個(gè)就可以?聪聢D示例



    在新版的AVR GCC 中avr/signal.h 以后就不用包含了,已經(jīng)沒有了。所以只包含avr/interrupt.h就可以了。

    跟中斷有關(guān)的寄存器剛才說過了有(MCUCR/MCUCSR/GICR    其中還有一般用不到的是GIFR 中斷標(biāo)志寄存器)。

    外部中斷的使用步驟

    一、第一步:包含頭文件

      1、#include

    二、第二步:設(shè)置中斷觸發(fā)方式、

      1、任意邏輯電平變化:MCUCR |= (1<<ISC10);

      2、下降沿觸發(fā):MCUCR |= (1<<ISC10)|(1<<ISC11);

      3、上升沿觸發(fā):MCUCR |= (1<<ISC11);

    三、第3步:使能響應(yīng)相應(yīng)外部中斷

      1、GICR |= (1<<INT0);

    四、第4步:使能全局中斷

      1、sei();

    五、第五步:編寫中斷服務(wù)程序

    SIGNAL(SIG_INTERRUPT0){}

    根據(jù)以上步驟我們編寫一個(gè)外部中斷0的程序

    第一步打開AVR Studio    點(diǎn)擊New Project


    選AVR GCC 起個(gè)名字lesson6 點(diǎn)擊NEXT



    點(diǎn)擊 JTAG ICE 單擊Finish


    首先對所有的AVR 的程序都必須包含的一個(gè)頭文件#include





    INT0 (PD2)接在 K1上,它在常態(tài)下屬于低電平因?yàn)橛幸粋(gè)10K的下拉電阻。按下接通電源。

    而對于INT1(PD3) 是在 K2上它在常態(tài)下屬于高電平 。按下到地了低電平。



    第二個(gè)按鈕是編譯后全速運(yùn)行。

    #include

    #include

     

    int main(void){

             DDRA |= (1<<3);

             DDRB = 0XFF;

             MCUCR |= (1<<ISC11) | (1<<ISC00) | (1<<ISC00);//設(shè)置中斷觸發(fā)方式

             GICR |= (1<< INT0) |(1<<INT1);//使能中斷0 和1

             sei();//開啟全局中斷

             while(1);

    }

    SIGNAL(SIG_INTERRUPT0){

             PORTB = 0;//關(guān)閉所有LED

             PORTB |= (1<<0);//LED0 發(fā)光

             PORTA |= (1<<3);//蜂鳴器響

    }

    SIGNAL(SIG_INTERRUPT1){

             PORTB =0;//關(guān)閉所有LED

             PORTB |=(1<<1);//LED1發(fā)光

             PORTA &= ~(1<<3);//蜂鳴器關(guān)閉

    }

    以上是外部中斷就將這么多下面講定時(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ù)器的模型

         1、1個(gè)8位長度計(jì)數(shù)寄存器、可以對其進(jìn)行讀寫

    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í)?

             1、給計(jì)數(shù)寄存器定初值n0

             2、給時(shí)鐘輸入端口輸入一個(gè)頻率精確的方波方波周期為t0

             3、計(jì)數(shù)器計(jì)數(shù)到256時(shí)定時(shí)器溢出,時(shí)間間隔為:其實(shí)就是255到下一個(gè)就溢出又都成0了

                                                           T=(256-n0)*t0

                            no 是設(shè)定的初值

             4、定時(shí)器溢出時(shí)可以產(chǎn)生中斷  當(dāng)然這個(gè)中斷也需要編寫一個(gè)中斷服務(wù)程序

    當(dāng)然定時(shí)器的最簡單的應(yīng)用就是溢出方式的應(yīng)用。ATmega16 具有3個(gè)定時(shí)器 0 、1 、2定時(shí)器0是屬于功能最簡單的定時(shí)器。

    三、M16的定時(shí)器0(定時(shí)器0是一個(gè)功能最簡單的定時(shí)器)

             1、8位定時(shí)器

            2、高級(jí)功能具有PWM功能 輸出比較功能還有輸入捕獲功能對一些輸入事件進(jìn)行計(jì)時(shí)。 四、定時(shí)器0相關(guān)寄存器

             1、T/C 控制寄存器------TCCR0

             2、設(shè)置時(shí)鐘源頻率

     

    技術(shù)文檔:

     

    Timer/Counter0 is a general purpose, single compare unit, 8-bit Tim

    main features are:

    ?? Single Compare Unit Counter  單通道計(jì)數(shù)

    ?? 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)  溢出合比較匹配中斷源(定時(shí)器的2個(gè)中斷源)我們只講溢出中斷 TOV0 .

    8Timer/Counter0  with PWM Timer/Counter0 是一個(gè)(一般用途)通用單通道 8位定時(shí)器、比較器模塊。這個(gè)模塊的主要特征是:

    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è)是溢出中斷  和一個(gè)比較匹配中斷  而比較匹配中斷一般應(yīng)用于PWM 應(yīng)用時(shí)使用。這里只說下TOV0 就是溢出中斷。

    比較匹配中斷一般應(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)增  256就溢出

     

    第三個(gè)寄存器叫做輸出比較寄存器 如下圖  OCR0 這個(gè)也是跟PWM功能有關(guān)的。






    第四個(gè)叫做TIMSK  中斷屏蔽寄存器如下圖它的第1位和第0位可以用來使能輸出比較匹配中斷和溢出中斷我們只關(guān)心   TOIE0  溢出定時(shí)器溢出中斷。

     

    第五個(gè)寄存器是  中斷標(biāo)志寄存器 TIFR  它的第1位第0位是輸出比較匹配標(biāo)志  和溢出標(biāo)志我們使用中斷不用關(guān)心,如果查詢模式的話,我們需要不停查詢TOV0來判斷一下TC0有沒有達(dá)到溢出

    列舉一下TC0相關(guān)相關(guān)寄存器

    定時(shí)器0相關(guān)寄存器

     

    T/C 控制寄存器 ----TCCR0

    設(shè)置時(shí)鐘頻率

     

    T/C寄存器  TCNT0

    計(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 首先選一個(gè)合適的分頻比例 8 分頻就是2MHZ

    2MHZ 就是0.5 微妙 ,所以定100微妙時(shí)長的話,計(jì)數(shù)200次所以先賦初值 TCNT0 =55   55+200 =255 溢出了就是時(shí)長100微妙。

    以下代碼查詢方式使用定時(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



     

     

    關(guān)閉窗口

    相關(guān)文章