Re: The history of "M&Y"

Team "M&Y" and "花鳥風月"
the soliloquy of the father
毎日更新!

AVRねた その24 タイマー割り込み

2009-07-28 | AVRねた

よ~し だんだん思い出してきたゾ。

それじゃ、調子に乗って、タイマー割り込みを・・・

このプログラムを動作させると、PC4に接続したLEDが一秒毎に点滅します。

#include <avr/io.h>
#include <avr/interrupt.h>

#define LED_SET DDRC |= 0x10
#define LED_ON  PORTC |= 0x10
#define LED_OFF PORTC &= ~0x10

volatile unsigned long cnt = 0;

ISR( SIG_OVERFLOW1 ) // 10ms毎に割り込み
   {

   TCNT1 = 0x10000 - 1250;
   cnt++;
   }

int main( void )

   {

   LED_SET;
   TCCR1A = 0x00;
   TCCR1B = 0x03;                 // 64分周
   TCNT1 = 0x10000 - 1250; // 10ms毎にオーバーフロー

   TIFR1 |= 0x01;                     // オーバーフロー許可
   TIMSK1 |= 0x01;                  // タイマ割り込み許可

   sei( );                                     // 割り込み有効

   while(1)
      {
      cnt = 0;
      LED_ON;
      while( cnt < 20 );               // 0.2秒点灯
      LED_OFF;
      while( cnt<100 );               // 0.8秒消灯
      }
   }

0.01秒(10ms)毎にグルーバル変数 cnt がインクリメントされます。

1250のところを12500にすると、10ms毎のカウントではなく、100ms毎のカウントになります。 

確か前回は、volatileを知らなくて、ハマッテいました。



この1250という数値は以下の式で算出しました。

1(秒) ÷ 8,000,000(クロックHz) × 64(分周) × 定数 = 0.01(秒)

となる定数を逆算すると 1,250 になります。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする