#include <p30f2010.h> // เปิดใช้งานไลบรารี dsPIC30F2010
#include <qei.h> // เปิดใช้งานไลบรารี QEI
#include<uart.h> //เปิดใช้งานไลบรารี uart เพื่อส่งข้อมูลแบบ RS-232
#include<stdio.h> //เปิดใช้งานไลบรารีการแปลงข้อมูล
_FOSC(CSW_FSCM_OFF & XT_PLL4); // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz มี PLLx4 คือ ทวีคูณความถี่ของ clock 4 เท่า
_FWDT(WDT_OFF); //ปิดการทำงาน watchdog Timer
#define Fcy 7372800.0
#define BAUD_RATE 9600.0
#define BAUD_RATE_GEN (Fcy/(16*BAUD_RATE))-1;
int pos_value=0; // ประกาศตัวแปรชื่อ pos_value แบบจำนวนเต็มบวก เป็น 0
void _ISR _U1TXInterrupt(void) //ฟังก์ชันuart1 TX interrupt
{
_U1TXIF = 0; //Clear register uart1 TX เป็น 0
}
void _ISR _U1RXInterrupt(void) //ฟังก์ชัน uart1 RX interrupt
{
_U1RXIF = 0; //ฟังก์ชัน uart1 RX interrupt
}
void _ISR _QEIInterrupt(void) //ฟังก์ชัน QEI interrupt
{
POSCNT = 0; // Clear ค่า Position Count
IFS2bits.QEIIF = 0; // Clear Register QEI interrupt เป็น 0
}
void uart1_init() //ฟังก์ชันการทำงาน uart1
{
unsigned int ConfigU1MODE,ConfigU1STA,BaudRate;
CloseUART1(); //ปิดการทำงาน uart1
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 qei_init(void)
{
unsigned int config1;
ADPCFG = 0xFFFF; // ปิดการทำงานของ ADC
ConfigIntQEI(QEI_INT_PRI_1 & // QEI interrupt priority level 1
QEI_INT_ENABLE); // Enable QEI interrupt
POSCNT = 0; // Clear ค่า Position Count
MAXCNT = 4000; // กำหนดค่าสูงสุดในการนับเป็น 4000
config1 =(QEI_DIR_SEL_QEB& // QEB Pin State Defines Position Counter Direction
QEI_INT_CLK& // Internal clock (FOSC/4)
QEI_INDEX_RESET_DISABLE& // Index Pulse does not reset Position Counter
QEI_CLK_PRESCALE_1 & // QEI Timer Input Clock Prescale Select Bits
QEI_GATED_ACC_DISABLE& // Timer gated time accumulation disabled
QEI_NORMAL_IO& // QEI Position Counter Direction Status Output Disabled
QEI_INPUTS_NOSWAP& // QEI Phase A and Phase B inputs not swapped
QEI_MODE_x4_MATCH& // QEI Quadrature Encoder Interface enabled (x4 mode) // with position counter reset by match (MAXCNT)
QEI_UP_COUNT& // QEI Position Counter Direction +VE
QEI_IDLE_CON); // QEI Continue module operation in idle mode
OpenQEI(config1,0); // เปิดการทำงานของ QEI
}
void Uart1_PrintStr(unsigned char *str_uart){ //ฟังก์ชันการส่งข้อมูล RS-232
putsUART1((unsigned int *)str_uart);
while(BusyUART1());
}
int main(void)
{
unsigned char buffer[20]; //ประกาศตัวแปรชื่อ buffer แบบตัวอักษรขนาด 20 ตัวอักษร
qei_init(); // เปิดการใช้งานฟังก์ชัน qei
while(1) // Infinite loop
{
pos_value = ReadQEI(); // เก็บค่าการนับไวที่ตัวแปร pos_value
sprintf(buffer,”%u\r\n”,pos_value); //แปลงค่า pos_value เป็นสตริงเก็บไวที่ตัวแปร buffer
Uart1_PrintStr(buffer); //ส่งค่าตัวแปร buffer ออก RS – 232
}
}