MPC82G516為***笙泉公司生產的8位MCU,兼容8051。內建PCA功能6個模塊,模塊0—5對應P1.2—P1.7, P1.1為輸入脈沖源ECI。本文記錄了測試PCA的代碼和過程,重點分析各寄存器的設置,還通過邏輯分析儀記錄相關波形。STC15F60S2等芯片也內建PCA功能,不過僅3模塊,但功能更為豐富,設置編程過程大同小異,可參考。
1、相關寄存器:
寄存器
功能
地址
7
6
5
4
3
2
1
0
描述
CCON
控制
D8
CF
CR
CCF5
CCF4
CCF3
CCF2
CCF1
CCF0
CR:啟停PCA總計數器
CF:PCA總計數器溢出標志
CCF0-5:各模塊中斷標志
CMOD
模式
D9
CIDL
—
—
—
—
CPS1
CPS0
ECF
CIDL:空閑模式是否計數
CPS1、CPS0:時鐘源:12分.2分.T0.ECI.四選一
ECF:PCA計數溢出中斷
AUXIE
中斷
—
—
EKB
ES2
EBD
EPCA
EADC
ESPI
EPCA:PCA中斷開關
CCAPM
0-5
模塊模式
DA-
DF
—
ECOM
0-5
CAPP
0-5
CAPN
0-5
MAT
0-5
TOG
0-5
PWM
0-5
ECCF
0-5
ECOMn 允許比較
CAPPn 上升CAPNn 下降
MATn 匹配CCFn位
TOGn 匹配翻轉引腳電平
PWM脈寬調制輸出
ECCFn 使能中斷信號CCFn
CCAPnL
捕獲
寄存器
EA-EF
比較:先設初值,與PCA比較
捕獲:捕獲PCA值到寄存器
CCAPnH
FA-FF
PCAP
WM0-5
PWM
模式
F2-
F7
—
—
—
—
—
—
ECA
PnH
0-5
ECA
PnL
0-5
PWM時作為第9位
用于設定占空比
CL、CH
PCA
PCA總計數器
AUXR1
引腳
8E
P4KB
P4PCA
P4SPI
P4S2
GF2
—
—
DPS
P4PCA:引腳切換到P4口
2、比較、捕獲模式設置寄存器CCAPM0-5:
CCAPMn
16進值
有/無中斷
功能
備注
-000 0000
無操作
-x10 000x
20/21
16位CEXn引腳上升沿觸發捕獲模式
捕獲值不處理僅進中斷,相當于增加了外部中斷功能
-x01 000x
10/11
16位CEXn引腳下降沿觸發捕獲模式
-x11 000x
30/31
16位CEXn引腳有跳變沿觸發捕獲模式
-100 100x
48/49
16位軟件定時器
均需進中斷重設比較值,并清0中斷標志,因此最小定時值》=5us。差別是定時器僅利用中斷信號,高速輸出則利用對應引腳電平的翻轉
-100 110x
4C/4D
16位高速輸出
-100 0010
42/
8位PWM
占空比=1-[ECAPnH,CCAPnL]/256
3、PCA功能使用步驟:
1) 確定CCON=0x00;一般先清0
2)確定CMOD=0x00;00不開PCA中斷,01開;脈沖源為FSOC/12
3)AUXIE = 0x04;打開PCA總中斷開關,捕獲及定時均要打開,PWM時可關閉
4)設置各模塊工作模式寄存器CCAPMn,見表2
5)設置PCA計數器初值:CL=0;CH=0
6)定時或高速輸出時,需設置CCAPnL及CCAPnH值
7)PWM功能時,需設置CCAPnH(及ECAPnH在PCAPWM寄存器中)
8)啟動PCA計數:CR=1;如有必要打開總中斷:EA=1
9)寫中斷處理函數,MPC82G516的PCA中斷向量為10(53H),STC15F60S2為7
4、PCA功能邏輯圖:
5、PCA中斷邏輯示意圖:
6、PCA中斷向量
MPC82G516的PCA中斷編號為10。STC15F60S2的中斷矢量為7。
測試1:PCA總計數器溢出中斷
思路:不使用任何模塊,僅啟動PCA總計數器,為方便觀察,開通中斷并在中斷處理程序中設置觀察變量(P2.1)作電平翻轉,再用邏輯分析儀觀察其變化。
步驟:
1、CCON清0,各中斷標志清0,關閉PCA計數
2、CMOD:設置脈沖源,置位ECF(允許總PCA計數溢出中斷)
3、打開各級中斷:AUXIE中設EPCA,開總中斷EA
4、啟動PCA:CR=1
在p2.1可觀察到65.536寬度電平翻轉。程序如下:
程序:
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//測試LED
void PCA_isr() interrupt 10 //注意中斷向量號為10,STC15F為7
{
CF=0;//清中斷
LED=!LED;//LED取反
}
void main()
{
CCON=0;
CL=0;
CH=0;
CMOD=0x01;//12分頻。使用0x03則為系統時鐘2分頻
AUXIE=0x04;
EA=1;
CR=1;
while(1);
}
FOSC/12:PCA計數每65.531ms溢出一次(理論值應為65.536ms)
如果改脈沖源為FOSC/2:PCA計數每10.922ms溢出一次
測試2:PCA模塊0用作捕獲模式,CEX0引發中斷
思路:
模塊0設置為捕獲模式,捕獲信號由模塊0對應的引腳P1.2輸出,可上升、下降或邊緣觸發,具體通過設置CCAPM0來實現,見表2。
下降沿觸發捕獲:CCAPM0=0x11 (00010001),即CAPN0=1、ECCF0=1可直接短接CEX0/P1.2與地來獲得下降沿;
上升沿觸發捕獲:CCAPM0=0x21 (00100001) 需先短接CEX0/P1.2與地、再釋放來獲得上升沿;
注意MCU的四個端口復位后均為“準雙向口”,開路時內部有弱上拉。
當CEX0觸發捕獲時,捕獲到的數據并不作處理(如帶仿真,可仿真時查看到該捕獲值),因此本程序相當于為單片機增加了一個外部中斷功能。
程序:
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//測試LED
sbit LED2=P2^2;//接LED觀察
void PCA_isr() interrupt 10
{
unsigned charTmpL;//臨時變量,暫存捕獲值
unsigned charTmpH;
//CF=0; //清中斷(PCA計數溢出,這里不必使用)
LED=!LED;//LED取反
if (CCF0)//當CEX0(P1.2)觸發捕獲時,引發中斷CCF0
{
TmpL=CCAP0L;
TmpH=CCAP0H;
CCF0=0;//軟件清中斷
//P12=1;//拉高測試引腳,用于下次下降沿觸發
LED2=!LED2;//可接發光二極管觀察中斷產生情況
}
}
void main()
{
CCON=0;
CL=0;
CH=0;
CMOD=0x00;//模式:FSOC/12、ECF禁止PCA中斷(以免產生無效中斷)
AUXIE=0x04;//打開PCA總中斷
CCAPM0 =0x11;//模塊0設置為外部引腳上升沿觸發捕獲模式,并產生模塊0的中斷信息CCF0
EA=1;
CR=1;
//P12=1;
while(1);
}
測試3:PCA模塊0、1用作16位定時模式
思路:
PCA各模塊如用作定時器,因16位PCA計數器啟動后,總是從0000—FFFF循環計數,比較寄存器[CCAPnH + CCAPnL]如裝載固定值的話,每個PCA計數周期(65535個脈沖)只能產生一次比較相同輸出,為了實現自定義的計數值,必須在每次計數中斷后給[CCAPnH + CCAPnL]加一個固定值,這樣PCA計數到新值后又能產生中斷輸出,達到定時器的目的;
編程步驟:
1) CCON清0,各中斷標志清0,關閉PCA計數
2)CMOD:設置脈沖源,置位ECF(允許總PCA計數溢出中斷)
3)PCA計數器CH+CL=0000,比較寄存器[CCAPnH + CCAPnL]+=T(T為定時值)
4)設置本模塊工作方式為16位定時器:CCAPM0 =0x49
5)打開各級中斷:AUXIE=0x04 開總中斷EA
6) 啟動PCA:CR=1
7) 中斷處理程序:添加代碼 [CCAPnH + CCAPnL]+=T,作為下次比較值
觀察辦法:
在中斷程序中設置變量LED/P2.1(模塊1用LED2),每次中斷反轉以輸出方波(接邏輯儀分析)
代碼:(模塊0定時1ms,模塊1定時3ms)
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//測試LED
sbit LED2=P2^2;//接LED觀察
unsigned int t0=1000;//定義16位變量t,定時1ms
unsigned int t1=3000;//定義16位變量t,定時3ms
unsigned int value0;
unsigned int value1;
void PCA_isr() interrupt 10
{
if(CCF0)
{
CCF0=0;//清中斷,因PCA計數溢出中斷已禁止,所以這里不必再清CF
CCAP0L = value0; //更新比較值
評論