私はマイクロコントローラーのプログラミングに比較的慣れていないので、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 が 0.5 秒間オフになってから輝度が上がると予想していました。しかし、コードを実行すると、LED_delay_ms(500)
が無視されたかのように、単純に明るくなります。
このanalogOutput
関数は、Arduino ライブラリの関数に触発されています。
ここで何が問題なのですか?遅延が期待どおりに機能しないのはなぜですか?
編集
ループ機能、新しいコンテンツを変更しました:
void loop()
{
analogOutput(127);
_delay_ms(500);
analogOutput(255);
_delay_ms(500);
}
これは機能します。これで、薄暗い状態から完全にオンまたはオフに常に切り替わる LED ができました。