小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

以前寫過一個關於ATmega328p的定時/計數器的文章,但是寫的不夠詳細,這一次我將詳細的介紹一下ATmega328p的3個片內定時/計數器的相關知識。

328p 有3個定時計數器,分別是8bit的 T/C0 ,16bit的 T/C1和8bit的 T/C2。我們來看這個16bit的T/C2。

我們先看看最簡單的普通模式。定時器的基本原理其實就是根據設定的時鐘頻率,每過一個時鐘,計數計時器的值加1。即16位計數器TCNT1一直累加,當計數到0xFFFF之後,由於計數器溢出,TCNT1返回到最小值0x0000重新開始計數。

普通模式涉及到的寄存器有:(對於每一個位,我也只寫出在普通模式下面涉及到的)

1.TCCR1A:控制寄存器 A

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

2.TCCR1B:控制寄存器 B

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

在普通模式下面,對於這兩個寄存器只需要用到下面這個表了:

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

這個位WGM13:0 就是波形發生模式的設置,我們設置為普通模式,那麼WGM13:0均設置為0即可

我們還需要來設置3個重要的位:

位CS12:0 看錶如下:作用時鐘的選擇

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

3.TCNT1H 與 TCNT1L:數據寄存器。

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

這是一個16位的,分高八位和低八位,

主要來看一下這個數據在普通模式下怎麼計算:

假如現在要做一個定時1s的計數器,即1s產生一箇中斷,timer1是一個16位的計數器,能夠存放的最大值為0xFFFF,

有這樣一個公式: TCNT1=0Xffff - 定時時間/(分頻數* (1/晶振頻率))

再假設分頻數為設置為1024,328p的晶振頻率為12MHz,那麼

TCNT1= 0XFFFF - 1 / (1024 *(1/16000000))= 0xFFFF –0x3D09=0XC2F6

在程序中TCNT1的賦值寫法有很多,

  • TCNT1=0xC2F6

  • TCNT1H = 0xC2 TCNT1L = 0xF6 均是正確的。

4.TIMSK1 :中斷屏蔽寄存器

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)

這隻要置位bit0就好了,即開中斷使能。

有了這些知識,普通模式下的定時器就可以跑起來了,是不是特別的簡單。

再附上demo程序:

小5帶你飛(10)—AVR(ATmega 328P)單片機定時器的原理和使用(1)


分享到:


相關文章: