我正在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);
}
答案 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()在顶部,你需要在定义它们之前使用函数原型声明你的函数。或者,更好的是,将您的后一个代码示例移动到它自己的文件并给它一个标题:
#include "blink.h"
int main(void)
{
blink_setup();
while(1) {
blink_loop();
}
}
#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语言,这将类似于命名空间或类前缀的概念。
#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()
,即使它尚未定义。
除了那个环境问题,你的代码看起来应该有效。我更喜欢一点空白;我已经在我的代码示例中添加了它,但除此之外一切看起来都很棒!