新手请教关于定时器的问题
本帖最后由 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);
}
}
void timer1_ovf_isr(void)
{
TCNT1 = 30000;
m++;
}
似乎这个函数你并没有调用,m当然不会加1
你是用的中断吗?那要有“attachInterrupt(。。。)” 我是希望定时器能够不停的加载计数初始值、累加、溢出、重新加载计数初始值、累加、溢出... 这样周而复始,不受到运行的主程序的影响。
所以我觉得不能够在主程序的循环部分去捕捉中断,否则达不到效果。 我知道问题在哪里了。我修改了如下几个地方就可以了。
1、在TCNT1 = 30000;之前需要先将 TCCR1B=0
2、需要将void timer1_ovf_isr(void)这句修改为ISR(TIMER1_OVF_vect) 。 我原来以为这两种写法一样。其实好像不同。
这样可以很方便的实现通过定时器来获得一个固定的时间段。 这个妥妥的
页:
[1]