在Arduino中使用计时器引入延迟

时间:2012-07-12 15:59:24

标签: arduino avr atmega

我正在Arduino中进行注册级编程。目标是使用计时器编写自己的延迟逻辑。这是代码:

#include<avr/io.h>

int main()
{
    DDRB = (1<<PORTB5);
    TCCR1B = (1<<CS12);
    while(1)
    {
        if(TCNT1 >= 31250)
        {
            PORTB ^= (1<<PORTB5);
            TCNT1 = 0;
        }
    }
    return 0;
}

以上程序是为Arduino引入延迟而不使用延迟功能及其工作正常。但请看下面的代码。

#include<avr/io.h>

void setup()
{
    DDRB = (1<<PORTB5);
    TCCR1B = (1<<CS12);
}

void loop()
{
    if(TCNT1 >= 31250)
    {
        PORTB ^= (1<<PORTB5);
        TCNT1 = 0;
    }
}

当我这样编写时,程序正在编译,但Arduino中没有闪烁。当下面的代码与上面的代码类似时,可能会出现什么问题呢?

#include <util/delay.h>

void setup()
{
    DDRB = (1<<PORTB5);
}

void loop()
{
    PORTB ^= (1<<PORTB5);
    _delay_ms(500);
}

1 个答案:

答案 0 :(得分:2)

看起来像C,特别是顶部有#include <avr/io.h>并使用main()功能。你是用avr-gcc / AVRstudio编译它还是打算用Arduino IDE写一个草图?

假设你正在尝试编写C语言,你的后一个文件是针对Arduino IDE编写的,它隐含地包含main()函数,其功能如下:

int main()
{
  setup();
  while(1) {
    loop();
  }
}

似乎是后一个代码示例所期望的环境。尝试在第二个文件的底部添加上述main()函数(在定义setup()loop()函数之后)。如果你想让main()在顶部,你需要在定义它们之前使用函数原型声明你的函数。或者,更好的是,将您的后一个代码示例移动到它自己的文件并给它一个标题:

的main.c

#include "blink.h"

int main(void)
{
  blink_setup();
  while(1) {
    blink_loop();
  }
}

blink.h

#ifndef BLINK_H  // Include guards prevent this file from being duplicated
#define BLINK_H

void blink_setup(void);  // blink_ prefix allows other modules to use comm
void blink_loop(void);

#endif

#ifndef ... #define ... #endif结构(称为包含保护)可防止在编译中多次包含此文件时出现错误,如果其他.h文件引用,则可能很容易发生它。 blink_前缀很有用,因为setup()loop()是通用名称,可能被其他模块使用。如果您熟悉其他OO语言,这将类似于命名空间或类前缀的概念。

blink.c

#include <avr/io.h>
#include "blink.h"

void setup()
{
   DDRB = ( 1 << PORTB5 );
   TCCR1B = ( 1 << CS12 );
}

void loop()
{
   if( TCNT1 >= 31250 )
   {
      PORTB ^= ( 1 << PORTB5 );
      TCNT1 = 0;
   }
}

请注意,我已将blink.h包含在此文件的顶部,使用"引号而不是括号,因为它是本地文件而不是系统文件。这会导致函数声明出现在文件的顶部,这样(例如)setup()可以调用loop(),即使它尚未定义。

除了那个环境问题,你的代码看起来应该有效。我更喜欢一点空白;我已经在我的代码示例中添加了它,但除此之外一切看起来都很棒!