?? cap.c
字號:
// 主程序
// 此波形輸入CAP4引腳,待CAP4捕捉該PWM的10次上升沿后,停止捕捉,并把10
// 次捕捉值存于數組result[10]中
#include "register.h"
// 初始化子程序
int result[10]; // 定義一個存儲結果的數組
int k=0; // 定義的中斷次數值
// 系統初始化子程序
void initial()
{
asm(" setc INTM"); // 禁止所有中斷
asm(" setc SXM"); // 抑制符號位擴展
asm(" clrc OVM"); // 累加器中結果正常溢出
asm(" clrc CNF"); // B0被配置為數據存儲空間
SCSR1=0x81FE; // CLKIN=10M,CLKOUT=4CLKIN=40M
WDCR=0x0E8; // 不使能看門狗,因為SCSR2中的WDOVERRIDE
// 即WD保護位復位后的缺省值為1,故可以用
// 軟件禁止看門狗
IMR=0x0000; // 禁止所有中斷
IFR=0x0FFFF; // 清除全部中斷標志,"寫1清0"
}
// 捕獲單元4初始化子程序
void CAP4INT()
{
MCRC=MCRC|0X0080;
T3PR=0X0FFFF; // 通用定時器3的周期寄存器為0XFFFF
T3CON=0X1400; // 通用定時器3為連續增計數模式
T3CNT=0X00; // 計數器清0
WSGR=0x0000; // 禁止所有等待狀態
CAPCONB=0X0A240; // 設置捕獲單元4為檢測上升沿,且選擇TIMER3為時鐘
asm(" clrc INTM"); // 開總中斷
IMR=0X08; // 允許中斷優先級4的中斷
EVBIMRC=EVBIMRC|0X0001; // 允許CAPTURE1中斷
EVBIFRC=EVBIFRC|0X0FFFF;
}
// 主程序
main()
{
initial(); // 系統初始化
CAP4INT(); // 捕獲單元4初始化
T3CON=T3CON|0X0040; // 啟動定時器3
while(1)
{
if(k==10) break; // k保存中斷次數值,是全局變量
}
asm(" setc INTM"); // 捕捉10次后,禁止再中斷
}
// 若是由于干擾引起其它中斷,則執行此子程序
void interrupt nothing()
{
// asm(" clrc INTM"); // 返回前開中斷
return;
}
// 捕捉中斷服務程序
void interrupt capint()
{
int flag;
flag=EVBIFRC&0X01; // 判斷是否是CAP4中斷
if(flag!=0x01)
{
asm(" clrc INTM"); // 返回前開中斷
return; // 如果不是CAP4中斷,則直接返回
}
else
{
load(); // 如果是CAP4中斷,則裝載捕捉值
EVBIFRC=EVBIFRC|0x01; // 寫"1"清除CAP4中斷標志
asm(" clrc INTM"); // 返回前開中斷
return; // 中斷返回
}
}
// 裝載捕捉值子程序
int load()
{
result[k]=CAP4FIFO; // 讀取捕捉值,存于相應的數組
k++;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -