打印

C8051单片机PCA计数功能问题求助

[复制链接]
2397|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我要实现的功能是:计数P0^2口接收多少个负跳变信号, 直接读取PCA0CPH0    PCA0CPL0 的值,这样有没有问题???没有问题的话,请看下面我为什么得不到想要的结果

PCA配置:
void PCA0_Init()
{
SFRPAGE = PCA0_PAGE;
PCA0CN    = 0x40;            //允许PCA0计数器/定时器
PCA0MD    = 0x08;           //PCA 时钟选择系统时钟  22118400MHZ
PCA0CPM0  = 0x10;         //PCA  Module0--下降沿--P0^2
PCA0CPH0  =   0;
PCA0CPL0  =   0;
}
现给P0^2输入一个负跳变电平,我将PCA0CPH0    PCA0CPL0 输出发现PCA0CPH0=0XBC   PCA0CPL0 = 0XB8     为什么不是 PCA0CPH0= 0X00    PCA0CPL0 = 0X01?

相关帖子

沙发
wh6ic| | 2015-11-2 16:17 | 只看该作者
PCA0MD 寄存器设置错误,应该设置为外部计数器。  -- 有这个功能??

使用特权

评论回复
板凳
受不了了| | 2015-11-2 16:23 | 只看该作者
XBR1要设置PCA连到引脚,EIE1允许PCA中断,需要软件清除中断标志位,你用最简单的方法,点个灯就能观测到是否真的中断了,还有,也没必要一定用PCA0CPH0来计数

使用特权

评论回复
地板
yhn1973| | 2015-11-2 16:52 | 只看该作者
PCA0CPH0、PCA0CPL0 是发生跳变时的时间值,计跳变个数要用中断,或者用C0、C1的外部计数模式

使用特权

评论回复
5
1234567890258| | 2015-11-2 20:11 | 只看该作者
wh6ic 发表于 2015-11-2 16:17
PCA0MD 寄存器设置错误,应该设置为外部计数器。  -- 有这个功能??

PCA0MD 寄存器  应该没问题吧  这是设置PCA时钟

使用特权

评论回复
6
1234567890258| | 2015-11-2 20:14 | 只看该作者
受不了了 发表于 2015-11-2 16:23
XBR1要设置PCA连到引脚,EIE1允许PCA中断,需要软件清除中断标志位,你用最简单的方法,点个灯就能观测到是 ...

定时器0,1,2,4都用了  所以就采用PCA来计数,用PCA计数不开中断可以么?  我用PCA捕捉下降沿,应该是捕捉一个信号  装到PCA0CPL0中去吧???

使用特权

评论回复
7
1234567890258| | 2015-11-2 20:16 | 只看该作者
yhn1973 发表于 2015-11-2 16:52
PCA0CPH0、PCA0CPL0 是发生跳变时的时间值,计跳变个数要用中断,或者用C0、C1的外部计数模式 ...

你的意思:寄存器PCA0CPH0、PCA0CPL0不是用来计跳变的个数?  要是计数必须得用PCA中断才可以?

使用特权

评论回复
8
lyjian| | 2015-11-2 22:08 | 只看该作者
直接用定时器的计算功能
或者PCA时钟源直接设成ECI

使用特权

评论回复
9
yhn1973| | 2015-11-3 09:38 | 只看该作者
1234567890258 发表于 2015-11-2 20:16
你的意思:寄存器PCA0CPH0、PCA0CPL0不是用来计跳变的个数?  要是计数必须得用PCA中断才可以?  ...

是这样的

使用特权

评论回复
10
逛逛看看学学|  楼主 | 2015-11-3 09:55 | 只看该作者

那lyjian 的意思   PCA时钟源可直接设为ECI  也能实现计数,请问这个你知道么

使用特权

评论回复
11
逛逛看看学学|  楼主 | 2015-11-3 09:59 | 只看该作者
lyjian 发表于 2015-11-2 22:08
直接用定时器的计算功能
或者PCA时钟源直接设成ECI

您看下我这样设置有问题么?    是不是计数的值直接通过寄存器PCA0CPH0  PCA0CPL0 读取就可以了

void PCA0_Init()
{
        SFRPAGE = PCA0_PAGE;
        PCA0CN    = 0x40;                    //允许PCA0计数器/定时器
        PCA0MD    = 0x06;           //PCA  时基选择ECI负跳变(100KHZ)
  //  PCA0CPM0  = 0x10;                        //PCA  Module0--下降沿--P0^2
  //  PCA0CPM1  = 0x10;                        //PCA  Module1--下降沿--P0^3
//        PCA0CPH1  =   0;
//        PCA0CPL1  =   0;
//        PCA0CPH0  =   0;
//        PCA0CPL0  =   0;

}

使用特权

评论回复
12
lyjian| | 2015-11-3 12:37 | 只看该作者
本帖最后由 lyjian 于 2015-11-3 12:41 编辑
逛逛看看学学 发表于 2015-11-3 09:59
您看下我这样设置有问题么?    是不是计数的值直接通过寄存器PCA0CPH0  PCA0CPL0 读取就可以了

void PC ...
ECI设在P0^2口
直接读PCA0CPL0\PCA0CPH0

使用特权

评论回复
13
逛逛看看学学|  楼主 | 2015-11-3 13:58 | 只看该作者
lyjian 发表于 2015-11-3 12:37
ECI设在P0^2口
直接读PCA0CPL0\PCA0CPH0

是不是设为ECI   只能计 P0^2口的脉冲数了  而P0^3口脉冲不能计了

使用特权

评论回复
14
Harvard| | 2015-11-3 15:29 | 只看该作者
用工具来配置pca相关 以及io口设置的相关代码 非常成熟的 自己写很蠢

使用特权

评论回复
15
逛逛看看学学|  楼主 | 2015-11-3 15:33 | 只看该作者
Harvard 发表于 2015-11-3 15:29
用工具来配置pca相关 以及io口设置的相关代码 非常成熟的 自己写很蠢

是用工具配置的,我要用PCA模块实现P0^2   P0^3口分别计脉冲,这个一定需要中断吗?

使用特权

评论回复
16
Harvard| | 2015-11-3 15:36 | 只看该作者
不一定吧 定期读 pca模块中对应的捕获寄存器就可以了

使用特权

评论回复
17
Harvard| | 2015-11-3 15:37 | 只看该作者
这年头怎么还会想起用这个片子  不都是arm了吗

使用特权

评论回复
18
受不了了| | 2015-11-3 15:44 | 只看该作者
1234567890258 发表于 2015-11-2 20:14
定时器0,1,2,4都用了  所以就采用PCA来计数,用PCA计数不开中断可以么?  我用PCA捕捉下降沿,应该是捕捉 ...

开中断也不费时间,中断1微秒不到就处理完了,在我的印象里是没有计数功能,就定时器捕捉啊PWM啥的

使用特权

评论回复
19
逛逛看看学学|  楼主 | 2015-11-3 16:27 | 只看该作者
受不了了 发表于 2015-11-3 15:44
开中断也不费时间,中断1微秒不到就处理完了,在我的印象里是没有计数功能,就定时器捕捉啊PWM啥的 ...

好的,多谢   现在我就是采用中断解决了。

使用特权

评论回复
20
逛逛看看学学|  楼主 | 2015-11-5 08:55 | 只看该作者
Harvard 发表于 2015-11-3 15:36
不一定吧 定期读 pca模块中对应的捕获寄存器就可以了

是要用到2个捕捉,所以不好直接读寄存器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

82

帖子

2

粉丝