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