電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

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;
}