Arduino定時器中斷
從 YFRobotwiki
當你想讓代碼在一個固定的時間間隔後執行時,你可以很容易的用delay()函數來實現。但是,這只是讓程序暫停一個特定的時間段。特別是如果你需要同時讓處理器做其他處理時,這麼做同時也是一種浪費
這時候就是定時器(Timer)和中斷(Interrupt)的用武之地了。
Arduino UNO有三個timer
- timer0 - 一個被Arduino的 delay() ,millis() 和 micros()使用的8位定時器
- timer1 - 一個被Arduino的 Servo()庫使用的16位定時器
- timer2 - 一個被Arduino的 Tone()庫使用的8位定時器
"Arduino Mega"板有另外三個可使用的timer3,4,5,而不是只有timer0,1,2
在以下的例子中,我們將在我們的中斷使用timer1。顯然,如果你用了Servo()庫就會有衝突,所以你應該選擇其他timer。
下面是一個基本的中斷驅動程序。這是基本的LED閃光燈程序。但是現在我們用中斷而不是delay()來每半秒開啟和關閉LED燈一次,從而實現讓LED每秒閃一次的效果。
/*
timer1 中断实例
LED闪光灯每秒闪亮一下
*/
#define ledPin 13 //设置输出口为13口
int timer1_counter;
void setup() {
pinMode(ledPin, OUTPUT);
//初始化定时器1
noInterrupts(); //禁止所有中断
TCCR1A = 0;
TCCR1B = 0;
//为我们的中断设置timer1_counter为正确的时间间隔
// timer1_counter = 64911; //预加载timer1为65536-16MHz/256/100Hz
// timer1_counter = 64286; //预加载timer1为65536-16MHz/256/50HZ
timer1_counter = 34286; //预加载timer1为65536-16MHz/256/2Hz
TCNT1 = timer1_counter; //预加载timer
TCCR1B |= (1 << CS12); //256 分频器(256 prescaler?)
TIMSK1 |= (1 << TOIE1); //启用定时器溢出中断
interrupts(); //允许所有中断
}
ISR(TIMER1_OVF_vect) { //常规中断服务
TCNT1 = timer1_counter; //预加载timer digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
void loop() {
//你自己的程序
}