ATmega328 - タイマ
ナビゲーションに移動
検索に移動
概要
タイマ1
タイマ1のコンペアマッチA割り込み
以下の例では、1秒間隔でタイマ割り込みを行い、10回のタイマ割り込みでLEDをトグルしている。
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_PIN PB5 // PB5ピンにLEDを接続
volatile uint8_t timer_count = 0; // 割り込みハンドラ内でカウントアップ
// 10秒ごとにリセット
// タイマ1のコンペアマッチA割り込みハンドラ
ISR(TIMER1_COMPA_vect)
{
timer_count++; // この変数の値が10に達した場合にLEDの状態を反転
if (timer_count >= 10) {
PORTB ^= (1 << LED_PIN); // LEDをトグル
timer_count = 0;
}
}
int main(void)
{
DDRB |= (1 << LED_PIN); // LEDピン(PB5)を出力に設定
// タイマ1の設定
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // CTCモード
OCR1A = 15624; // プリスケーラ(分周)を1024に設定
// 16[MHz]の場合の1秒間隔の値
TIMSK1 |= (1 << OCIE1A); // タイマ1のコンペアマッチA割り込みを有効化
sei(); // グローバル割り込みを有効化
while (1) {
// メイン処理
}
}
タイマ1のコンペアマッチB割り込み
以下の例では、1秒間隔でタイマ割り込みを行い、10回のタイマ割り込みでLEDをトグルしている。
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_PIN PB5 // PB5ピンにLEDを接続
volatile uint8_t timer_count = 0; // 割り込みハンドラ内でカウントアップ
// 10秒ごとにリセット
ISR(TIMER1_COMPB_vect)
{
timer_count++; // この変数の値が10に達した場合にLEDの状態を反転
if (timer_count >= 10) {
PORTB ^= (1 << LED_PIN); // LEDをトグル
timer_count = 0;
}
}
int main(void)
{
DDRB |= (1 << LED_PIN); // LEDピン(PB5)を出力に設定
// タイマ1の設定
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // CTCモード
OCR1A = 15624; // プリスケーラ(分周)を1024に設定
// 16[MHz]の場合の1秒間隔の値
OCR1B = 15624; // OCR1Bレジスタに、OCR1Aと同じ値を設定
TIMSK1 |= (1 << OCIE1B); // タイマのコンペアマッチB割り込みを有効化
sei(); // グローバル割り込みを有効化
while (1) {
// メイン処理
}
}