avr-gcc で工作(その3)
avr-gcc で工作(その3)
よく考えてみると avr-gccで工作 ってタイトルは変です。変ですが、始めてしまったので仕方ありません。このまま通すことにしましょう。
ということで、LEDの点滅プログラムをタイマー割り込みにしてみました。AT90S8535 はタイマーが3つあります。Timer0 が 8bit、Timer1 が 16bit、Timer2 が 8bit です。ここでは Timer2 を使っています。
1024のプリスケーラをかまして8bit(256)数えてオーバーフローすると割り込みがかかるようにしてあります。先の回路ではクロックを 8MHz にしてありますので、1024*256/8M で 32.768msec ごとに割り込みルーチンに飛んできます。そのままだと点滅が速いと感じたので、割り込み10回で1点滅周期となるようにしてみました。
以下ソースコード
/* PORTA LED blinking */ #include#include #include #include #define _COUNTER 5 enum { ON, OFF }; volatile uint16_t cnt = _COUNTER; volatile uint8_t led = ON; SIGNAL(SIG_OVERFLOW2) { if (!(--cnt)) { cnt = _COUNTER; switch (led) { case ON: led = OFF; outb(PORTA, 0x00); break; case OFF: led = ON; outb(PORTA, 0x01); break; } } } void ioinit (void) { /* tmr2 is prescaled by 1024 */ TCCR2 = _BV (CS22) | _BV (CS21) | _BV (CS20); /* enable PA0 as output */ DDRA = _BV (PA0); timer_enable_int (_BV (TOIE2)); /* enable interrupts */ sei (); } int main(void) { ioinit(); for (;;) ; return 0; }