您的位置 首页 软件

STC单片机PCA代码测验的办法及进程解析

STC单片机PCA代码测试的方法及过程解析-MPC82G516为台湾笙泉公司生产的8位MCU,兼容8051。内建PCA功能6个模块,模块0—5对应P1.2—P1.7, P1.1为输入脉冲源ECI。本文记录了测试PCA的代码和过程,重点分析各寄存器的设置,还通过逻辑分析仪记录相关波形。

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

中止

AD

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功用逻辑图:

STC单片机PCA代码测验的方法及进程解析

5、PCA中止逻辑示意图:

STC单片机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; //更新比较值

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/345771.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部