<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IAR For AVR 定時(shí)器溢出中斷 (使用小結(jié))

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

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

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

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

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

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

          下面的是8位定時(shí)器設(shè)定的時(shí)候需要用的寄存器:







          實(shí)驗(yàn)平臺(tái):ATMega16

          晶振: 11.0592 MHz

          對初值的計(jì)算:

          1,11059200 / 1024 = 10800 設(shè)定為1024倍分頻 ,得到每1秒需要進(jìn)行多少次累加

          2,10800 / 100 = 108 得到10ms 的定時(shí)需要進(jìn)行多少次累加 。

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

          4,148 <==> 0x94 得到十六進(jìn)制值,賦值給TCNT0

          實(shí)驗(yàn)代碼: 定時(shí)10ms

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

          TCNT0 = 0x94; //賦計(jì)數(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 重復(fù)100次,即為1秒
          {
          PORTB_Bit0 = ~PORTB_Bit0; //讓LED閃爍
          flag = 0;
          }
          }
          }

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

          實(shí)驗(yàn)平臺(tái):ATMega16

          晶振:11.0592

          16位定時(shí)器初值設(shè)定:

          1,11059200 / 256 = 43200 設(shè)定256倍分頻,得到每1秒需要進(jìn)行多少次累加

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

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

          實(shí)驗(yàn)代碼: 定時(shí)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;
          }
          }
          }



          關(guān)鍵詞: IARrAVR定時(shí)器溢出中

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();