<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        AVR單片機學習(六)中斷與定時器

        作者:zww 1988   來源:本站原創   點擊數:  更新時間:2014年04月18日   【字體:
        中斷的概念
      2. M16的外部中斷
      3. 定時器的概念
      4. M16的定時器
      5. 中斷方式使用定時器
      6. 中斷概念

        一、在程序運行期間,發生非預期的緊急事件

        1、通常是為了避免查詢方式的程序設計(它低效因為一直查詢,死循環一直不停查詢)

        2、用的最多的是外部中斷與定時器中斷(主要產生一些精確地延時,省去了CPU延時CPU延時就不能干其他事情了所以可以提高CPU效率)

        3、外部中斷:按鍵程序

        4、定時器中斷:定時與循環掃描應用場合

        二、中斷服務程序

        1、中斷發生時,主程序暫停,跳轉到中斷服務程序,稱為“相應中斷”

        2、執行完畢后返回主程序繼續運行

         
        一、M16具有3個外部中斷

        1、M16具有3個外部中斷

        2、INT0、INT1:

           1):支持4種觸發模式,與CPU時鐘是同步觸發

        3、INT2

           1)支持2種觸發模式、與CPU時鐘是異步觸發

        二、中斷相關庫函數的頭文件

        1、 avr/interrupt.h

        三、中斷服務程序

        SIGNAL(SIG_INTERRUPT0)

        {

           //此處添加中斷服務代碼

        四、中斷有關的寄存器

        1、MCUCR

        2、MCUCSR

        3、GICR

        //ATmega16 技術文檔



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


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

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

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

        外部中斷有個三個INT1 INT0   INT2

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

        ISC11  ISC10  這兩位組合4中方式申請中斷  0 0 低電平發生中斷申請  也就是只要INT1引腳上有低電平時候就申請中斷。一般不采用因為穩定性和可靠性太差。(估計是低電平不停申請)

          1 的時候任意的邏輯電平變化INT1 發生一個中斷申請。(就是說上升,下降都產生)

          0 一個falling edge  下降沿  發生一個中斷申請

          1 一個rising edge 上升沿  發生一個中斷申請

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

        MCUCR 這個寄存器有8位就是配置INT0和INT1的觸發方式。

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

        下一個寄存器是MCUCSR 

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



        看datasheet的解釋如下圖

         



         


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



         

        第三個寄存器是通用外部中斷控制寄存器


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

         

         

         

        第四個寄存器是中斷標志寄存器對于初學者一般用不到



        當外部中斷發生的時候相應的外部中斷寄存器就會置1,被單片機內部置1,我們可以將他讀出來,但是一般不用去讀這個標志位,自動就會進入中斷服務程序。所以ATmega16 的三個外部中斷主要就樣子。而我們用的比較多的就是中斷0  和中斷1.所以我們學習也就只是學習中斷0和中斷1.還有就是中斷庫函數的頭文件 avr/interrupt.h  用include 包含進去。然后如果使用中斷必須寫一個中斷服務程序中斷服務程序一般是 SIGNAL(SIG_INTERRUPT0){}

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

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



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

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

        外部中斷的使用步驟

        一、第一步:包含頭文件

          1、#include

        二、第二步:設置中斷觸發方式、

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

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

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

        三、第3步:使能響應相應外部中斷

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

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

          1、sei();

        五、第五步:編寫中斷服務程序

        SIGNAL(SIG_INTERRUPT0){}

        根據以上步驟我們編寫一個外部中斷0的程序

        第一步打開AVR Studio    點擊New Project


        選AVR GCC 起個名字lesson6 點擊NEXT



        點擊 JTAG ICE 單擊Finish


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





        INT0 (PD2)接在 K1上,它在常態下屬于低電平因為有一個10K的下拉電阻。按下接通電源。

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



        第二個按鈕是編譯后全速運行。

        #include

        #include

         

        int main(void){

                 DDRA |= (1<<3);

                 DDRB = 0XFF;

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

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

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

                 while(1);

        }

        SIGNAL(SIG_INTERRUPT0){

                 PORTB = 0;//關閉所有LED

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

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

        }

        SIGNAL(SIG_INTERRUPT1){

                 PORTB =0;//關閉所有LED

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

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

        }

        以上是外部中斷就將這么多下面講定時器、一般單片機分為8位和16位定時器兩種,ATmega 16 有2個 TC0 TC2 8位及一個16位的TC1 。2種功能定時、計數、實際就是一個計數的功能講值保存在計數寄存器里面。

         

        ---------------------------------------------------------------------------

        定時器的概念  

        ATmega 16具有3個定時器 0 1 2 。

        一、8位定時/計數器的模型

             1、1個8位長度計數寄存器、可以對其進行讀寫

        2、1個時鐘輸入端口,計數寄存器對時鐘輸入端口的時鐘脈沖個數進行加1計數,即每來一個時鐘脈沖,寄存器的數值自加1

        理解:計數功能保存在計數寄存器里面。

        二、如何實現精確定時?

                 1、給計數寄存器定初值n0

                 2、給時鐘輸入端口輸入一個頻率精確的方波方波周期為t0

                 3、計數器計數到256時定時器溢出,時間間隔為:其實就是255到下一個就溢出又都成0了

                                                               T=(256-n0)*t0

                                no 是設定的初值

                 4、定時器溢出時可以產生中斷  當然這個中斷也需要編寫一個中斷服務程序

        當然定時器的最簡單的應用就是溢出方式的應用。ATmega16 具有3個定時器 0 、1 、2定時器0是屬于功能最簡單的定時器。

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

                 1、8位定時器

                2、高級功能具有PWM功能 輸出比較功能還有輸入捕獲功能對一些輸入事件進行計時。 四、定時器0相關寄存器

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

                 2、設置時鐘源頻率

         

        技術文檔:

         

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

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

        1、單通道比較計數器

        2、清除比較匹配發生(自動加載)就是比較匹配發生時清除定時器(自動加載)這個初學者不用關心

        3、釋放干擾脈沖,相位改正脈沖寬度調制器(PWM)就是無干擾脈沖相位正確的PWM

        4、頻率發生器

        5、外部事件計數器

        6、10位時鐘預分頻器(比如單片機晶振16MHZ可以進行一些預分頻然后提供時鐘給定時器)

        7、溢出和比較匹配中斷源(TOVO and OCFO)就是2個中斷源一個是溢出中斷  和一個比較匹配中斷  而比較匹配中斷一般應用于PWM 應用時使用。這里只說下TOV0 就是溢出中斷。

        比較匹配中斷一般應用于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 這就是計數寄存器,這個寄存器的數值呢,每來一個定時器的時鐘脈沖數值就自動增  256就溢出

         

        第三個寄存器叫做輸出比較寄存器 如下圖  OCR0 這個也是跟PWM功能有關的。






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

         

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

        列舉一下TC0相關相關寄存器

        定時器0相關寄存器

         

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

        設置時鐘頻率

         

        T/C寄存器  TCNT0

        計數寄存器

         

        T/C 中斷屏蔽寄存器 ----TIMSK

        需要使用溢出中斷時

         

        T/C 中斷標志寄存器 ---TIFR

        查詢是否溢出

        下面演示下定時器0溢出方式 用查詢模式使用步驟

        第一步:設置TC寄存器初值

        TCNT0 =55

        第二步:開啟時鐘,同時TC0啟動

        TCCR0 |= (1<<CS01);

        第三步:查詢TIFR 寄存器的TOV0位

        while(!(TIFR & (1<<TOV0)));


        當然要先設置時鐘頻率TCNR0 對時鐘預分頻如 要100us 首先選一個合適的分頻比例 8 分頻就是2MHZ

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

        以下代碼查詢方式使用定時器0 的代碼


        當然還有中斷模式,中斷模式使用稍微復雜一點

        第一步:包含中斷函數頭文件

        #include

        第二步:設置TC寄存器初值

        TCNT0 =55;

        第三步:使能TC0溢出中斷

        TIMSK |= (1<<TOIE0);

        第四步:編寫TCO溢出中斷服務程序

        SIGNAL(SIG_SIG_OVERFLOW0)

        {//此添加中斷服務程序代碼}

        第五步:開啟時鐘,同時TC0啟動

        TCCR0 |= (1<<CS01);

        第六步:使能全局中斷

        sei();

         

        看代碼用中斷實現定時器0



         

         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮