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
}