การใช้งานอินเทอร์รัปต์ UART
ฟังก์ชั่น enable_interrupts()
     เป็นฟังก์ชั่นที่ใช้กำหนดให้มีการอินเทอร์รัปต์เกิดขึ้น โดยมีรูปแบบการใช้งานดังนี้

     enable_interrupts(level)

โดยที่
     level          คือ ลำดับค่าคงที่ของการอินเทอร์รัปต์ที่กำหนดในดีไวน์ของไฟล์เฮด                       เดอร์(devices.h file) ของไมโครคอนโทรเลอร์ PIC แต่ละเบอร์
ตัวอย่าง
     enable_interrupts(GLOBAL) // เปิดใช้งานอินเทอร์รัปต์ทั้งหมด
     enable_interrupts(INT_RDA) // เปิดใช้งานอินเทอร์รัปต์ RS232

ฟังก์ชั่น disable_interrupts()
     เป็นฟังก์ชั่นที่ใช้ในการยกเลิกการใช้งานอินเทอร์รัปต์ โดยมีรูปแบบการใช้งานดังนี้

     disable_interrupts(level)

โดยที่
     level           คือ ลำดับค่าคงที่ของการอินเทอร์รัปต์ที่กำหนดในดีไวน์ของไฟล์เฮด                        เดอร์(devices.h file) ของไมโครคอนโทรเลอร์ PIC แต่ละเบอร์
ตัวอย่าง
     disable_interrupts(GLOBAL) // ปิดใช้งานอินเทอร์รัปต์ทั้งหมด
     disable_interrupts(INT_RDA) // ปิดใช้งานอินเทอร์รัปต์ RS232
ตัวอย่างการใช้งานอินเทอร์รัปต์ UART
     สำหรับตัวอย่างโปรแกรมนี้ใช้ไมโครคอนโทรลเลอร์ เบอร์ PIC16F877 ทำงานที่ความถี่ 20 MHz และใช้งานโมดูล UART ที่อัตบอดเรท 9600 โดยเป็นโปรแกรมควบคุมการเปิดและปิดหลอดไฟ LED 2 ช่อง ผ่านทาง RS232 สามารถสั่งงานผ่านคอมพิวเตอร์ได้ ผ่านทางโปรแกรม Hyper Terminal การทำงานของโปรแกรมคือ เมื่อมีการกดคีย์ A จะสั่งเปิด LED 1 ที่ต่ออยู่ที่ขา RD0 และเมื่อกดคีย์ a จะสั่งปิด LED 1 สำหรับ LED 2 การทำงานเหมือนกับ LED 1
[กลับสู่หน้าหลัก]
เมื่อกดคีย์ A จากรูปด้านล่าง LED1 จะติด

#include <16f877.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES WRT //Program Memory Write Protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading

#use delay(clock=20000000)

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

// DEFINE LED
#define led1(x) output_bit(pin_d0,x)
#define led2(x) output_bit(pin_d1,x)

char cmd;

#int_rda
void rs232_isr(void){
cmd = getc();
}

 

void main (void)
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

cmd = 0;

printf("** Control LED **\n\r");
printf("A: LED1 is on.\n\r");
printf("a: LED1 is off.\n\r");
printf("B: LED2 is on.\n\r");
printf("b: LED2 is off.\n\r");


while(true){

if(cmd!=0){

switch(cmd){
case 'A': led1(1); break;
case 'a': led1(0); break;
case 'B': led2(1); break;
case 'b': led2(0); break;
}
cmd = 0;
}

}

}

ตัวอย่างโค้ดโปรแกรม
     สำำหรับบทความนี้ ผมจะขอยกตัวอย่างการใช้งานอินเทอร์รัปต์ UART และจะขออธิบายคราวๆ นะครับ ในการใช้งานอินเทอร์รัปต์ UART นั้น จะต้องใช้งานโมดูล UART ภายในไมโครคอนโทรลเลอร์ได้เท่านั้น ไม่สามารถใช้งานแบบ Software UART ได้ ในคอมไพเลอร์ CCS มีรูปแบบการใช้งานคำสั่งดังต่อไปนี้