我对微控制器编程比较陌生,所以我开始在 ATtiny85 上进行试验。
第一个程序只是打开一个 LED 并稍有延迟(经典闪烁程序)。
现在我想慢慢增加 LED 的亮度。这是代码:
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#define LED PB0
void setup(void);
void loop(void);
void analogOutput(int8_t brightness);
int main(void)
{
setup();
while (1)
{
loop();
}
return 0;
}
void setup()
{
TCCR0A = (1 << WGM00) | (1 << WGM01);
TCCR0B = (1 << CS00) | (1 << CS01);
DDRB = (1 << LED);
PORTB = 0;
}
void loop()
{
int8_t brightness = 0;
analogOutput(brightness);
_delay_ms(500);
for (brightness = 0; brightness < 256; ++brightness)
{
analogOutput(brightness);
_delay_ms(10);
}
}
void analogOutput(int8_t brightness)
{
if (brightness == 0)
{
// digital output LOW
TCCR0A &= ~(1 << COM0A1);
PORTB &= ~(1 << LED);
}
else if (brightness == 255)
{
// digital output HIGH
TCCR0A &= ~(1 << COM0A1);
PORTB |= (1 << LED);
}
else
{
PORTB &= ~(1 << LED);
// analog output
TCCR0A |= (1 << COM0A1);
OCR0A = brightness;
}
}
我预计 LED 会关闭半秒钟,然后增加亮度。但是,如果我运行代码,LED 就会变得更亮,就好像_delay_ms(500)
被忽略了一样。
该analogOutput
函数的灵感来自 Arduino 库的函数。
这里有什么问题?为什么延迟没有按预期工作?
编辑
我改变了我的循环功能,新内容:
void loop()
{
analogOutput(127);
_delay_ms(500);
analogOutput(255);
_delay_ms(500);
}
这行得通,我现在有一个 LED 可以不断地从变暗切换到完全打开和返回。