Arduino文档阅读笔记-attachInterrupt()
attachInTerrupt()
有這個專業詞要知道:
Digital Pins:電子引腳
ISRs(Interrupt Service Routines):中斷服務程序
ISR(Interrupt Service Routine):中斷服務程序
?
attachInTerrupt()第一個參數為中斷的引腳號,一般使用digitalPinToInterrupt(pin)去設置。比如如果使用中斷引腳3,首先使用digitalPinToInterrupt(3),然后將其傳入attachInterrupt()
下面是各個板子對應的引腳號:
需要注意的地方:
在中斷函數里面delay()函數是不會工作的,millis()返回值不會增加,串口接收的數據可能會丟失,如果在中斷函數中要修改全局變量,需要把全局變量聲明中添加volatile關鍵字。
?
使用中斷的目的,就是為了更好的寫程序。這樣程序就不要用輪詢,不停的問,而是中斷一來就停止手上的工作,從而直接進行中斷函數的響應。
?
關于中斷服務程序(About Interrupt Service Routines)
ISR我個人覺得更正確的翻譯為中斷服務函數。ISR比較特殊,不能有參數和返回值,也不返回任何數據。
這里有幾點要注意的:
如果同時有多個ISR被觸發,只有一個ISP會被響應,這依賴于他們的優先級。delay()和millis()是不能用的,millis()他依賴于中斷計時器(這里就和寫C/C++的時候統計程序運行時間,在運行時間里面調用windows.h中的sleep,這個調用后連統計時間的函數都會被sleep掉)micros在前1-2ms是正常的,之后就不正常了。官方推薦在中斷函數中使用delayMicroseconds()這個函數。
在ISR中一般使用全局變量進行操作,在全局變量中要添加volatile關鍵字。
?
這些函數都是異步的操作:
關于參數:
下面是官方給出的示例代碼:
const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW;void setup() {pinMode(ledPin, OUTPUT);pinMode(interruptPin, INPUT_PULLUP);attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); }void loop() {digitalWrite(ledPin, state); }void blink() {state = !state; }?
?
總結
以上是生活随笔為你收集整理的Arduino文档阅读笔记-attachInterrupt()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考网络工程师笔记-综合知识3
- 下一篇: LinuxQt工作笔记-查看程序工作目录