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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR單片機(jī)(學(xué)習(xí)ing)-ATMEGA16的定時(shí)/計(jì)數(shù)器

          AVR單片機(jī)(學(xué)習(xí)ing)-ATMEGA16的定時(shí)/計(jì)數(shù)器

          作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
          四、ATMEGA16的定時(shí)/計(jì)數(shù)器

          四—(01)、四位顯示秒表試驗(yàn)

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

          首先懷念一下咱們的體育課,再體育課或者田徑比賽的時(shí)候,老師會(huì)經(jīng)常使用秒表來(lái)記錄同學(xué)們的成績(jī)。在此,來(lái)進(jìn)行一個(gè)秒表的設(shè)計(jì)。(說(shuō)實(shí)話,這個(gè)秒表真的太貴了,不過(guò)只是實(shí)驗(yàn),純屬娛樂(lè))

          使用INT0鍵進(jìn)行計(jì)時(shí)的開(kāi)始/停止,使用S1鍵作為計(jì)時(shí)值得清楚,并且采用6位數(shù)碼管的右四位進(jìn)行顯示。

          定時(shí)器T0被用作掃描4位數(shù)碼管(采用溢出中斷,每1ms中斷一次),而定時(shí)器T1則用來(lái)計(jì)時(shí)(咱們用的秒表用來(lái)顯示四位,兩位小數(shù),也就是每計(jì)時(shí)10ms中斷溢出一次)。

          1、預(yù)分頻器和多路選擇器

          ATMEGA16有兩個(gè)8位定時(shí)/計(jì)數(shù)器(T/C0、T/C2)和一個(gè)16位定時(shí)/計(jì)數(shù)器(T/C1)。

          ATMEGA16的定時(shí)器/計(jì)數(shù)器時(shí)鐘是可選擇的。其時(shí)鐘部分包括預(yù)分頻器和一個(gè)多路選擇器。預(yù)分頻器課被認(rèn)為是一個(gè)有多級(jí)輸出的分頻器。ATMEGA16用一個(gè)10位的計(jì)數(shù)器把輸入的時(shí)鐘分為4種可選擇的分頻輸出。多路選擇器可設(shè)置使用其中一個(gè)分頻輸出,或者不適用分頻輸出和使用外部引腳輸入時(shí)鐘。

          看圖看真相:(其中只有0和1的,2的同理啊~好像那個(gè)0和1共用一個(gè),具體我給忘記了,自己看datasheet~)


          2、8 位定時(shí)器/ 計(jì)時(shí)器0

          T/C0 是一個(gè)通用的單通道8 位定時(shí)器/ 計(jì)數(shù)器模塊。其主要特點(diǎn)如下:
          • 單通道計(jì)數(shù)器
          • 比較匹配發(fā)生時(shí)清除定時(shí)器( 自動(dòng)加載)
          • 無(wú)干擾脈沖,相位正確的PWM
          • 頻率發(fā)生器
          • 外部事件計(jì)數(shù)器
          • 10 位的時(shí)鐘預(yù)分頻器
          • 溢出和比較匹配中斷源 (TOV0 和 OCF0)

          Figure 27為8位定時(shí)器/計(jì)數(shù)器的簡(jiǎn)化框圖(說(shuō)實(shí)話,我也看不懂啊~~



          寄存器:

          T/C(TCNT0)和輸出比較寄存器(OCR0)為8位寄存器。中斷請(qǐng)求(圖中簡(jiǎn)寫為Int.Req. ) 信
          號(hào)在定時(shí)器中斷標(biāo)志寄存器TIFR 都有反映。 所有中斷都可以通過(guò)定時(shí)器中斷屏蔽寄存器
          TIMSK 單獨(dú)進(jìn)行屏蔽。圖中沒(méi)有給出TIFR 和TIMSK。
          T/C可以通過(guò)預(yù)分頻器由內(nèi)部時(shí)鐘源驅(qū)動(dòng),或者是通過(guò)T0 引腳的外部時(shí)鐘源來(lái)驅(qū)動(dòng)。時(shí)鐘
          選擇邏輯模塊控制使用哪一個(gè)時(shí)鐘源與什么邊沿來(lái)增加( 或降低)T/C 的數(shù)值。如果沒(méi)有
          選擇時(shí)鐘源T/C 就不工作。時(shí)鐘選擇模塊的輸出定義為定時(shí)器時(shí)鐘clkT0。
          雙緩沖的輸出比較寄存器OCR0 一直與T/C 的數(shù)值進(jìn)行比較。比較的結(jié)果可用來(lái)產(chǎn)生
          PWM波,或在輸出比較引腳OC0上產(chǎn)生變化頻率的輸出。比較匹配事件還將置位比較標(biāo)志OCF0。此標(biāo)志可以用來(lái)產(chǎn)生輸出比較中斷請(qǐng)求。

          定義:

          本文的許多寄存器及其各個(gè)位以通用的格式表示。小寫的“n” 取代了T/C 的序號(hào),在此即
          為0。小寫的“x” 取代了輸出比較單元通道,在此即為通道A。但是在寫程序時(shí)要使用精
          確的格式,例如使用TCNT0 來(lái)訪問(wèn)T/C0 計(jì)數(shù)器值,等等。



          T/C 時(shí)鐘源:

          T/C 可以由內(nèi)部同步時(shí)鐘或外部異步時(shí)鐘驅(qū)動(dòng)。時(shí)鐘源是由時(shí)鐘選擇邏輯決定的,而時(shí)鐘
          選擇邏輯是由位于T/C 控制寄存器TCCR0 的時(shí)鐘選擇位CS02:0 控制的。

          計(jì)數(shù)器單元:

          8位T/C的主要部分為可編程的雙向計(jì)數(shù)單元。 Figure 28 即為計(jì)數(shù)器和周邊電路的框圖。

          根據(jù)不同的工作模式,計(jì)數(shù)器針對(duì)每一個(gè)clkT0 實(shí)現(xiàn)清零、加一或減一操作。clkT0 可以由
          內(nèi)部時(shí)鐘源或外部時(shí)鐘源產(chǎn)生,具體由時(shí)鐘選擇位CS02:0 確定。沒(méi)有選擇時(shí)鐘源時(shí)
          (CS02:0 = 0) 定時(shí)器即停止。但是不管有沒(méi)有clkT0,CPU 都可以訪問(wèn)TCNT0。CPU 寫操
          作比計(jì)數(shù)器其他操作( 如清零、加減操作) 的優(yōu)先級(jí)高。
          計(jì)數(shù)序列由T/C 控制寄存器 (TCCR0) 的WGM01 和WGM00 決定。計(jì)數(shù)器計(jì)數(shù)行為與輸
          出比較OC0 的波形有緊密的關(guān)系。有關(guān)計(jì)數(shù)序列和波形產(chǎn)生的詳細(xì)信息請(qǐng)參考P72“ 工作
          模式” 。
          T/C溢出中斷標(biāo)志TOV0根據(jù)WGM01:0 設(shè)定的工作模式來(lái)設(shè)置。TOV0可以用于產(chǎn)生CPU
          中斷。
          輸出比較單元:
          8位比較器持續(xù)對(duì)TCNT0和輸出比較寄存器OCR0進(jìn)行比較。一旦TCNT0等于OCR0,比
          較器就給出匹配信號(hào)。在匹配發(fā)生的下一個(gè)定時(shí)器時(shí)鐘周期輸出比較標(biāo)志OCF0 置位。若
          此時(shí)OCIE0 = 1 且SREG 的全局中斷標(biāo)志I 置位,CPU 將產(chǎn)生輸出比較中斷。執(zhí)行中斷
          服務(wù)程序時(shí)OCF0 自動(dòng)清零,或者通過(guò)軟件寫”1” 的方式來(lái)清零。根據(jù)由WGM21:0 和COM01:0 設(shè)定的不同的工作模式,波形發(fā)生器利用匹配信號(hào)產(chǎn)生不同的波形。同時(shí),波
          形發(fā)生器還利用max 和bottom 信號(hào)來(lái)處理極值條件下的特殊情況
          Figure 29 為輸出比較單元的方框圖。


          使用PWM 模式時(shí)OCR0 寄存器為雙緩沖寄存器;而在正常工作模式和匹配時(shí)清零模式
          雙緩沖功能是禁止的。雙緩沖可以將更新OCR0 寄存器與top 或bottom 時(shí)刻同步起來(lái),
          從而防止產(chǎn)生不對(duì)稱的PWM 脈沖,消除了干擾脈沖。
          訪問(wèn)OCR0 寄存器看起來(lái)很復(fù)雜,其實(shí)不然。使能雙緩沖功能時(shí),CPU 訪問(wèn)的是OCR0
          緩沖寄存器;禁止雙緩沖功能時(shí)CPU 訪問(wèn)的則是OCR0 本身。(好了,你笨上就這么多吧,我還是看書上的排版比較好啊~~datasheet真的好大啊~``)
          3、8位定時(shí)/計(jì)數(shù)器0的寄存器
          1)T/C 控制寄存器- TCCR0


          • Bit 7 – FOC0: 強(qiáng)制輸出比較
          FOC0僅在WGM00指明非PWM模式時(shí)才有效。但是,為了保證與未來(lái)器件的兼容性,在
          使用PWM 時(shí),寫TCCR0 要對(duì)其清零。對(duì)其寫1 后,波形發(fā)生器將立即進(jìn)行比較操作。
          比較匹配輸出引腳 OC0 將按照COM01:0 的設(shè)置輸出相應(yīng)的電平。要注意FOC0 類似一
          個(gè)鎖存信號(hào),真正對(duì)強(qiáng)制輸出比較起作用的是COM01:0 的設(shè)置。
          FOC0不會(huì)引發(fā)任何中斷,也不會(huì)在利用OCR0作為TOP的CTC模式下對(duì)定時(shí)器進(jìn)行清零
          的操作。
          讀FOC0 的返回值永遠(yuǎn)為0。
          • Bit 6, 3 – WGM01:0: 波形產(chǎn)生模式
          這幾位控制計(jì)數(shù)器的計(jì)數(shù)序列,計(jì)數(shù)器的最大值TOP,以及產(chǎn)生何種波形。T/C 支持的
          模式有:普通模式,比較匹配發(fā)生時(shí)清除計(jì)數(shù)器模式(CTC),以及兩種PWM 模式,詳見(jiàn)
          Table 38 與P72“ 工作模式” 。


          • Bit 5:4 – COM01:0: 比較匹配輸出模式
          這些位決定了比較匹配發(fā)生時(shí)輸出引腳OC0 的電平。如果COM01:0 中的一位或全部都
          置位, OC0 以比較匹配輸出的方式進(jìn)行工作。同時(shí)其方向控制位要設(shè)置為1 以使能輸出
          驅(qū)動(dòng)器。
          當(dāng)OC0 連接到物理引腳上時(shí), COM01:0 的功能依賴于WGM01:0 的設(shè)置。Table 39 給
          出了當(dāng)WGM01:0 設(shè)置為普通模式或CTC 模式時(shí)COM01:0 的功能。






          • Bit 2:0 – CS02:0: 時(shí)鐘選擇
          用于選擇T/C 的時(shí)鐘源。


          如果T/C0 使用外部時(shí)鐘,即使T0 被配置為輸出,其上的電平變化仍然會(huì)驅(qū)動(dòng)記數(shù)器。
          利用這一特性可通過(guò)軟件控制記數(shù)(這里應(yīng)該注意一下下~~~)。
          上一頁(yè) 1 2 3 4 下一頁(yè)

          評(píng)論


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