以前寫過一個關於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
2.TCCR1B:控制寄存器 B
在普通模式下面,對於這兩個寄存器只需要用到下面這個表了:
這個位WGM13:0 就是波形發生模式的設置,我們設置為普通模式,那麼WGM13:0均設置為0即可
我們還需要來設置3個重要的位:
位CS12:0 看錶如下:作用時鐘的選擇
3.TCNT1H 與 TCNT1L:數據寄存器。
這是一個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 :中斷屏蔽寄存器
這隻要置位bit0就好了,即開中斷使能。
有了這些知識,普通模式下的定時器就可以跑起來了,是不是特別的簡單。
再附上demo程序:
閱讀更多 小5嵌入式 的文章