使用C18編譯語言,
我要做一個捕捉頻率的功能,CCP1與Timer2做PWM來產生頻率,而CCP2 做捕捉模式配合Timer1,當捕捉完成功時,在中斷中無法將ccp2的 CCP2IF的中斷旗標用軟體清除。
#include <p18f4520.h>
#include <delays.h>
#include <adc.h>
#include <timers.h>
#include <pwm.h>
#include <capture.h>
#pragma config OSC=HS, BOREN=OFF, BORV = 2,
PWRT=ON, WDT=OFF, LVP=OFF
#pragma config CCP2MX = PORTBE // CCP2腳位設定
// 宣告集合變數以便處理二位元組變數資料
union EDGE {
unsigned int lt;
unsigned char bt[2];
}EDGE_O, EDGE_N;
void CCP2_isr(void); // 宣告中斷執行程式CCP2_isr
void main () {
PORTD = 0x00;
TRISD = 0;
ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組
ADCON1=0x0E; // 使用VDD,VSS為參考電壓,
設定AN0為類比輸入
ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為
Fosc/32,採樣時間為20TAD
OpenTimer1( TIMER_INT_OFF &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_1 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_ON );
TRISCbits.TRISC2=0; // 設定CCP1為輸出
OpenPWM1(0x03); // 設定CCP1為PWM功能與時脈周期
SetDCPWM1(0x02); // 設定CCP1的PWM工作周期
OpenTimer2(TIMER_INT_OFF&T2_PS_1_16&T2_POST_1_1);
TRISBbits.TRISB3=1; // 設定CCP2為輸入
// 設定CCP2為Capture功能,開啟中斷並設定捕捉下降邊緣
OpenCapture2(CAPTURE_INT_ON &C2_EVERY_FALL_EDGE);
INTCONbits.GIE=1;// 啟動所有的高優先中斷
INTCONbits.PEIE=1;
while(1);
}
#pragma code high_vector=0x08// 定義高優先中斷執行程式位址
void high_interrupt (void)
{
_asm GOTO CCP2_isr _endasm
}
#pragma code
#pragma interrupt CCP2_isr
void CCP2_isr (void)
{
EDGE_N.lt=ReadCapture2();
PIR2bits.CCP2IF = 0; // 清除中斷旗標
}
|