/***** タイマー2 オーバーフロ割り込みテスト *****/ // PB2,3,4,5にパルスを出力 オシロで観察できるよう #define tcnt2base 102 // timer2のTCNT2のBOTTOM値、102で約10ms(CK/1024) // 254で2パルス (256-2) // 102だと154パルスで 9.856ms 101.46Hz // 101だと155パルスで 9.920ms 100.81 // 100だと156パルスで 9.984ms 100.16 // 99だと157パルスで10.048ms 99.52 // タイマー2 オーバーフロー割込 ISR(TIMER2_OVF_vect) { // D13ポートにパルス PORTB |= (1 << PB5); // D13 PB5 on PINB |= (1 << PB2); // D10 PB2 トグル TCNT2 = tcnt2base; // TCNT2更新 PORTB &= ~(1 << PB5); // D13 PB5 off } /***** SETUP *****/ void setup() { DDRB = 0b00111111; // PB5~PB0 outputに // ***** Timer2 Setting ***** // ASSR: -, EXCLK, AS2, TCN2UB, OCR2AU, OCR2BUB, TCR2AUB, TCR2BUB // TIMSK2: -, -, -, -, -, OCIE2B, OCIE2A, TOIE2 // TCCR2A: COM2A1, COM2A0, COM2B1, COM2B0, -, -, WGM21, 1GM20 // TCCR2B: FOC2A, FOC2B, -, -, WGM22, CS22, CS21, CS20 TIMSK2 &= ~(_BV(OCIE2A) | _BV(TOIE2)); // 割り込み禁止 ASSR &= ~_BV(AS2); // システムクロック選択 TCCR2A &= ~(_BV(WGM21) | _BV(WGM20)); // 標準動作(カウンタ) TCCR2B &= ~_BV(WGM22); TCCR2B |= (_BV(CS22) | _BV(CS21) | _BV(CS20)); // ck/1024, 64us/count TCNT2 = tcnt2base; // timer2のTCNT2のBOTTOM値をセット TIMSK2 |= _BV(TOIE2); // timer2割り込み許可 } /***** LOOP *****/ void loop() { PINB |= (1 << PB4); // D12 PB4 トグル操作 if(TCNT2 == 255) PORTB |= (1 << PB3); // 255の時H出力 else PORTB &= ~(1 << PB3); }