一個重點,如果在使用中斷的同時需要在中斷服務函式裡面使用通訊介面 ( 如 I2C )
則必須在中斷服務函式的 第一行加上 sei( ); 並在最後一行加上 cli();
這樣才可以在中斷裡面使用通訊介面
其原因在於,在 Arduino 的設計中,如果我們進入中斷服務函式時
它很雞婆的為了避免中斷服務函式裡面的程式沒有計算完就再次進入中斷
(也就是你的中斷觸發時間太短了,來不及算完)
所以它在你進入中斷服務函式時會自動幫你把中斷關閉,以避免上述情形
但偏偏通訊介面 (如 I2C 的函式庫 Wire.h ) 需要使用到中斷來進行
但 Arduino 又把它關了
所以我們需要在一進入自己設立的中斷服務函式時就再次將中斷手動開啟
也就是 sei();
而在計算完畢後,我們也需要將它關起來
也就是 cli()
我將定期推出程式語言的新手教學影片
參考連結
【教程】關於中断(Interrupt)的一些五四三... 中斷 . .
使用TimerOne庫(Timer1)定時做多件事(教程for定时器 timer1的使用)