150 likes | 330 Views
Chapter 7 Interrupt. จุดประสงค์ : เพื่อศึกษากลไกการทำงานของการขัดจังหวะ ( Interrupt ) ในระบบ Microprocessor และสามารถใช้งานการขัดจังหวะในระบบ MCS-51 ได้.
E N D
Chapter 7 Interrupt จุดประสงค์ : เพื่อศึกษากลไกการทำงานของการขัดจังหวะ( Interrupt ) ในระบบ Microprocessor และสามารถใช้งานการขัดจังหวะในระบบ MCS-51 ได้
ในการทำงานทั่วไป ถ้าเราต้องการตรวจสอบสถานะใดสถานะหนึ่งเช่น ต้องการตรวจสอบว่า Timer เกิด Overflow หรือต้องการตรวจสอบว่ามีการรับส่งผ่านข้อมูล Serial Port จะมีวิธีในการตรวจสอบอยู่ 2 วิธี Pulling : วิธีการนี้จะใช้การวนตรวจสอบเงื่อนไขนั้นอยู่ตลอดเวลา เช่น เราใช้การ JNBTF0,$ เพื่อตรวจสอบว่า Timer 0 เกิดการ Overflow Interrupt : วิธีการนี้เราไม่ต้องเสียเวลามาตรวจสอบ แต่เราจะใช้การขัดจังหวะ ( Interrupt) เมื่อถึงสถานะที่ต้องการ เช่น เกิดการ Overflow
การขัดจังหวะ( Interrupt ) คือการที่มีสัญญาณหรือคำสั่งที่ไม่ใช่คำสั่ง CALL หรือ JMP และทำให้การทำงานของโปรแกรมหลักถูกขัดจังหวะ และกระโดดไป ยังตำแหน่ง ใดตำแหน่งหนึ่งที่กำหนดไว้และเมื่อทำงานเสร็จสิ้นก็จะกระโดดกลับมา ยังโปรแกรมหลักและ ทำงานต่อไป โปรแกรมหลัก โปรแกรมขัดจังหวะ
โปรแกรมหลัก โปรแกรมหลัก โปรแกรมขัดจังหวะ โปรแกรมขัดจังหวะ เมื่อเกิดการ Interrupt หลังการ Interrupt
สำหรับตำแหน่งที่โปรแกรมจะกระโดดไปทำงานเมื่อเกิดการขัดจังหวะ(Interrupt)สำหรับตำแหน่งที่โปรแกรมจะกระโดดไปทำงานเมื่อเกิดการขัดจังหวะ(Interrupt) เราจะเรียกว่า Interrupt Vectorและโปรแกรมที่จะทำงานเมื่อเกิดการ Interrupt เราจะเรียกว่าInterrupt Service Routine สำหรับใน MCS-51 จะมีแหน่งกำเนิดสัญญาณ Interrupt ได้ทั้งหมด 5 แหล่ง ( 6 แหล่งสำหรับ 8052) ดังรูป
สำหรับตำแหน่งของ Interrupt Vector ของแหล่งกำเนิด Interrupt แต่ละแหล่งจะมีค่าตามตาราง
Register ที่เกี่ยวข้อง IE : Interrupt Enable Register มีตำแหน่งหน่วยความจำภายในที่ A8H MSB LSB EA : เป็นบิตควบคุมการ DisableInterrupt ทั้งหมด โดยถ้าเป็น 0 จะหมายความว่าจะเป็นการกำหนดไม่ให้เกิดการ Interrupt ทั้งหมด แต่ถ้าเป็น 1 หมายความว่าการ Enable/Disable จะขึ้นอยู่กับบิตควบคุมของ Interrupt source แต่ละแหล่ง ET2: เป็นควบคุมการสั่งให้เกิดการ Enable Timer2Interrupt โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อ Timer2 เกิดการ Overflow
ES : เป็นควบคุมการสั่งให้เกิดการ Enable Serial Port โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อมีข้อถูกรับส่งผ่าน Serial Port ET1 : เป็นควบคุมการสั่งให้เกิดการ Enable Timer1Interrupt โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อ Timer2 เกิดการ Overflow EX1 : เป็นควบคุมการสั่งให้เกิดการ Enable ExternalInterrupt โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อระดับสัญญาณที่ขา INT1 มีระดับเป็น 0 หรือเกิดการเปลี่ยนแปลงจาก 1 เป็น 0 ขึ้นการกับการกำหนดค่าที่บิต IT1 ในรีจิสเตอร์ TCON ด้วย ET0 : เป็นควบคุมการสั่งให้เกิดการ Enable Timer0Interrupt โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อ Timer0 เกิดการ Overflow EX0 : เป็นควบคุมการสั่งให้เกิดการ Enable ExternalInterrupt โดยถ้าถูกกำหนดเป็น 1 จะหมายความว่าสามารถเกิดการ Interrupt ได้เมื่อระดับสัญญาณที่ขา INT0 มีระดับเป็น 0 หรือเกิดการเปลี่ยนแปลงจาก 1 เป็น 0 ขึ้นการกับการกำหนดค่าที่บิต IT0 ในรีจิสเตอร์ TCON ด้วย
IP : Interrupt Priority มีตำแหน่งหน่วยความจำภายในคือ 0B8H MSB LSB ในการตอบสนอง Interrupt ถ้าหากเราต้องการใช้สัญญาณ Interrupt จากแหล่งกำเนิดหลายแหล่ง เราต้องมีการกำหนดระดับความสำคัญ( priority) ของสัญญาณ Interrupt สำหรับรีจิสเตอร์ที่ใช้ในการกำหนดความสัญคือ IP
แต่ถ้าหากเราไม่ได้กำหนดความสำคัญของ Interrupt ในตัวของ MCS-51 จะเรียงลำดับความสำคัญตามค่าต่อไปนี้ จากความสำคัญสูงสุดไปยังความสำคัญน้อยที่สุด • IE0 • TF0 • IE1 • TF1 • RI+TI
High Priority Interrupt รูปแสดงการทำงานของระบบการขัดจังหวะใน MCS-51
Example จงเขียนโปรแกรมที่เมื่อเกิดการ Interrupt ที่ External Interrupt 0 และทำให้ LED ที่ต่ออยู่ที่ P1.0 เกิดการ Toggle $MOD51 ORG 8000H JMP START ORG 8003H JMP EX0_ROUTINE ORG 8100H START: SETB IT0 MOV IE,#81H JMP $ EX0_ROUTINE: CPL P1.0 RETI END
จงเขียนโปรแกรมเพื่อส่งสัญญาญ Clock โดยใช้ Timer Interrupt เป็นฐานเวลา $MOD51 ; Use 8051 Directive ORG 0000H ; Code Start at Address 0000H JMP START ; Go to Start Label ORG 000BH JMP Timer0_Routine ORG 0100H ; Code Start at Address 0000H START: MOV TMOD,#01H ; Timer0 Mode 1 :16Bit Timer MOV TH0,#0DCH ; Initial for Timer0 High Byte MOV TL0,#00H ; Initial for Timer0 Low Byte MOV IE,#82H ; Timer0 Interrupt Enable SETB TR0 ; Start Timer0 Run LOOP: JMP $
Timer0_Routine: MOV TH0,#0DCH ;Reloaded TH0 MOV TL0,#00H ;Reloaded TL0 CPL P1.7 ; Complement P1.7 RETI END