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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ATMAGE16定時器0初始值計算總結(jié)

          ATMAGE16定時器0初始值計算總結(jié)

          作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
          今天在學(xué)習(xí)利用定時器0完成定時時發(fā)現(xiàn)在計算初始值時,不是很明白如何計算,就在網(wǎng)上找答案,看了很多人的例子和講解總算是有點頭緒了,先把那些有用的資料整理在一起供以后使用!謝謝各位在網(wǎng)上分享他們學(xué)習(xí)成果的大蝦小蝦和給為泡泡叔叔?。?!

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

          定時器0是8位的故可計數(shù)的范圍是0-255這些數(shù),我們在設(shè)置初始值時就就應(yīng)該告訴計數(shù)器我們開始計數(shù)的位置,這也就是TCNT0的初始值,當(dāng)計數(shù)到255時,有硬件在TIFR的bit0位TOV0置位觸發(fā)中斷,如果要使用比較匹配中斷時就要告訴OCR0定時器計數(shù)的數(shù)值(也就是256-m,m為TCNT0的初始值),定時器記了多少數(shù)到達TOP值,當(dāng)發(fā)生比較匹配值相同時在TIFR的bit1位OCF0置位從而觸發(fā)中斷!

          以上是我學(xué)習(xí)過程的一點小總結(jié),我會慢慢的將他彌補上的,如果說對了,有看到的網(wǎng)友有什么意見和建議給我留一下言我好肯定一下,如果說錯了,給為大蝦小蝦也不要笑話我,請您也給我留下言,好給我指正我的錯誤和建議!在這里也謝謝你們了?。?/p>

          首先依照AVR使用范例--定時器應(yīng)用范例

          http://www.avrvi.com/avr_examples/timer.html,使用ICC application bulider快速配置定時器生成代碼如下:

          //ICC-AVR application builder : 2007-8-28 0:55:55
          // Target : M16
          // Crystal: 7.3728Mhz

          #include
          #include

          voidport_init(void)
          {
          PORTA = 0x00;
          DDRA= 0x00;
          PORTB = 0x00;
          DDRB= 0x00;
          PORTC = 0x00;//m103 output only
          DDRC= 0x00;
          PORTD = 0x00;
          DDRD= 0x00;
          }

          TIMER0 initialize - prescale:1024

          // WGM: Normal

          // desired value: 20mSec

          // actual value: 19.861mSec (0.7%)

          voidtimer0_init(void)
          {


          TCCR0 = 0x00;//stop

          TCNT0 = 0x71;//set count
          OCR0= 0x 8F;//set compare
          TCCR0 = 0x05;//start timer

          這三位設(shè)置為1 0 1 :定時器的時鐘為外部時鐘頻率的1024分頻*/
          }

          #pragma interrupt_handler timer0_comp_isr:20
          voidtimer0_comp_isr(void)
          {
          //compare occured TCNT0=OCR0
          }

          #pragma interrupt_handler timer0_ovf_isr:10
          voidtimer0_ovf_isr(void)
          {
          TCNT0 = 0x71;//reload counter value
          }

          //call this routine to initialize all peripherals
          voidinit_devices(void)
          {
          //stop errant interrupts until set up
          CLI();//disable all interrupts
          port_init();
          timer0_init();

          MCUCR = 0x00;
          GICR= 0x00;
          TIMSK = 0x03;//timer interrupt sources
          SEI();//re-enable interrupts
          //all peripherals are now initialized
          }

          這里將以上程序用到的Time0寄存器如下所示:

          T/C0控制寄存器 TCCR0
          /FOC0/WGM00/COM01/COM00/WGM01/CS02/CS01/CS00 TCCR0

          7 6 5 4 3 2 1 0

          Bit 7 – FOC0: 強制輸出比較

          Bit 6, 3 – WGM01:0: 波形產(chǎn)生模式

          Bit 5:4 – COM01:0: 比較匹配輸出模式

          Bit 2:0 – CS02:0: 時鐘選擇

          MCU 控制寄存器- MCUCR

          MCU 控制寄存器包含了電源管理的控制位

          SM2/SE/SM1/SM0/ISC11/ISC10/ISC01/ISC00 MCUCR

          7 6 5 4 3 2 1 0

          Bits 7, 5, 4 – SM2..0: 休眠模式選擇位 2、1 和0

          SM2 SM1 SM0 休眠模式
          0 0 0空閑模式
          0 0 1 ADC 噪聲抑制模式
          0 1 0 掉電模式
          0 1 1 省電模式
          1 0 0 保留
          1 01 保留
          1 1 0Standby(1) 模式
          1 11 擴展Standby(1) 模式

          Bit 6 – SE: 休眠使能

          Bit 3, 2 – ISC11, ISC10: 中斷1 觸發(fā)方式控制

          Bit 1, 0 – ISC01, ISC00: 中斷0 觸發(fā)方式控制

          通用中斷控制寄存器- GICR

          7 6 5 4 3 2 1 0
          INT1 INT0 INT2 – – – IVSEL IVCE GICR

          Bit 7 – INT1: 使能外部中斷請求 1

          Bit 6 – INT0: 使能外部中斷請求 0

          Bit 5 – INT2: 使能外部中斷請求 2

          Bit 1 – IVSEL: 中斷向量選擇

          Bit 0 – IVCE: 中斷向量修改使能

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

          7 6 5 4 3 2 1 0
          OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 TIMSK

          Bit 1 – OCIE0: T/C0 輸出比較匹配中斷使能

          Bit 0 – TOIE0: T/C0 溢出中斷使能

          其余的未定義可參考ATMEGA16 datasheet!

          上面啰嗦了很多,以后看的時候不用到處去翻datasheet,這里說TCNT0的初始值

          TCNT0 = 0x71;//set count
          OCR0= 0x8F;//set compare

          如何得到這兩個值呢?

          現(xiàn)假設(shè)最大計數(shù)值為M,timer0為8位,那M=256。(這是我看51的定時器/計數(shù)器的基本結(jié)構(gòu)及工作原理,AVR應(yīng)該差不多的吧,反正我后來用計算器算了一下,符合就得)

          計數(shù)器初值X的計算式為:

          X=M-比較值(計數(shù)值)

          定時工作方式的計數(shù)初值X等于:

          X = M -比較值= M - t / T = M - (* t) / prescal

          為T/C0最高頻率的時鐘源,prescal為預(yù)分頻數(shù)。

          現(xiàn)在我們知道

          TCNT0 = 0x71;// set count十進制的113
          OCR0= 0x8F;// set compare十進制的143

          就相當(dāng)于OCR0是計數(shù)值,TCNT0是初始值。TCNT0=113,那么OCR0=M- TCNT0=143。

          我們?nèi)?7.3728Mhz,prescal=1024,于是,我們利用公式得出比較值=144,和結(jié)果的143有點誤差。接著呢,我們試著用公式倒推,算t。

          t =(143*1024)/(7.3728**)= 19.86111````ms

          剛好和設(shè)置那里的actual value誤差一樣。所以說,以倒推的為準(zhǔn)取TCNT0和OCR0值

          最后呢,TCCR0 = 0x05;//start timer

          TCCR0預(yù)分頻1024,具體可見上圖,

          應(yīng)該提醒的是:

          8位的定時器timer0根據(jù)公式,它最多可以完成35ms的定時任務(wù),1秒的任務(wù)它不能完成,所以當(dāng)想用來定時1秒的時候,只能用16位的定時器了;

          且atmega128和atmega16的timer0選擇時鐘源是不一樣的。請千萬要注意。現(xiàn)在我們討論的是atmega16;

          還有上邊的討論是在工作模式(waveform mode)選擇normal情況下。其他模式初始值和比較值的不一樣的,具體你可以選擇其他模式看一下它的變化值。

          這樣就得到了我們想要的TCNT0和OCR0的初始值了!



          關(guān)鍵詞: ATMAGE16定時器0初始值計

          評論


          技術(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); })();