Lab8. การใช้งาน Uart


#include <p30f2010.h>    //เปิดใช้งานไลบรารี dspic30F2010  
#include<uart.h>                                //เปิดใช้งานไลบรารี uart เพื่อส่งข้อมูลแบบ RS-232

_FOSC(CSW_FSCM_OFF & XT_PLL4);      // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz มี PLLx4 คือ ทวีคูณความถี่ของ clock 4 เท่า
_FWDT(WDT_OFF);                                            //ปิดการทำงาน  watchdog Timer

#define Fcy                                                           7372800.0            //Fcy = (Fosc*PLLx)/4
#define BAUD_RATE                                          9600.0
#define BAUD_RATE_GEN                               (Fcy/(16*BAUD_RATE))-1;

void uart1_init()
{              
                unsigned int ConfigU1MODE,ConfigU1STA,BaudRate;                           
                CloseUART1();                     //ปิดการทำงาน uart
                ConfigU1MODE =               UART_EN &                                          // Enable UART1
                                                                UART_IDLE_CON &                            // UART1 working in idle mode
                                                                UART_RX_TX&     // UART1 normal pin (TX==>RF3 pin,RX==>RF2 pin)
                                                                UART_DIS_WAKE &                            // Disable wake-up on start UART
                                                                UART_DIS_LOOPBACK & // Disable loop back mode                              
                                                                UART_DIS_ABAUD &                          // Disable autobaud mode
                                                                UART_NO_PAR_8BIT &                      // Set data 8 bit ,no parity bit
                                                                UART_1STOPBIT;                               // Set 1 stop bit
                ConfigU1STA       =             UART_INT_TX_BUF_EMPTY &         // Interrupt on buffer empty mode
                                                                UART_TX_PIN_NORMAL &                // TX Break bit normal
                                                                UART_INT_RX_CHAR&                      // UART interrupt receive mode
                                                                UART_ADR_DETECT_DIS &             // Disable detect address mode
                                                                UART_RX_OVERRUN_CLEAR;         // Reset buffer over run
                BaudRate = BAUD_RATE_GEN;
                OpenUART1(ConfigU1MODE, ConfigU1STA, BaudRate);        //เปิดการใช้งาน Uart1
}
void Uart1_PrintStr(unsigned char *str_uart){               //ฟังก์ชันการส่งข้อมูล RS-232
                putsUART1((unsigned int *)str_uart);
                while(BusyUART1());
}
int main(void)
{
                unsigned char ch;              //ประกาศตัวแปรชื่อ ch เป็นตัวอักษร 8 บิต
                uart1_init();                            //เรียกใช้งานฟังก์ชัน Uart1
                _TRISD0 = 0;                        //กำหนดให้พอร์ต D0 เป็น output
                _LATD0 = 0;                          //port D0 OFF
                for(;;){                                     //for loop สำหรับรับค่าจาก RS - 232
                while(DataRdyUART1()){   //เมื่อมีการรับค่าจาก RS – 232 (จากการกดคีย์บอร์ด)
                ch = ReadUART1();            //เก็บค่าที่ได้ไว้ที่ตัวแปร ch
                if(ch != 13){                           //ถ้าค่าที่ได้ไม่ใช่ 13 หรือการกด Enter
                putcUART1(ch);                   //ส่งข้อมูลที่เก็บค่าในตัวแปร ch ออก RS - 232
                _LATD0 = !_LATD0;            //กลับสถานะที่เกิดที่พอร์ต D0 จาก OFF เป็น ON
                if(_LATD0 == 1){                                  //ถ้า D0 ON
                Uart1_PrintStr("    D0 HIGH.\n\r");     //ส่งค่า D0 HIGH ออก RS - 232
                }
                else{                       //ถ้า D0 OFF
                Uart1_PrintStr("    D0 LOW.\n\r");      //ส่งค่า D0 LOW ออก RS - 232
                }
                }
                else{                       //Loop ch!=13 ถ้ากด Enter
                putsUART1((unsigned int *)"\n\r");    //ขึ้นบรรทัดใหม่
                }
                while(BusyUART1());           //รอจนกว่า Uart1 จะทำงานเสร็จเรียบร้อย
}
}
return 0;                 // Reset ค่าเริ่มต้น
}
โปรแกรมนี้เป็นการใช้งาน Uart1 เพื่อทำการเปิด ปิด พอร์ต D0 คือการรับค่าจากคีย์บอร์ดปุ่มใดๆก็ได้ยกเว้น ปุ่ม Enter เพื่อควบคุมพอร์ต D0 และแสดงสถานะออกมาที่ Hyperterminal แต่ถ้ากด Enter ที่ Hyperterminal ก็จะขึ้นบรรทัดใหม่