ナイトライダー風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ポートと兼用なので、ひょっとすると、マイコンボード側にミスがあるのかもしれない。
ちょうど、プログラムモード切替スイッチを付けたりして、複雑な形状をしているから、あり得ない話じゃない。
というわけで、ちょっとマイコンボードを再点検する必要がある。