#include <p30f2010.h> //เปิดใช้งานไลบรารี dspic30F2010
#include<uart.h> //เปิดใช้งานไลบรารี uart เพื่อส่งข้อมูลแบบ RS-232
#include<incap.h> //เปิดใช้งานไลบรารี Capture
#include<timer.h> //เปิดใช้งานไลบรารี Timer
#include<stdio.h> //เปิดใช้งานไลบรารี stdio.h เพื่อการแปลงข้อมูล
_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;
char count_t2 = 0; //ประกาศตัวแปรชื่อ count_t2 เป็นแบบตัวอักษร 8 บิต
unsigned int F = 0; //ประกาศตัวแปรชื่อ F เป็นแบบจำนวนเต็มบวก 16 บิต
char hook_1s = 0; //ประกาศตัวแปรชื่อ hook_1s เป็นแบบตัวอักษร 8 บิต
void _ISR _IC1Interrupt(void){ //ฟังก์ชัน capture interrupt
F = F+1; //F เพิ่มขึ้นทีละ 1
_IC1IF = 0; //Clear register Capture interrupt เป็น 0
}
void _ISR _T2Interrupt(void){ //ฟังก์ชัน Timer2 interrupt
if(++count_t2 == 2){ //ถ้า count_t2 เพิ่มขึ้นทีละ 1 จนเท่ากับ 2
hook_1s = 1;
}
_T2IF = 0; //Clear register Timer2 interrupt เป็น 0
}
void capture_init()
{
unsigned int config; //ประกาศตัวแปรชื่อ config เป็นแบบจำนวนเต็มบวก 16 บิต
unsigned int period; //ประกาศตัวแปรชื่อ period เป็นแบบจำนวนเต็มบวก 16 บิต
CloseCapture1(); //ปิดการทำงาน Capture
ConfigIntCapture1(IC_INT_ON);
config = IC_IDLE_STOP & // Capture disable in idle mode
IC_TIMER2_SRC & // Timer 3 count for IC1
IC_INT_1CAPTURE & // Capture per 1 count for interrupt
IC_EVERY_FALL_EDGE; // Capture every falling edge
OpenCapture1(config); //เปิดการทำงาน capture
CloseTimer2(); //ปิดการทำงาน Timer2
ConfigIntTimer2(T2_INT_ON);
config = T2_ON &
T2_GATE_OFF &
T2_IDLE_STOP & //Idle Mode Stop
T2_PS_1_64 & //Prescale 1:64
T2_32BIT_MODE_OFF &
T2_SOURCE_INT;
period = 57604; //ในการนับแต่ละครั้งตามเวลาที่กำหนดไว้ข้างบน ใช้เวลาเท่ากับ ดังนั้นต้องการให้เกิด Interrupt ทุกๆ 0.5 วินาที สามารถหาค่า period =
OpenTimer2(config,period); //เปิดการทำงาน Timer2
}
void uart1_init()
{
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 Uart1_PrintStr(unsigned char *str_uart){ //ฟังก์ชันการส่งข้อมูล RS-232
putsUART1((unsigned int *)str_uart);
while(BusyUART1());
}
int main(void)
{
char buffer[30]; //ประกาศตัวแปรชื่อ buffer เป็นแบบตัวอักษร 8 บิต ขนาด 30 ตัวอักษร
_TRISD0 = 1; //กำหนดให้พอร์ต D0 เป็น อินพุต
capture_init(); //เรียกใช้งานฟังก์ชัน capture
uart1_init(); //เรียกใช้งานฟังก์ชัน uart1
Uart1_PrintStr("Frequency Measurement\r\n"); //ส่งค่า Frequency Measurement ออก RS-232
for(;;){ //for loop
if(hook_1s){ //ถ้า hook_1s เป็นจริง
sprintf(buffer,"Frequency = %u\r",F); //แปลงข้อมูลที่เก็บไว้ที่ตัวแปร F จากจำนวนเต็มบวกเป็นสตริงเก็บไว้ที่ตัวแปร buffer
Uart1_PrintStr(buffer); //ส่งค่า buffer ออก RS-232
hook_1s = 0; //Reset hook_1s
count_t2 = 0; //Reset count_t2
F = 0; //Reset F
}
}
return 0; //Reset ค่าเริ่มต้น
}
โปรแกรมใช้ในการวัดค่าความถี่ และแสดงผลทุกๆ 1 วินาทีด้วย Timer2 ออก RS – 232