-1

私はマイクロコントローラーのプログラミングに比較的慣れていないので、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 ができました。

4

2 に答える 2