Arduino - ขัดจังหวะ
การขัดจังหวะหยุดการทำงานปัจจุบันของ Arduino เพื่อให้สามารถทำงานอื่น ๆ ได้
สมมติว่าคุณกำลังนั่งอยู่ที่บ้านสนทนากับใครบางคน ทันใดนั้นโทรศัพท์ก็ดังขึ้น คุณหยุดสนทนาและรับโทรศัพท์เพื่อคุยกับผู้โทร เมื่อคุณเสร็จสิ้นการสนทนาทางโทรศัพท์คุณจะกลับไปสนทนากับบุคคลนั้นก่อนที่โทรศัพท์จะดังขึ้น
ในทำนองเดียวกันคุณอาจนึกถึงกิจวัตรหลักเช่นการแชทกับใครบางคนเสียงโทรศัพท์ทำให้คุณหยุดแชท ขั้นตอนการให้บริการขัดจังหวะคือขั้นตอนการพูดคุยทางโทรศัพท์ เมื่อการสนทนาทางโทรศัพท์สิ้นสุดลงคุณจะกลับไปที่กิจวัตรหลักในการสนทนา ตัวอย่างนี้อธิบายอย่างชัดเจนว่าการขัดจังหวะทำให้โปรเซสเซอร์ทำงานอย่างไร
โปรแกรมหลักกำลังทำงานและทำหน้าที่บางอย่างในวงจร อย่างไรก็ตามเมื่อเกิดการขัดจังหวะโปรแกรมหลักจะหยุดลงในขณะที่มีการดำเนินกิจวัตรอื่น เมื่อกิจวัตรนี้เสร็จสิ้นโปรเซสเซอร์จะกลับไปที่รูทีนหลักอีกครั้ง
คุณสมบัติที่สำคัญ
คุณลักษณะสำคัญบางประการเกี่ยวกับการขัดจังหวะ -
การขัดจังหวะอาจมาจากแหล่งต่างๆ ในกรณีนี้เรากำลังใช้การขัดจังหวะฮาร์ดแวร์ที่เกิดจากการเปลี่ยนแปลงสถานะบนพินดิจิทัลตัวใดตัวหนึ่ง
การออกแบบ Arduino ส่วนใหญ่มีการขัดจังหวะฮาร์ดแวร์สองตัว (เรียกว่า "interrupt0" และ "interrupt1") แบบต่อสายกับพิน I / O แบบดิจิทัล 2 และ 3 ตามลำดับ
Arduino Mega มีการขัดจังหวะฮาร์ดแวร์หกตัวรวมถึงการขัดจังหวะเพิ่มเติม ("interrupt2" ถึง "interrupt5") บนพิน 21, 20, 19 และ 18
คุณสามารถกำหนดรูทีนโดยใช้ฟังก์ชันพิเศษที่เรียกว่า“ Interrupt Service Routine” (โดยปกติเรียกว่า ISR)
คุณสามารถกำหนดรูทีนและระบุเงื่อนไขที่ขอบขึ้นขอบตกหรือทั้งสองอย่าง ในเงื่อนไขเฉพาะเหล่านี้การขัดจังหวะจะได้รับการซ่อมบำรุง
เป็นไปได้ที่จะให้ฟังก์ชันนั้นดำเนินการโดยอัตโนมัติทุกครั้งที่มีเหตุการณ์เกิดขึ้นที่ขาอินพุต
ประเภทของการขัดจังหวะ
การขัดจังหวะมีสองประเภท -
Hardware Interrupts - เกิดขึ้นเพื่อตอบสนองต่อเหตุการณ์ภายนอกเช่นพินอินเทอร์รัปต์ภายนอกจะสูงหรือต่ำ
Software Interrupts- เกิดขึ้นตามคำสั่งที่ส่งมาในซอฟต์แวร์ อินเตอร์รัปต์ประเภทเดียวที่“ ภาษา Arduino” รองรับคือฟังก์ชัน attachInterrupt ()
การใช้ Interrupts ใน Arduino
อินเทอร์รัปต์มีประโยชน์มากในโปรแกรม Arduino เนื่องจากช่วยในการแก้ปัญหาเรื่องเวลา การใช้อินเทอร์รัปต์ที่ดีคือการอ่านตัวเข้ารหัสแบบหมุนหรือสังเกตอินพุตของผู้ใช้ โดยทั่วไป ISR ควรสั้นและเร็วที่สุด หากร่างของคุณใช้ ISR หลายรายการสามารถรันได้ครั้งละหนึ่งรายการเท่านั้น การขัดจังหวะอื่น ๆ จะดำเนินการหลังจากที่การขัดจังหวะปัจจุบันเสร็จสิ้นตามลำดับที่ขึ้นอยู่กับลำดับความสำคัญที่มี
โดยทั่วไปแล้วตัวแปรส่วนกลางจะใช้เพื่อส่งผ่านข้อมูลระหว่าง ISR และโปรแกรมหลัก เพื่อให้แน่ใจว่าตัวแปรที่ใช้ร่วมกันระหว่าง ISR และโปรแกรมหลักได้รับการอัปเดตอย่างถูกต้องให้ประกาศว่าเป็นตัวแปรที่ผันผวน
attachInterrupt Statement Syntax
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs;
//this function must take no parameters and return nothing.
//This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.
ค่าคงที่สามต่อไปนี้ถูกกำหนดไว้ล่วงหน้าเป็นค่าที่ถูกต้อง -
LOW เพื่อทริกเกอร์อินเทอร์รัปต์เมื่อใดก็ตามที่พินอยู่ต่ำ
CHANGE เพื่อทริกเกอร์การขัดจังหวะเมื่อใดก็ตามที่พินเปลี่ยนค่า
FALLING เมื่อใดก็ตามที่พินจากสูงไปต่ำ
Example
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.
void setup() {
pinMode(13, OUTPUT); //set pin 13 as output
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
//interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
digitalWrite(13, state); //pin 13 equal the state value
}
void blink() {
//ISR function
state = !state; //toggle the state when the interrupt occurs
}