2009年3月3日

ナイトライダー風LED作成 その1

ナイトライダー風LED点灯プログラムの作成だ。

使うマイコンボードは、先日作成した
簡易実験用マイコンボード。

今回は、PORTBのPB0~PB7までの8ピン使って
点滅表示させる。

欲を言えば、点灯後の残像もほしいところだが、
それはまた今度、とりあえず光点が8つのLEDの間を、
往復する事を確認する。

まっさらから、プログラムを組むのは、ちょっと面倒なので、
LED点灯テストに用いたプログラムを改造する。

ただし、projectは新規に起こす。

// ナイトライダー風LED点滅プログラム

#include <avr\io.h>

#define PB0_OUT 0x01 // ポートPB0を出力設定
#define PB1_OUT 0x02 // ポートPB1を出力設定
#define PB2_OUT 0x04 // ポートPB2を出力設定
#define PB3_OUT 0x08 // ポートPB3を出力設定
#define PB4_OUT 0x10 // ポートPB4を出力設定
#define PB5_OUT 0x20 // ポートPB5を出力設定
#define PB6_OUT 0x40 // ポートPB6を出力設定
#define PB7_OUT 0x80 // ポートPB7を出力設定

#define HI 0x01          // Hiにする。

void wait();

int main() 
{
    int pos = PB0;
    int l2r = 1;    // PB0→PB7:1 PB7→PB0:0
//    DDRB = PB0_OUT | PB1_OUT | PB2_OUT | PB3_OUT 
//         | PB4_OUT | PB5_OUT | PB6_OUT | PB7_OUT; 
    DDRB = 0xFF;
    
    while(1){
        
        if ( l2r == 1 ) {
            for ( ; pos <= PB7; pos++ ){
                // ポートPBposを点灯
                PORTB = HI << pos;
                wait();
            }
            l2r = 0;
            pos = PB7;
        } else {
            for ( ; pos >= PB0; pos-- ){
                // ポートPBposを点灯
                PORTB = HI << pos;
                wait();
            }
            l2r = 1;
            pos = PB0;
        }
    }

    return 0;
}

void wait()
{
    int i;
    for ( i = 0; i <= 20000; i++ ) {
        // nothing to do. 
        // wait loop
    }
}



このコードで動くかと思ったが、どうも上手くいかない。
PB7が常にHIになったまま、
その他のピンがHIにならない。

こういう時は初心に返るに限る。
LED点滅プログラムを改造して、全ピンを点滅するようにする。

// LED点滅テスト

#include <avr\io.h>

//#define PB0_OUT 0x01 // ポートPB0を出力設定
#define PB0_OUT 0xFF // ポートPB0~7を出力設定

//#define PB0_HI 0x01 // ポートPB0をHiにする。
#define PB0_HI 0xFF // ポートPB0をHiにする。

int main() 
{
    long i;

    DDRB = PB0_OUT; 

    while(1){
        for ( i = 0; i <= 20000; i++ ) {
            // nothing to do. 
            // wait loop
        }
        // ポートPB0を反転
        PORTB ^= PB0_HI;
    }

    return 0;
}


これも、PB0~PB6はピコピコと点滅信号を出しているが、
PB7だけが常にHI
PB7はRESETポートと兼用なので、ひょっとすると、マイコンボード側にミスがあるのかもしれない。
ちょうど、プログラムモード切替スイッチを付けたりして、複雑な形状をしているから、あり得ない話じゃない。

というわけで、ちょっとマイコンボードを再点検する必要がある。


0 件のコメント:

コメントを投稿