よ~し だんだん思い出してきたゾ。
それじゃ、調子に乗って、タイマー割り込みを・・・
このプログラムを動作させると、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 になります。