在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > IAR For AVR 定時器溢出中斷 (使用小結)

            IAR For AVR 定時器溢出中斷 (使用小結)

            作者: 時間:2016-12-03 來源:網(wǎng)絡 收藏
            關于溢出中斷不管是哪個單片機都是不斷累加,使其寄存器溢出觸發(fā)中斷,然后跳轉(zhuǎn)到中斷函數(shù)處執(zhí)行中斷服務程序。對于定時器初值的設定可以加深對定時器的工作原理的理解。

            ATMega16 里面有8位和16位兩種定時器,他們何時會溢出這個是固定的,也就是到達他們的計數(shù)范圍的最大值就會產(chǎn)生中斷,8位的定時器的最大計數(shù)范圍是0~256(2的8次方),就是累加到256后他就會產(chǎn)生中斷,16位的定時器最大計數(shù)范圍是0~65536(2的16次方),累加到65536時他就會產(chǎn)生中斷。

            本文引用地址:http://www.biyoush.com/article/201612/325110.htm

            而我們所謂的計數(shù)初值是就是要設定定時器在什么地方開始計數(shù),以8位定時器為例比如:初值為100,所以定時器從100開始累加,累加了156次,加到256后產(chǎn)生中斷,這就是中間消耗的時間和指令周期就是我們要去設定的時間;再比如:初值是200,所以定時器從200開始累加,累加了56次,加到256后產(chǎn)生中斷,可以看到第一定時要累加156次才會中斷而第二次只要累加56次就會產(chǎn)生中斷,顯然第一次設定的時間要比第二次的長。

            定時器不僅可以定時,而且我們用到定時器的時候往往是需要精確定時的時候。我們可以計算出我們設定的初值會在多長時間后進入中斷。

            下面的是8位定時器設定的時候需要用的寄存器:







            實驗平臺:ATMega16

            晶振: 11.0592 MHz

            對初值的計算:

            1,11059200 / 1024 = 10800 設定為1024倍分頻 ,得到每1秒需要進行多少次累加

            2,10800 / 100 = 108 得到10ms 的定時需要進行多少次累加 。

            3,256 - 108 = 148 計算范圍最大值減去要累加的時間,得到初值,即從哪里開始累加才能在溢出時為10ms的時間。

            4,148 <==> 0x94 得到十六進制值,賦值給TCNT0

            實驗代碼: 定時10ms

            #include
            unsigned char flag = 0;
            void timer_init(void)
            {
            TCCR0 = 0x05; //進行1024分頻

            TCNT0 = 0x94; //賦計數(shù)初值

            TIMSK_TOIE0 = 1; //開使能
            SREG_I = 1; //開總中斷
            }
            #pragma vector = TIMER0_OVF_vect
            __interrupt void time0_normal(void)
            {
            TCNT0 = 0x94; //重新賦初值
            flag++;
            }
            void main(void)
            {
            timer_init();
            DDRB_Bit0 = 1;
            while(1)
            {
            if(flag == 100) //10ms 重復100次,即為1秒
            {
            PORTB_Bit0 = ~PORTB_Bit0; //讓LED閃爍
            flag = 0;
            }
            }
            }

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

            實驗平臺:ATMega16

            晶振:11.0592

            16位定時器初值設定:

            1,11059200 / 256 = 43200 設定256倍分頻,得到每1秒需要進行多少次累加

            2,65536 - 43200 = 22336 計算范圍最大值減去要累加的時間,得到初值,即從哪里開始累加才能在溢出時為1s的時間。

            3,22336 <==> 0x57 0x40 得到十六進制值,賦值給TCNT1H , TCNT1L

            實驗代碼: 定時1s

            #include
            unsigned char flag = 0;
            void timer_init(void)
            {
            TCCR1B = 0x04;

            TCNT1H = 0x57;
            TCNT1L = 0x40;

            TIMSK_TOIE1 = 1;
            SREG_I = 1;
            }
            #pragma vector = TIMER1_OVF_vect
            __interrupt void time1_normal(void)
            {
            TCNT1H = 0x57;
            TCNT1L = 0x40;

            flag++;
            }
            void main(void)
            {
            timer_init();
            DDRB_Bit0 = 1;
            while(1)
            {
            if(flag == 1)
            {
            PORTB_Bit0 = ~PORTB_Bit0;
            flag = 0;
            }
            }
            }



            評論


            技術專區(qū)

            關閉