บทที่ 5 Interrupt

Download Report

Transcript บทที่ 5 Interrupt

บทที่ 5
Interrupt
เทอดศักดิ์ ลิ่วหาทอง
สาขาวิชาอิเล็กทรอนิกส์
สถาบันเทคโนโลยีพระจอมเกล้ าเจ้ าคุณทหาร
ลาดกระบัง
Interrupt
• ปั ญหาของการเขียนโปรแกรมติดต่อกับอุปกรณ์ตอ่ พ่วงจานวนมากคือ
– ไม่ทราบเวลาที่แน่นอนที่อปุ กรณ์ตอ่ พ่วงเหล่านันต้
้ องการติดต่อกับ PIC
– ทาให้ PIC ต้ องทาการวนตรวจสอบตลอดเวลาว่าเมื่อไหร่อปุ กรณ์ตอ่ พ่วง
ต้ องการที่จะติดต่อด้ วย
– เทคนิคที่ใช้ ในการตรวจสอบมีอยู่ 2 เทคนิคคือ
• Polling
• Interrupt
Polling
• Polling เป็ นการเขียนโปรแกรมเพื่อตรวจสอบโลจิกที่ได้ รับจาก
อุปกรณ์ตอ่ พ่วงตลอดเวลาว่าเมื่อไหร่ที่อปุ กรณ์ตอ่ พ่วงต้ องการที่จะ
ติดต่อด้ วย
• ตัวอย่างเช่นการตรวจสอบการกดสวิทช์ โปรแกรมจะ
ต้ องตรวจสอบตลอดเวลาว่าเมื่อไหร่ที่ผ้ ใู ช้ กดสวิทช์
• ข้ อดีของ Polling คือเขียนโปรแกรมง่าย และ
ตรวจสอบการทางานของโปรแกรมได้ ง่าย
• ข้ อเสียคือ PIC จะต้ องเสียเวลาในการตรวจสอบการ
กดสวทช์ตลอดเวลาทาให้ ไม่สามารถทางานอย่างอื่นได้
while(1)
{
if(PORTBbits.RB0==0)
{
i++;
if(i==8) i=7;
PORTD = LED[i];
Delay10KTCYx(100);
}
if(PORTAbits.RA5==0)
{
i--;
if(i<0) i=0;
Vcc= LED[i];
PORTD
Delay10KTCYx(100);
}
}
RB0
Interrupt
• Interrupt เป็ นวงจรดิจิตอลที่อยูใ่ น PIC ทาการตรวจสอบโลจิกที่
ได้ รับจากอุปกรณ์ตอ่ พ่วง
• เมื่อวงจรตรวจพบว่าอุปกรณ์ตอ่ พ่วงต้ องการติดต่อด้ วยก็จะไปเรี ยก
โปรแกรมที่เหมาะสมต่อไป (Interrupt Service Routine
ISR)
Vcc
INT0
Interrupt Service Routine
i++;
if(i==8) i=7;
PORTD = LED[i];
Delay10KTCYx(100);
Interrupt Source
• สัญญาณ Interrupt ของ PIC18F8722 มีดงั นี ้
• TMR0, TMR1, TMR2, TMR3, TMR4 เป็ นสัญญาณ
Interrupt ที่เกิดจากวงจร Timer ที่อยูภ่ ายใน PIC
• RB เป็ นสัญญาณ Interrupt ที่เกิดจากการตรวจสอบว่ามีบทิ ใดบิท
หนึง่ ของ RB<0:7> มีการเปลี่ยนสถานะ
• INT0, INT1, INT2, INT3 เป็ นสัญญาณ Interrupt ที่เกิด
จากอุปกรณ์ตอ่ พ่วงภายนอกส่งสัญญาณมาบอก PIC ว่าต้ องการ
ติดต่อด้ วย
Interrupt Priority
• เนื่องจาก PIC สามารถรับสัญญาณ Interrupt ได้ หลายสัญญาณ
• ดังนันจึ
้ งมีโอกาสที่จะมีสญ
ั ญาณ Interrupt หลายสัญญาณส่งไป
ให้ PIC พร้ อมๆกัน หรื อในเวลาที่ใกล้ เคียงกัน
• ตัวอย่างเช่นผู้ใช้ กดสวิทช์เพื่อส่งสัญญาณ INT0 ไปบอก PIC ว่า
ต้ องการติดต่อด้ วย พร้ อมกับ TMR0 ส่งสัญญาณ Interrupt ไป
บอก PIC ให้ อ่านค่าอุณหภูมิจาก Thermal Sensor
• ดังนันจะต้
้ องมีวิธีการเพื่อตัดสินใจว่าจะให้ PIC ทาการติดต่อกับผู้ใช้
ก่อน หรื อจะให้ อ่านค่าจาก Thermal Sensor ก่อน
Interrupt Priority
• ถ้ า PIC ตัดสินใจติดต่อกับผู้ใช้ ก่อนที่จะไปอ่านค่าจาก Thermal
Sensor แสดงว่า INT0 มี Priority สูงกว่า TMR0
• แต่ถ้า PIC อ่านค่าจาก Thermal Sensor ก่อนติดต่อกับผู้ใช้
แสดงว่า TMR0 มี Priority สูงกว่า INT0
• ถ้ ามีสญ
ั ญาณ Interrupt ที่มี Priority สูง (High Priority)
PIC จะไปเรี ยกโปรแกรมที่เก็บไว้ ใน Address ที่ 0008H
• แต่ถ้ามีสญ
ั ญาณ Interrupt ที่มี Priority ต่า (Low
Priority) PIC จะไปเรี ยกโปรแกรที่เก็บไว้ ใน Address ที่
0018H
Interrupt
void main (void)
{
กำหนดคุณสมบัติของ I/O Port,
ADC, Timer และ
Interrupt
กำหนดค่ำเริ่ มต้นของ I/O Port
while (1)
{
0018H
Timer Interrupt (Low Priority Interrupt)
0008H
INT0 Interrupt (High Priority Interrupt)
{
{
อ่ำนค่ำจำก Thermal Sensor
คำสัง่ ที่ 1;
คาสัง่ ที่ 2;
:
คาสัง่ ที่ N
}
}
}
คาสัง่ ที่ 1;
คาสัง่ ที่ 2;
คาสัง่ ที่ 3;
:
คาสัง่ ที่ N
ติดต่อกับผูใ้ ช้
}
คาสัง่ ที่ 1;
คาสัง่ ที่ 2;
:
คาสัง่ ที่ N
Interrupt Bit
• สัญญาณ Interrupt แต่ละสัญญาณมี Flag, Enable และ
Priority Bit เพื่อใช้ ควบคุมการทางานดังนี ้
• Flag Bit (TMR0IF, TMR1IF, TMR2IF, TMR3IF,
TMR4IF, RBIF, INT0IF, INT1IF, INT2IF, INT3IF) ถ้ า
เป็ น 1 คือตรวจสอบพบสัญญาณ Interrupt ถ้ าเป็ น 0 คือไม่พบ
สัญญาณ Interrupt
• Enable Bit (TMR0IE, TMR1IE, TMR2IE, TMR3IE,
TMR4IE, RBIE, INT0IE, INT1IE, INT2IE, INT3IE)
ถ้ าเป็ น 1 คือ Enable ถ้ าเป็ น 0 คือ Disable
Interrupt Bit
• Priority Bit (TMR0IP, TMR1IP, TMR2IP, TMR3IP,
TMR4IP, RBIP, INT0IP, INT1IP, INT2IP, INT3IP) ถ้ า
เป็ น 1 คือตังให้
้ เป็ น High Priority ถ้ าเป็ น 0 ตังให้
้ เป็ น Low
Priority
Interrupt Bit
• นอกจาก Flag, Enable, และ Priority ที่สญ
ั ญาณ
Interrupt แต่ละตัวต้ องมีแล้ ว ยังมีบทิ ที่ใช้ ควบคุมการทางาน
ทังหมดของสั
้
ญญาณ Interrupt คือ
• IPEN (Interrupt Priority Enable) ถ้ าเป็ น 1 เป็ นการ
Enable การทางานแบบ Priority ถ้ าเป็ น 0 คือไม่มีการทางาน
แบบ Priority
IPEN=1
• GIEH (Global Interrupt Enable High) ถ้ าเป็ น 1 จะ
Enable สัญญาณ Interrupt ทุกตัวที่มี Priority Bit = 1
ถ้ าเป็ น 0 จะ Disable สัญญาณ Interrupt ทุกตัวที่มี
Priority Bit = 1
• GIEL (Global Interrupt Enable Low) ถ้ าเป็ น 1 จะ
Enable สัญญาณ Interrupt ทุกตัวที่มี Priority Bit = 0
ถ้ าเป็ น 0 จะ Disable สัญญาณ Interrupt ทุกตัวที่มี
Priority Bit = 0
IPEN=1
• ถ้ า Flag Bit ของสัญญาณ Interrupt แบบ High Priority
เท่ากับ 1 PIC จะไปเรี ยกโปรแกรมที่ Address 0008H
• ถ้ า Flag Bit ของสัญญาณ Interrupt แบบ Low Priority
เท่ากับ 1 PIC จะไปเรี ยกโปรแกรมที่ Address 0018H
IPEN=0
• PEIE (Peripheral Interrupt Enable) ถ้ าเป็ น 1 จะ
Enable สัญญาณ Interrupt จากอุปกรณ์ตอ่ พ่วงทุกตัว ถ้ าเป็ น
0 จะ Disable สัญญาณ Interrupt จากอุปกรณ์ตอ่ พ่วงทุกตัว
• GIE (Global Interrupt Enable) ถ้ าเป็ น 1 จะ Enable
สัญญาณ Interrupt ทุกตัว ถ้ าเป็ น 0 จะ Disable สัญญาณ
Interrupt ทุกตัว
• เมื่อ Flag Bit ของสัญญาณ Interrupt ตัวใดตัวหนึง่ เป็ น 1 PIC
จะไปเรี ยกโปรแกรมที่ Address 0008H
Interrupt Respond
• เมื่อ Flag Bit = 1 และ PIC เรี ยกใช้ โปรแกรม Interrupt
Service Routine (ISR) แล้ ว จะทาให้ GIEH = 0, GIEL =
0 (ถ้ า IPEN = 1) หรื อ GIE = 0 (ถ้ า IPEN = 0)
• เพื่อป้องกันไม่ให้ PIC รับสัญญาณ Interrupt อื่นอีก
• สัญญาณ Interrupt แบบ High Priority สามารถแทรกการ
ทางานของ Interrupt แบบ Low Priority แต่สญ
ั ญาณ
Interrupt แบบ Low Priority ไม่สามารถแทรกการทางานของ
Interrupt แบบ High Priority
Interrupt Respond
• เนื่องจาก PIC มีสญ
ั ญาณ Interrupt อยูห่ ลายสัญญาณ ดังนัน้
เมื่อ ISR ถูกเรี ยกใช้ แล้ ว โปรแกรมจะต้ องทาการตรวจสอบว่า เป็ น
สัญญาณ Interrupt ชนิดใด โดยการตรวจสอบว่า Flag Bit ของ
Interrupt ตัวใดเป็ น 1
• เพื่อป้องกันไม่ให้ PIC รับสัญญาณ Interrupt อื่นอีก
• เมื่อออกจาก ISR แล้ ว GIE = 1 (หรื อ GIEH=1, GIEL=1) โดย
อัตโนมัติเพื่อให้ PIC สามารถรับสัญญาณ Interrupt ตัวใหม่ได้