以前写过一个关于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=0xC2TCNT1L=0xF6均是正确的。
4.TIMSK1:中断屏蔽寄存器
这只要置位bit0就好了,即开中断使能。
有了这些知识,普通模式下的定时器就可以跑起来了,是不是特别的简单。
再附上demo程序:
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。