打印

PIC24FV16KM202 捕捉模块CCP1设置成功能输入捕捉中断,同样的设置CCP2却未成功

[复制链接]
643|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fancychg1|  楼主 | 2020-4-8 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC24FV16KM202 捕捉模块CCP1设置成功能输入捕捉中断,同样的设置CCP2却未成功捕捉输入进中断。可能是什么原因呢?
void initCCP2()
{
CCP2TMRH=0;
CCP2TMRL=0xFFFF;
CCP2PRH=0xFFFF;
CCP2PRL=0x0;

IEC0bits.CCP2IE = 0;   //????????
CCP2CON1Lbits.CCPON=1;  //??????
CCP2CON1Lbits.CLKSEL=0; //????????
CCP2CON1Lbits.TMRPS=0;  //????????
CCP2CON1Lbits.T32=1;    //??32????
CCP2CON1Lbits.CCSEL=1;  //??1???0?????
CCP2CON1Lbits.MOD=0b0010;   //????????????
CCP2CON1Hbits.RTRGEN=1; //  ????????
CCP2CON1Hbits.OPS3=0;   //??????????
CCP2CON1Hbits.TRIGEN=0; //?????????
CCP2CON1Hbits.ONESHOT=0;    // ???????
CCP2CON2Lbits.ASDG=0;   //????????
CCP2CON2Hbits.ICS=0x11;    //??????0-input capture IO;   0x011-?comparator 3 output
CCP2STATLbits.TRSET=1;  //???????
CCP2STATLbits.TRCLR=1;  //???????

IPC0bits.CCP2IP=0b011;                //???????
IPC0bits.T1IP=0b010;        //???1?????
CCP2CON1Lbits.CCPON=1;      //??????
IFS0bits.CCP2IF = 0;        //?????
IEC0bits.CCP2IE = 1;                 //Enable CCP2 interrupt.
}

使用特权

评论回复
沙发
CoolSilicon| | 2020-4-8 16:28 | 只看该作者
1.检查端口初始化, 是否是数字功能
2. 端口是否正确连接到CCP2

使用特权

评论回复
板凳
fancychg1|  楼主 | 2020-4-9 09:06 | 只看该作者
CoolSilicon 发表于 2020-4-8 16:28
1.检查端口初始化, 是否是数字功能
2. 端口是否正确连接到CCP2

有初始化,设置了IO方向为输入。连接到CCP2了。

使用特权

评论回复
地板
CoolSilicon| | 2020-4-9 09:17 | 只看该作者
fancychg1 发表于 2020-4-9 09:06
有初始化,设置了IO方向为输入。连接到CCP2了。

除了方向之外,还要看该引脚是否复用了模拟功能, 如果复用了,要设置成数字口, 一般来说是ANSELx寄存器.你看看

使用特权

评论回复
5
fancychg1|  楼主 | 2020-4-9 14:13 | 只看该作者
CoolSilicon 发表于 2020-4-9 09:17
除了方向之外,还要看该引脚是否复用了模拟功能, 如果复用了,要设置成数字口, 一般来说是ANSELx寄存器.你 ...

CPP1是成功的,只设置了RB13,14,15为AD模拟。之前也遇到个问题是无法读取IO的高电平,而刻意设ANSEL=0时,该IO口似乎才能读到1,另外LAT读不到,而PORT才读到。试试将CCP2的口设ANSEL=0再试。

使用特权

评论回复
6
CoolSilicon| | 2020-4-10 09:16 | 只看该作者
fancychg1 发表于 2020-4-9 14:13
CPP1是成功的,只设置了RB13,14,15为AD模拟。之前也遇到个问题是无法读取IO的高电平,而刻意设ANSEL=0时 ...

读PORT, 写LAT,你寄存器都操作错了,怎么能行呢.
花点时间看下datasheet,研究一下基础的东西吧..
对于IO口来说,如果做数字功能, 必须先设置对应的ANSELx为数字引脚,然后设置TRISXx为输入/输出功能.
这些都是基础!

使用特权

评论回复
7
fancychg1|  楼主 | 2020-4-30 15:22 | 只看该作者
CoolSilicon 发表于 2020-4-10 09:16
读PORT, 写LAT,你寄存器都操作错了,怎么能行呢.
花点时间看下datasheet,研究一下基础的东西吧..
对于IO口 ...

请问所有口是默认为功能口吗?似乎默认是输入口吧。如果是打算用功能口则进行功能设置,否则都要先进行ANSELX设置吗?没有ANSELX设置有时也是能IO读写的。在哪些datasheet会说明呢?我看到的datasheet里没这样说的详细。另外,下面的说法读LAT也是可以啊。( Writes to the latch, write the latch.)

All port pins have three registers directly associated
with their operation as digital I/O. The Data Direction
register (TRISx) determines whether the pin is an input
or an output. If the Data Direction register bit is a ‘1’,
then the pin is an input. All port pins are defined as
inputs after a Reset. Reads from the Data Latch register
(LATx), read the latch. Writes to the latch, write the
latch. Reads from the port (PORTx), read the port pins;
writes to the port pins, write the latch.

使用特权

评论回复
8
CoolSilicon| | 2020-5-6 09:18 | 只看该作者
fancychg1 发表于 2020-4-30 15:22
请问所有口是默认为功能口吗?似乎默认是输入口吧。如果是打算用功能口则进行功能设置,否则都要先进行ANS ...

操作IO口的目的是实现与外部信号的交互,读PORT, 写LATx。只有这样的操作才是真正的读外部引脚,和输出到外部引脚。
如果读LATx,只是读缓存而已。。。
写PORT的话,可能会因为你外部电路设计不好的问题,引起莫名的异常。

其实,上面的操作datasheet上都有说的。你一字不漏的把datasheet看5遍,就有收获了。。。

使用特权

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

本版积分规则

7

主题

20

帖子

0

粉丝