极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10918|回复: 4

新手请教关于定时器的问题

[复制链接]
发表于 2014-2-13 22:57:10 | 显示全部楼层 |阅读模式
本帖最后由 kitten2014 于 2014-2-14 22:56 编辑

我最近在研究定时器的用法,模仿写了一个简单的程序,用定时器来控制LED的闪烁。但是好像没有起作用。不知道为什么?
我尝试调试,发现m的值并没有增加。应该每一次计数器溢出就可以将m加1。
int ledpin=13;
int m=0;

void setup()
{
  unsigned char clockSelectBits;
  pinMode(ledpin,OUTPUT);

  noInterrupts();
  TCCR1A = 0;
  TCNT1 = 30000;
  clockSelectBits = _BV(CS12) | _BV(CS10);
  TCCR1B |= clockSelectBits;  
  TIMSK1 |= (1 << TOIE1);
  interrupts();      
}

void timer1_ovf_isr(void)
{  
  TCNT1 = 30000;
  m++;
}

void loop()
{
   delay(5000);
   m=0;
   while (m <10)
   {
      digitalWrite(ledpin,LOW);
   }
   delay(5000);
   m=0;
   while (m <4)
   {  
      digitalWrite(ledpin,HIGH);
   }
}
回复

使用道具 举报

发表于 2014-2-14 00:49:14 | 显示全部楼层
void timer1_ovf_isr(void)
{  
  TCNT1 = 30000;
  m++;
}

似乎这个函数你并没有调用,m当然不会加1

你是用的中断吗?那要有“attachInterrupt(。。。)”
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-14 09:32:21 | 显示全部楼层
我是希望定时器能够不停的加载计数初始值、累加、溢出、重新加载计数初始值、累加、溢出... 这样周而复始,不受到运行的主程序的影响。
所以我觉得不能够在主程序的循环部分去捕捉中断,否则达不到效果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-14 22:55:15 | 显示全部楼层
我知道问题在哪里了。我修改了如下几个地方就可以了。
1、在TCNT1 = 30000;之前需要先将 TCCR1B=0
2、需要将void timer1_ovf_isr(void)这句修改为ISR(TIMER1_OVF_vect)   。 我原来以为这两种写法一样。其实好像不同。

这样可以很方便的实现通过定时器来获得一个固定的时间段。  
回复 支持 反对

使用道具 举报

发表于 2014-2-15 00:15:10 | 显示全部楼层
这个妥妥的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 13:33 , Processed in 0.033691 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表