kitten2014 发表于 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(。。。)”

kitten2014 发表于 2014-2-14 09:32:21

我是希望定时器能够不停的加载计数初始值、累加、溢出、重新加载计数初始值、累加、溢出... 这样周而复始,不受到运行的主程序的影响。
所以我觉得不能够在主程序的循环部分去捕捉中断,否则达不到效果。

kitten2014 发表于 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

这个妥妥的
页: [1]
查看完整版本: 新手请教关于定时器的问题