永发信息网

AVR的Mega16单片机如何获取寄存器TCNT1H 的值?

答案:2  悬赏:20  手机版
解决时间 2021-02-11 02:02
  • 提问者网友:蓝琪梦莎
  • 2021-02-10 06:27
程序如下:
#include
#include
#include
int main(void)
{
TCCR1B |= 0x04;//分频器设置
TCNT1H = 0x85;//高位寄存器
TCNT1L = 0xEE;//地位寄存器
TIMSK |= (1 << 2);//溢出中断允许
SREG |= (1 << 7);//总中断开关
DDRC = 0xff;
while (1) PORTC = TCNT1H;
}

程序中,我想用C口的八个LED来检测TCNT1H的值,但是,LED的值并不会发生变化,一直为:0x85 。现在因程序需要,我必须想办法获得TCNT1H的值,我想知道是我的程序写错了,还是有寄存器未正确设置?
最佳答案
  • 五星知识达人网友:摆渡翁
  • 2021-02-10 07:12
AVR单片机定时器的TCNT1有一个临时寄存器,用来保存TCNT1的高位字节。在访问TCNT1的时候需要分两次访问:写TCNT1的时候需要先写TCNT1H,再写TCNT1L。在写TCNT1H的时候,实际上是写入到临时寄存器。然后在写入TCNT1L的时候,TCNT1L与临时寄存器的值,被一起写入TCNT1L和TCNT1H;读取的时候正好相反,在读取TCNT1L的时候会导致TCNT1H的值被保存到临时寄存器,然后再读取TCNT1H的值(其实此时读取的是临时寄存器的值)。所以如果仅仅读取高位字节,那么读出的数据其实是上一次写入TCNT1H的值,或者是上一次读取TCNT1L时,保存在临时寄存器的值。看你的程序,因每次只读取TCNT1H,这个值其实是你写入TCNT1H时,保存在临时寄存器中的值,所以不会变化。正确的读取方法是:先读取一次TCNT1L,然后再读取TCNT1H,这样就可以得到正确的值了
全部回答
  • 1楼网友:渡鹤影
  • 2021-02-10 07:35
虽然我很聪明,但这么说真的难到我了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯