AVRでLEDホタル(2)の続きです。
ELMさんというかchanさんのところで、フルカラーLEDを使って遊ぶ記事を見つけました。8ピンAVRの活用という記事の中の「LEDフラッシャー その2」です。赤→黄→緑→水色→青→紫→赤の順に色を変化させていくと「色相が回転」するのだそうです。途中をなめらかに変化させるために中間値をPWMで出力します。
chanさんの元のコードはアセンブラでしたが、Cにしちゃいました。たぶん、そんなに間違ってないと思います。
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); // 紫→赤 } }