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) ครับ