// 『昼夜逆転』工作室 http://jsdiy.web.fc2.com/ // tiny2313 // ATtiny2313テストボード // // タイマ割り込みでPWM的輝度調整 // ボタンA0で輝度調整、ボタンA1で点滅/連続点灯の切り替え // チャタリング対策も組み込む // // 2008/09/16 v100 初版 (ATtiny2313TestF3.c) #define F_CPU 1000000UL //1MHz #include #include #include typedef unsigned char byte; volatile byte ff; //LED点滅フラグ 1:on 0:off volatile int cnt; //計時カウンタ ISR(TIMER0_COMPA_vect) { //0.5secごとにLED出力反転 //8/1000000 * 250 = 1/500secごとの呼び出し //1/500sec * n回 = 0.5sec → n = 250回の呼び出しで0.5sec //ただし+-alphaで微調整は必要 cnt++; if (cnt == 257) { ff = 1 - ff; //フリップフロップ cnt = 0; } } int main(void) { byte bo; //ポートB(LED)出力値 byte don; //LED連続点灯on/off 1:on 0:off(点滅モード) byte pw; //点灯許可フラグ 1:点灯許可 0:非許可 byte s, ps; //スイッチ入力 int e; //輝度 8段階 e/8(%) DDRB = 0b00000111; //LEDが3個 B2,B1,B0 PORTA = 0b00000011; //スイッチが2個 A1,A0 TCCR0A = 0b00000010; //CTC動作 TCCR0B = 0b00000010; //clk/8 = 1MHz/8 → タイマの周期は8/1Meg(sec) OCR0A = 250; //割り込み周期 (8/1Meg * n)[sec] TIMSK = 0b00000001; //比較一致割り込み cnt = 0; ff = 1; don = 1; pw = 1; ps = 0b00000011; e = 8; sei(); //割り込み許可 while (1) { s = PINA; if (ps != s) { //スイッチA0 輝度調整 if (~s & 0b00000001) if (--e == 0) e = 8; //スイッチA1 点滅/連続点灯の切り替え if (~s & 0b00000010) don = 1 - don; ps = s; _delay_ms(10); } //経過時間による点灯許可切り替え pw = ((cnt & 7) < e) ? 1 : 0; bo = (pw && (don || ff)) ? 0b00000111 : 0b00000000; PORTB = bo | 0b00000001; //輝度比較のためB0は常に全開点灯とする } }