TOPへ戻る

20080622 ATtiny2313 LED PWM 出力の確認

ATtiny2313 の PWM を使用してLEDをろうそくの炎っぽい制御をするプログラムを書いてみました。

AVRのPWMについては、ココで勉強。

確認用回路図


←クリックすると拡大します。
ISPのコネクタを外していますので、ISPを接続する線が残っています。

#include <stdlib.h> #include <avr/io.h> #include <util/delay.h> int main(void){ int i; // ループ用 int bright; // 明るさ用 int bright_o=250; // 明るさ用 int db; // 明るさの変化量 int ti; // 時間 DDRB = 0xff; // portB output DDRD = 0x00; // portD input PORTD = 0xff; // portD pull up TCCR1B = 0x03; // ck / 256 TCCR1A = 0xc1; // normal 8bit for(;;){ bright = rand()%100; // 明るさの乱数を発生 0〜100 (数値が大きいと暗くなる) ti = rand()%40+10; // 時間の乱数を発生 10〜50 db = (bright_o - bright) / ti; // 10ms毎の明るさの変化量を計算 for(i = 0; i < ti; i++){ if(db>0) bright_o = bright_o + db; else bright_o = bright_o - db; OCR1AH = 0; OCR1AL = bright; _delay_ms(10); } bright_o=bright; } }
ソースファイルのダウンロード


AVRSP-Gのヒューズビットの設定
内蔵クロック8MHz 分周比1/1 の設定です。

コンパイラは WinAVR-20070525 を使いました。

動画(youtubeにupしてみました)↓


1)乱数発生関数のrand()が結構メモリを食うかなーと思い、xorshift を考えていましたが、結局rand()を使用。
2)炎のちらちらのアルゴリズムはまだまだでしょう・・・
3)やっつけソフトなのでおかしなところがありましたらご連絡ください。
4)printf デバックのため、C++Builder をインストールしました。ブレッドボード上にRS232Cドライバ載せるのがメンドクサかったので(^^;