[ บทความ : DnRx051 - Lab01 ควบคุม LED ด้วย Switch] |
ตัวอย่างโปรแกรมการทำงานแบบ Interrupt
Interrupt หรือการขัดจังหวะ เป็นการหยุดการทำงานปัจจุบัน แล้วกระโดดไปตอบสนองเหตุการณ์ที่เกิดขึ้น ใน AT89C4051 มี Interrupt ภายนอก 2 ตัว คือ INT0 และ INT1 (Active ที่ LOW) ซึ่ง INT0 ก็คือขา P3.2 และ INT1 ก็คือขา P3.3 การควบคุมระบบ Interrupt นั้นต้องตั้งการควบคุมที่ IE โดย มีรายละเอียดดังนี้
IE.7 EA 1 ยอมให้เกิด Interrupt , 0 ไม่ยอม
IE.6, IE.5 - สงวน
IE.4 ES 1 ยอมให้มี Interrupt จากพอร์ตอนุกรม, 0 ไม่ยอม
IE.3 ET1 1 ยอมให้มี
Interrupt จาก TIMER0, 0 ไม่ยอม
IE.2 EX1 1 ยอมให้มี
Interrupt จาก INT1, 0 ไม่ยอม
IE.1 ET0 1 ยอมให้มี
Interrupt จาก TIMER0, 0 ไม่ยอม
IE.0 EX0 1
ยอมให้มี Interrupt จาก INT0 , 0 ไม่ยอม
บอร์ด AT89C2051 หรือ AT89C4051, บอร์ด LED x8, บอร์ด SW x4 (P3.0-P3.3)
P1.0-P1.7 ต่อกับ LED ที่ทำงานแบบ Sink, P3.2 และ P3.3 ต่อเข้ากับวงจร Switch (1 = dont push, 0 = push)
#include <8051reg.h>
#include <8051int.h>
char patt[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
0x40, 0x80,
0x40, 0x20,
0x10, 0x08, 0x04, 0x02, 0x01};
char patt2[] = {0x18, 0x24,
0x42, 0x81, 0x00};
char patt3[] = {0x81, 0x42,
0x24, 0x18, 0x00};
INTERRUPT(_IE0_) int0()
{ char cnt;
for (cnt = 0; cnt <5; cnt++) {
P1 = ~patt2[cnt];
delay();
}
}
INTERRUPT(_IE1_) int1()
{ char cnt;
for (cnt = 0; cnt <5; cnt++) {
P1 = ~patt3[cnt];
delay();
}
}
delay()
{ int i;
for (i=0; i<5000; i++);
}
main()
{ char cnt;
cnt = 0;
IE = 0x85;
while(1) {
P1 = ~patt[cnt];
cnt++;
if (cnt == 15) cnt = 0;
delay();
}
}
โปรแกรมนี้ทำงานอะไรบ้าง ..............................................................................................................
IE = 0x85 หมายถึง
...........................................................................................................................
แบบฝึกหัด
1. ให้เขียนโปรแกรมเลื่อน LED โดยใช้ SW 2 ตัว นั่นคือ SW1 เมื่อกดจะเป็นการเลื่อน LED ไปทางขวา 1 ครั้ง และถ้าเลื่อนจนอยู่ด้านขวาสุด ให้อยู่ที่เดิม และถ้ากด SW2 ให้ทำการเลื่อน LED ไปทางด้านซ้าย 1 ครั้ง และถ้าเลื่อนไปอยู่ทางด้านซ้ายสุดแล้วให้อยู่ที่เดิม แต่ถ้าเมื่อไร ผู้ใช้กด SW1 และ SW2 พร้อมกัน ให้ทำการกระพริบหลอด LED ทั้งแปดดวง 5 ครั้ง (ส่ง 0xFF และ 0x00) โดยที่ เมื่อกระพริบเสร็จ ให้ตำแหน่งของ LED ต้องอยู่ที่เดิม (ตำแหน่งเดิมก่อนที่จะมีการกระพริบ LED 5 ครั้ง)
2. ให้ทำการสั่งขับเคลื่อนหุ่นยนต์ Stepping motor หรือ DC Motorโดย ต่อ SW3 (P3.2) เป็น Sensor ด้านซ้าย และ SW4 (P3.3) เป็น sensor ด้านขวา เมื่อไม่เกิด Interrupt ให้สั่งหุ่นยนต์เดินหน้า แต่ถ้าเมื่อไรเกิดการกด SW3 ให้สั่งหุ่นยนต์ถอยหลัง แล้วเลี้ยวขวา แต่ถ้ากด SW4 ให้สั่งถอยหลังแล้วเลี้ยวซ้าย
3. ให้ทำการแก้ไขโปรแกรมเปลี่ยนความเร็วของ LED โดยใช้ Interrupt
เขียนโดย : ศุภชัย
บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@scaat.th.edu
วันที่ทำการปรับปรุง : วันอาทิตย์ที่ 20
มกราคม พ.ศ. 2545