อินเตอร์รัพท์ (Interrupt) คือการขัดจังหวะการทำงานของโปรแกรมปกติ เมื่อเกิดเหตุการณ์บางอย่างขึ้น ทำให้ซีพียูไปทำงานที่กำหนดไว้เมื่อเกิดอินเตอร์รัพท์ หากเปรียบเทียบการเกิดอินเตอร์รัพท์กับชีวิตประจำวันละก็ มันก็จะเหมือนกับตอนที่เรากำลังดูทีวีอยู่ แต่มีคนโทรเข้ามาในโทรศัพท์มือถือ ทำให้เราต้องหยุดดูทีวีแล้วไปรับโทรศัพท์ เมื่อคุยโทรศัพท์เสร็จแล้วจึงกลับมาดูทีวีตามเดิม
แบ่งตามชนิดของการเกิดได้ดังนี้
การควบคุมอินเตอร์รัพท์ คือการควบคุมว่าจะให้ซีพียูตอบสนองต่ออินเตอร์รัพท์หรือไม่ แบ่งได้ดังนี้
การควบคุมอินเตอร์รัพท์จะใช้ในกรณีที่ต้องการให้ซีพียูกระทำคำสั่งที่ไม่สามารถหยุดการทำงานได้ เช่น การนับเวลา หากมีการอินเตอร์รัพท์เกิดขึ้นจะทำให้การนับเวลาคลาดเคลื่อนได้
ใน Arduino การใช้งานอินเตอร์รัพท์จากภายนอกใช้เพียงแค่การสร้างฟังก์ชั่นรอรับ แล้วจึงใช้คำสั่งที่กำหนดว่าจะให้เกิดอินเตอร์รัพท์เมื่อไร แต่หากเป็นการอินเตอร์รัพท์จากภายในจะค่อนข้างยุ่งยากมากๆ ดังนั้นในบทความนี้จึงจะกล่าวถึงการใช้อินเตอร์รัพท์จากภายนอกเท่านั้น
ในบอร์ด Arduino จะมีพอร์ตที่สามารถใช้อินเตอร์รัพท์ได้แบบจำกัด โดยพอร์ตที่สามารถใช้อินเตอร์รัพท์ได้ในบอร์ด Arduino แต่ละรุ่นก็จะแตกต่างกัน ซึ่งสามารถดูได้ตามตารางด้านล่างนี้
Board | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
Uno, Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
Leonardo | 3 | 2 | 0 | 1 | 7 | |
Due | (see below) |
ในการสร้างอินเตอร์รัพท์ จะใช้ลำดับขาอินเตอร์รัพท์มาใส่ในฟังก์ชั่น เช่น ในตาราง บอร์ด Arduino Uno มีพอร์ต 2 เป็นขาอินเตอร์รัพท์ลำดับที่ 0 ดังนั้นเมื่อนำไปใช้ในคำสั่ง ต้องนำหมายเลข 0 ไปใส่ ส่วนใน Arduino Due สามารถใช้งานอินเตอร์รัพท์ได้ทุกขา หากนำไปใส่ในคำสั่ง ก็สามารถนำหมายเลขขาไปใส่ได้เลย
คำสั่ง attachInterrupt() เป็นคำสั่งกำหนด และสร้างอินเตอร์รัพท์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบคำสั่ง attachInterrupt(interrupt, ISR, mode)
ตัวอย่างการใช้งาน
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); attachInterrupt(0, TriggerLED, FALLING); // ใช้งานขาอินเตอร์รัพท์ลำดับ 0 หรือขา D2 ใน Arduino Uno R3 // เรียกฟังก์ชั่น TriggerLED() ขึ้นมาทำงาน เมื่อเกิดอินเตอร์รัพท์ขึ้น // เกิดอินเตอร์รัพท์เมื่อรูปแบบเป็น FALLING หรือก็คือจากสถานะ HIGH เป็น LOW // จากที่กำหนดไว้ หากใช้พอร์ต D2 ใน Arduino Uno R3 ต่ออยู่กับสวืตซ์ เมื่อ // ทำการกดสวิตซ์ จะทำให้สถานะเปลี่ยนจาก LOW เป็น HIGH พอปล่อยสวิตซ์ สถานะ // จะเปลี่ยนจาก HIGH เป็น LOW ทำให้เกิดการอินเตอร์รัพท์ขึ้น แล้วไปเรียกฟังก์ชั่น // TriggerLED() ขึ้นมาทำงาน } void loop() { delay(10); } void TriggerLED() { digitalWrite(ledPin, !digitalRead(ledPin)); }
วงจร
มีด้วยกัน 2 คำสั่ง คือ
รูปแบบ detachInterrupt(interrupt)
คำสั่ง detachInterrupt() คือคำสั่งที่ใช้ในการยกเลิกการใช้งานอินเตอร์รัพท์ โดยพารามิเตอร์ interrupt ต้องใส่เป็นลำดับขาอินเตอร์รัพท์ หรือใน Arduino Due จะต้องใส่เป็นหมายเลขขา