simple UART1 PIC18F4550
simple UART1 PIC18F4550
ตัวอย่างโค๊ดการรับข้อมูลผ่านทาง Serial Port (จำลอง บน โปรแกรม Proteus) ด้วยโค๊ด CCS ในตัวอย่างนี้ ผมใช้โปรแกรม Virtual Serial Ports Emulator ทำการสร้างพอร์ตอนุกรมเสมือน COM3 กับ COM4 ให้ทำการจับคู่กันก่อน จากนั้น ทำการสร้างวงจรบนโปรแกรม Proteus โดยให้อุปกรณ์ที่ชื่อ COMPIM ทำหน้าที่เป็นพอร์ตอนุกรม COM3 คลิกขวาที่อุปกรณ์ Compim ทำการตั้งค่า Properties ค่า Baudrate 9600 stop bit 1, data bit 8 และต่อสายสัญญาณดังรูป
ส่วนที่ไมโครคอนโทรลเลอร์ PIC18F4550 ทำการกำหนดค่า Processor Clock Frequency 8MHz ( ให้ตรงกับในโค๊ดของเรา) จากนั้นให้ทำกำหนดให้ตั้งค่า Program file ไปที่ hex file ที่ได้จากการ Compile จากโปรแกรม CCS ของเรา
Compiler : CCS PCH version 4.105
Target : PIC18F4550
Crystal : 8 MHz
จากนั้นโค๊ดตัวอย่าง ผมเปิดอินเตอร์รัพท์ UART (enable_interrupts(INT_RDA)) จากนั้น ก็เขียนฟังก์ชั่น อินเตอร์รัพท์รูทีน ที่ชื่่อ void isr_rs232(void) คอยดักการเกิดอินเตอร์รัพที่ขา PIN_C7 เมื่อมีข้อมูลเข้ามาที่ buffer uart ให้ทำการอ่านค่าด้วยฟังก์ชั่น getc() มาเก็บไว้ที่ตัวแปร char c; และเซตค่า flag = 1; เพื่อเป็นตัวเปรียบเทียบใน whle loop ว่ามีการเกิดอินเตอร์รัพท์ขึ้นแล้ว และให้โปรแกรมทำงานตามที่เงื่อนไขที่เรากำหนด ที่ได้จากการอ่านตัวอักษรเข้ามา ในที่นี้ เรานำค่าในตัวแปรอาเรย์ส่งออกไปที่ Port B ของ PIC18F4550 นั่นเอง
#include <18F4550.h>
#fuses HS // HS High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#fuses NOBROWNOUT // NOBROWNOUT No brownout reset
#fuses NOWDT // NOWDT No Watch Dog Timer
#fuses MCLR // MCLR Master Clear pin enabled
#use delay(clock=8000000)
#use rs232(uart1,baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=PC_COM)
int LED[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
BOOLEAN flag = 0;
char c;
#INT_RDA
void isr_rs232()
{
c=getc();
flag = 1; // set flag
}
void main(void)
{
set_tris_b(0x00);
output_b(0x00);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
printf("Please key number of LED(A...F)");
while(TRUE)
{
if(flag == 1){
if(c == 'A'){
output_b(LED[0]);
}else if(c == 'B'){
output_b(LED[1]);
}
flag = 0; // reset flag
}
}
}
ดาวน์โหลดไฟล์วงจรได้ที่ไฟล์แนบ (สร้างจากโปรแกรม Proteus 7.10) ครับ