Sim's blog

電子工作はじめてみました

AVRでLEDホタル(3)

2008-09-16 21:20:29 | AVR
AVRでLEDホタル(2)の続きです。

ELMさんというかchanさんのところで、フルカラーLEDを使って遊ぶ記事を見つけました。8ピンAVRの活用という記事の中の「LEDフラッシャー その2」です。赤→黄→緑→水色→青→紫→赤の順に色を変化させていくと「色相が回転」するのだそうです。途中をなめらかに変化させるために中間値をPWMで出力します。

chanさんの元のコードはアセンブラでしたが、Cにしちゃいました。たぶん、そんなに間違ってないと思います。
#include <avr/io.h>
#include <util/delay.h>

typedef unsigned char byte;

byte r, g, b;

void ledfunc(char rd, char gd, char bd)
{
    byte i;

    for(i = 0; i < 0xff; i++){
        _delay_ms(6);

        OCR0A = r; // duty比設定 赤
        OCR0B = g; // duty比設定 緑
        OCR2B = b; // duty比設定 青
        r += rd;
        g += gd;
        b += bd;
    }
}

int main()
{
    // MEGA88 タイマー関連ポート
    // OC0A/PD6 12pin 赤
    // OC0B/PD5 11pin 緑
    // OC1A/PB1 15pin
    // OC1B/PB2 16pin
    // OC2A/PB3 17pin ... MOSI
    // OC2B/PD3  5pin 青

    //       76543210
    DDRD = 0b01101000; // PD6, PD5, PD3出力

    // 14.9.1 タイマ/カウンタ0制御レジスタA (p.64)
    //         ++--------COM0A1:COM0A0 10 上昇時一致でL下降時一致でH
    //         ||++------COM0B1:COM0B0 10 上昇時一致でL下降時一致でH
    //         ||||  ++--WGM01:WGM00   01 位相基準PWM動作
    TCCR0A = 0b10100001;

    // 17.11.1 タイマ/カウンタ2制御レジスタA (p.99)
    //         ++--------COM2A1:COM2A0 10 OCR2A停止
    //         ||++------COM2B1:COM2B0 00 上昇時一致でL下降時一致でH
    //         ||||  ++--WGM21:WGM20   01 位相基準PWM動作
    TCCR2A = 0b00100001;

    // 14.9.2 タイマ/カウンタ0制御レジスタB (p.65)
    //         ++--------FOC0A:FOC0B    00
    //         ||  +-----WGM2           0   TOP = 0xff
    //         ||  |+++--CS02:CS01:CS00 001 clkio/1
    TCCR0B = 0b00000001; // start timer

    // 17.11.2 タイマ/カウンタ0制御レジスタB (p.100)
    //         ++--------FOC2A:FOC2B    00
    //         ||  +-----WGM22          0   TOP = 0xff
    //         ||  |+++--CS22:CS21:CS20 001 clkio/1
    TCCR2B = 0b00000001; // start timer

    r = 0xff;
    g = 0x00;
    b = 0x00;

    while(1){
        ledfunc( 0,  1,  0); // 赤→黄
        ledfunc(-1,  0,  0); // 黄→緑
        ledfunc( 0,  0,  1); // 緑→水色
        ledfunc( 0, -1,  0); // 水色→青
        ledfunc( 1,  0,  0); // 青→紫
        ledfunc( 0,  0, -1); // 紫→赤
    }
}




最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (nsx)
2008-09-17 23:30:11
こんにちは
綺麗でした。
ホタル(2)動画と比べて、輝度がほぼ保たれているように感じたのでなぜかなとCを見ましたが、RGBの1要素を残して移行させているからなのかなと思いました。
結果、中心輝度でカメラを合わせておくと、ホタル(2)のように背景がチラ見しないのでしょうね。三脚で固定していないからホタルのゆらぎの感じがとてもよく出ています。
蛍が見えました。
返信する
Unknown (Sim)
2008-09-18 08:07:33
こんにちは、nsxさん
結構いい感じで光ってます。やはり2色混合のときと単独色のときで明るさが違うので多少点滅感がありますが、ほぼ明るさ一定で変化してくれています。元のchanさんのアイデアが良かったんですね。
今やっているのは、ダイナミック点灯を使ってフルカラーLEDを複数個点けようとしているところです。配線が多いので別基板(ブレッドボード)になってしまいました。

返信する

コメントを投稿