- วัสดุที่ต้องการ:
- อินเทอร์รัปต์คืออะไรและจะใช้งานที่ไหน:
- แผนภาพวงจรและคำอธิบาย:
- การจำลองการขัดจังหวะในไมโครคอนโทรลเลอร์ PIC:
- คำอธิบายรหัส:
- การทำงานของ PIC16F877A อินเตอร์รัปต์:
ในบทช่วยสอนนี้เราจะเรียนรู้วิธีใช้ External Interrupt ในไมโครคอนโทรลเลอร์ PICและทำไม / ที่ที่เราต้องการ นี่เป็นส่วนหนึ่งของลำดับของบทช่วยสอน PIC ที่เราเริ่มเรียนรู้ไมโครคอนโทรลเลอร์ PIC ตั้งแต่เริ่มต้น ดังนั้นบทช่วยสอนนี้จึงถือว่าคุณคุ้นเคยกับวิธีการตั้งโปรแกรม PIC MCU โดยใช้ MPLABX และวิธีการเชื่อมต่อ LCD กับ PIC หากไม่โปรดกลับไปที่ลิงก์ของพวกเขาและอ่านพวกเขารางเพราะฉันจะข้ามข้อมูลส่วนใหญ่ที่กล่าวถึงไปแล้ว
วัสดุที่ต้องการ:
- PIC16F877A Perf Board
- จอ LCD 16x2
- ปุ่มกด
- การเชื่อมต่อสายไฟ
- คณะกรรมการขนมปัง
- PicKit 3
อินเทอร์รัปต์คืออะไรและจะใช้งานที่ไหน:
ก่อนที่จะเข้าสู่วิธีการตั้งโปรแกรมไมโครคอนโทรลเลอร์ PICให้เราเข้าใจว่า Interrupt คืออะไรและเราจะต้องใช้มันที่ไหน นอกจากนี้ยังมีอินเตอร์รัปต์หลายประเภทในไมโครคอนโทรลเลอร์และ PIC16F877A มีประมาณ 15 รายการ อย่าให้เราสับสนในหัวของเราในตอนนี้
ดังนั้น! การขัดจังหวะในไมโครคอนโทรลเลอร์คืออะไร?
ดังที่เราทุกคนทราบดีว่าไมโครคอนโทรลเลอร์ถูกใช้เพื่อดำเนินการชุดของการเปิดใช้งาน (โปรแกรม) ที่กำหนดไว้ล่วงหน้าซึ่งจะทริกเกอร์เอาต์พุตที่จำเป็นตามอินพุต แต่ในขณะที่ไมโครคอนโทรลเลอร์ของคุณกำลังยุ่งอยู่กับการเรียกใช้โค้ดชิ้นเดียวอาจมีสถานการณ์ฉุกเฉินที่ส่วนอื่น ๆ ของโค้ดของคุณต้องได้รับการพิจารณาทันที โค้ดส่วนอื่น ๆ ที่ต้องได้รับการตรวจสอบทันทีควรถือว่าเป็นการขัดจังหวะ
ตัวอย่างเช่นให้เราพิจารณาว่าคุณกำลังเล่นเกมโปรดบนมือถือและตัวควบคุม (สมมติ) ในโทรศัพท์ของคุณกำลังยุ่งอยู่กับการโยนกราฟิกทั้งหมดที่จำเป็นเพื่อให้คุณสนุกกับเกม แต่จู่ๆแฟนของคุณก็โทรมาที่เบอร์ของคุณ ตอนนี้สิ่งที่เลวร้ายที่สุดที่จะเกิดขึ้นคือตัวควบคุมโทรศัพท์มือถือของคุณที่ละเลยการโทรหาแฟนของคุณเนื่องจากคุณยุ่งกับการเล่นเกม เพื่อป้องกันไม่ให้ฝันร้ายนี้เกิดขึ้นเราใช้สิ่งที่เรียกว่าอินเทอร์รัปต์
การขัดจังหวะเหล่านี้จะเป็นรายการที่ใช้งานอยู่เสมอสำหรับการกระทำบางอย่างที่จะเกิดขึ้นและเมื่อเกิดขึ้นพวกเขาเรียกใช้โค้ดส่วนหนึ่งจากนั้นจะกลับสู่ฟังก์ชันปกติ ชิ้นส่วนของรหัสนี้เรียกว่างานประจำบริการขัดจังหวะ (ISR) โครงการที่ใช้งานได้จริงโครงการหนึ่งซึ่งจำเป็นต้องมีการขัดจังหวะคือ“ วงจรวัดความเร็วดิจิตอลและเครื่องวัดระยะทางโดยใช้ไมโครคอนโทรลเลอร์ PIC”
ในไมโครคอนโทรลเลอร์มีสองหลักประเภทของการขัดจังหวะเป็นการขัดจังหวะภายนอกและการขัดจังหวะภายใน การขัดจังหวะภายในเกิดขึ้นภายใน Microntroller สำหรับการทำงานเช่น Timer Interrupts, ADC Interrupts เป็นต้นซอฟต์แวร์ขัดจังหวะเหล่านี้จะถูกกระตุ้นให้ทำงาน Timer หรือ ADC ตามลำดับ
การขัดจังหวะภายนอกคือสิ่งที่ผู้ใช้สามารถทริกเกอร์ได้ ในโปรแกรมนี้เราจะเรียนรู้วิธีใช้การขัดจังหวะภายนอกโดยใช้ปุ่มกดเพื่อทริกเกอร์อินเทอร์รัปต์ เราจะใช้ LCD เพื่อแสดงตัวเลขที่เพิ่มขึ้นจาก 0 ถึง 1,000 และเมื่อมีการขัดจังหวะเกิดขึ้นเราควรแจ้งให้ทราบจาก Interrupt Service Routine ISRจากนั้นกลับไปที่การเพิ่มตัวเลข
แผนภาพวงจรและคำอธิบาย:
แผนภาพวงจรสำหรับการใช้อินเตอร์รัปต์ PIC16F877 แสดงไว้ในภาพด้านบน คุณเพียงแค่ต้องเชื่อมต่อ LCD เข้ากับ PIC เหมือนที่เราทำในการเชื่อมต่อแบบสอน LCD
ตอนนี้ในการเชื่อมต่อขาขัดจังหวะเราควรมองไปที่แผ่นข้อมูลที่จะรู้ว่าที่ขาของ PIC จะใช้สำหรับการขัดจังหวะภายนอก ในกรณีของเรา i n PIC16F877Aจะใช้ RBO / INT 33 rd pin สำหรับการขัดจังหวะภายนอก คุณไม่สามารถใช้พินอื่นนอกจากพินนี้ การเชื่อมต่อ Pin สำหรับแผนภาพวงจรนี้แสดงในตารางด้านล่าง
ส. ไม่: |
หมายเลขพิน |
ชื่อพิน |
เชื่อมต่อกับ |
1 |
21 |
RD2 |
RS ของ LCD |
2 |
22 |
RD3 |
E ของ LCD |
3 |
27 |
RD4 |
D4 ของ LCD |
4 |
28 |
RD5 |
D5 ของ LCD |
5 |
29 |
RD6 |
D6 ของ LCD |
6 |
30 |
RD7 |
D7 ของ LCD |
7 |
33 |
RBO / INT |
ปุ่มกด |
เราได้เปิดใช้งานตัวต้านทานแบบดึงขึ้นภายในบน PORT B ดังนั้นเราจึงสามารถเชื่อมต่อพิน RB0 กับกราวด์ได้โดยตรงผ่านปุ่มกด ดังนั้นเมื่อใดก็ตามที่พินนี้ได้รับ LOW การขัดจังหวะจะถูกทริกเกอร์
การเชื่อมต่อสามารถทำได้บนบอร์ด Bread ดังที่แสดงด้านล่าง
หากคุณติดตามบทเรียนของเราคุณน่าจะคุ้นเคยกับ Perf Board ที่ฉันเคยใช้ที่นี่ ถ้าไม่คุณไม่จำเป็นต้องคิดมากเพียงแค่ทำตามแผนภาพวงจรและคุณจะได้รับสิ่งต่างๆ
การจำลองการขัดจังหวะในไมโครคอนโทรลเลอร์ PIC:
การจำลองสำหรับโครงการนี้สร้างขึ้นโดยใช้ Proteus
เมื่อคุณจำลองโครงการคุณจะเห็นลำดับของตัวเลขที่เพิ่มขึ้นบนจอ LCD สิ่งนี้เกิดขึ้นภายในลูปหลักและเมื่อใดก็ตามที่กดปุ่มกด LCD ควรแสดงว่าได้เข้าสู่ ISR แล้ว คุณสามารถทำการแก้ไขในโค้ดและลองทดสอบได้ที่นี่
คำอธิบายรหัส:
คุณสามารถดูโค้ดทั้งหมดสำหรับโปรเจ็กต์นี้ได้ที่ส่วนท้ายของบทช่วยสอนนี้ อย่างไรก็ตามโปรแกรมจะแบ่งออกเป็นส่วนที่สำคัญและอธิบายไว้ด้านล่างเพื่อความเข้าใจที่ดีขึ้นของคุณ
เช่นเดียวกับโปรแกรมทั้งหมดที่เราต้องเริ่มต้นรหัสโดยกำหนดค่าพินสำหรับพินที่เราใช้ในโปรแกรมของเรา นอกจากนี้เราจำเป็นต้องกำหนดด้วยว่าเรากำลังใช้ RB0 / INT เป็นพินอินเทอร์รัปต์ภายนอกไม่ใช่เป็นพินอินพุตหรือเอาต์พุต ด้านล่างบรรทัดของรหัสช่วยให้การต้านทานดึงขึ้นภายใน PORTB โดยการทำ 7 THบิตเป็น 0
OPTION_REG = 0b00000000;
จากนั้นเราเปิดใช้งานการขัดจังหวะส่วนกลาง / อุปกรณ์ต่อพ่วงและประกาศว่าเรากำลังใช้ RB0 เป็นพินอินเทอร์รัปต์ภายนอก
GIE = 1; // เปิดใช้งาน Global Interrupt PEIE = 1; // เปิดใช้งาน Peripheral Interrupt INTE = 1; // เปิดใช้งาน RB0 เป็นพินขัดจังหวะภายนอก
เมื่อกำหนดพิน RB0 เป็นพินอินเทอร์รัปต์ภายนอกทุกครั้งที่มีค่าต่ำค่าสถานะอินเทอร์รัปต์ภายนอก INTF จะกลายเป็น 1 และโค้ดภายในฟังก์ชันการขัดจังหวะโมฆะจะถูกเรียกใช้เนื่องจากจะมีการเรียก Interrupt Service Routine (ISR)
โมฆะอินเตอร์รัปต์ ISR_example () {if (INTF == 1) // ตรวจพบการขัดจังหวะภายนอก {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ป้อน ISR"); INTF = 0; // ล้างค่าสถานะขัดจังหวะหลังจากเสร็จสิ้น __delay_ms (2000); Lcd_Clear (); }}
อย่างที่คุณเห็นฉันตั้งชื่อฟังก์ชันขัดจังหวะเป็น ISR_example คุณสามารถตั้งชื่อได้ตามที่คุณต้องการ ภายในฟังก์ชันขัดจังหวะเราจะตรวจสอบว่าค่าสถานะ INTF สูงหรือไม่และดำเนินการตามที่จำเป็น เป็นสิ่งสำคัญมากที่จะต้องล้างค่าสถานะขัดจังหวะเมื่อคุณทำกิจวัตรเสร็จแล้ว จากนั้นโปรแกรมจะกลับไปที่ฟังก์ชันหลักที่เป็นโมฆะ การหักบัญชีนี้จะต้องดำเนินการโดยซอฟต์แวร์โดยใช้ไลน์
INTF = 0; // ล้างค่าสถานะขัดจังหวะหลังจากเสร็จสิ้น
ภายในฟังก์ชั่นหลักเราเพียงแค่เพิ่มตัวเลขทุกๆ 500 ms และแสดงบนหน้าจอ LCD เราไม่มีบรรทัดเฉพาะสำหรับตรวจสอบสถานะของพิน RB0 การขัดจังหวะจะยังคงทำงานอยู่เสมอและเมื่อใดก็ตามที่กดปุ่มกดมันจะกระโดดออกจาก void main และดำเนินการตามบรรทัดใน ISR
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("หมายเลข:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); หมายเลข ++;
การทำงานของ PIC16F877A อินเตอร์รัปต์:
เมื่อคุณเข้าใจวิธีการทำงานของอินเทอร์รัปต์แล้วคุณสามารถลองใช้ฮาร์ดแวร์และซอรอบ ๆ ตัวได้ โปรแกรมนี้เป็นตัวอย่างพื้นฐานของการขัดจังหวะภายนอกซึ่งจะเปลี่ยนการแสดงผลของหน้าจอ LCD เมื่อตรวจพบการขัดจังหวะ
การทำงานทั้งหมดของโครงการสามารถพบได้ในวิดีโอด้านล่างหวังว่าคุณจะเข้าใจเกี่ยวกับการขัดจังหวะและสถานที่ / วิธีการใช้งาน หากคุณมีข้อสงสัยใด ๆ คุณสามารถติดต่อฉันผ่านฟอรัมหรือผ่านส่วนความคิดเห็น