Lab10. การใช้งาน Capture อ่านค่าความถี่


#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