PIC33F64MC506芯片,IC模块的配置

[复制链接]
685|22
手机看帖
扫描二维码
随时随地手机跟帖
heweibig|  楼主 | 2021-12-7 22:45 | 显示全部楼层 |阅读模式
PIC33F64MC506芯片,IC模块的配置

使用特权

评论回复
pengf| | 2021-12-7 22:49 | 显示全部楼层

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 22:51 | 显示全部楼层
靠自己查找手册写的初始化函数,我只知道需要TIMER2的初始化。有什么地方写错了吗

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 22:53 | 显示全部楼层
int Input_caputre(void)

{

        IC1CONbits.ICM = 0b00;

        IC1CONbits.ICTMR = 1;        //Select Timer2 as the IC1 Time base

        IC1CONbits.ICI = 0b01;                // Interrupt on every fourth capture event

        IC1CONbits.ICM = 0b011;                //Capture mode, every 4th rising edge

        

        IPC0bits.IC1IP = 3; // Setup IC1 interrupt priority level

        IFS0bits.IC1IF = 0; // Clear IC1 Interrupt Status Flag

        IEC0bits.IC1IE = 1; // Enable IC1 interrupt

        

        return 1;

}

int timer2_init()

{

    T2CONbits.TON = 0;              // 确保T2关闭,再进行初始化

        T2CONbits.TCKPS = 0;

        T2CONbits.T32 = 0;

    T2CONbits.TCS = 0;

        TMR2 = 0;

        PR2 = 0x0FF;



        IFS0bits.T2IF = 1;

        IEC0bits.T2IE = 1;

        IPC1bits.T2IP = 1;



        T2CONbits.TON = 1;

        return 1;

}

void __attribute__((__interrupt__,no_auto_psv))_IC1Interrupt(void)

{

        unsigned int t1,t2;

        t1=IC1BUF;

        t2=IC1BUF;

        IFS0bits.IC1IF=0;

        LATB=(PORTF ^ 0x01);

}

使用特权

评论回复
juventus9554| | 2021-12-7 22:55 | 显示全部楼层
应该没问题,就是捕捉四次中断 ,但是你又才读两次,可能造成输入捕捉溢出,溢出之后就不会产生中断了。

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 22:57 | 显示全部楼层
对,是应该仿真的,虽然我又开了一个关于仿真错误的帖子。

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:00 | 显示全部楼层
也就是说我这个软件代码的配置是正确的咯?

使用特权

评论回复
jlyuan| | 2021-12-7 23:02 | 显示全部楼层
你可以软件仿真,看有没有进入中断。

使用特权

评论回复
stly| | 2021-12-7 23:06 | 显示全部楼层
而且我看你的备注是每4次捕获中断一次,而且是4次上升沿捕获一次,也就是要16次才能进入中断啊

使用特权

评论回复
pengf| | 2021-12-7 23:09 | 显示全部楼层
你倒是描述下问题现象啊

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:13 | 显示全部楼层
这款芯片的IC1-IC4功能的引脚是RD8~RD11。程序原理是利用IC检测按键开关的上升沿电平,进入中断反转io口的输出。烧进芯片后io输出无变化。

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:16 | 显示全部楼层
或者说各位能不能告诉在下,在哪可以找到这款芯片各种外设的官方例程呢。去官网逛了一圈没找到

使用特权

评论回复
wuhany| | 2021-12-7 23:18 | 显示全部楼层
手册  http://ww1.microchip.com/downloads/en/DeviceDoc/70198D.pdf


例子
https://www.microchip.com/doclisting/CodeExamplesByFunc.aspx

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:20 | 显示全部楼层
感谢各位的耐心解答,在下已经通过楼上发的网址里找到了官方例程,成功使用IC/输入捕捉模块实现了功能。

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:21 | 显示全部楼层
下面贴出官方文档编号和在下的代码

官方代码编号CE058

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:23 | 显示全部楼层
int Input_caputre3(void)

{

        T3CON        = 0x8030;

        

        IC3CON = 0;

        IC3CONbits.ICTMR = 0;        //Select Timer3 as the IC3 Time base

        IC3CONbits.ICSIDL = 0;

        IC3CONbits.ICI = 0b0;                //每个捕捉事件中断一次

        IC3CONbits.ICM = 0b1;                //Capture mode, every edge (rising and falling)

        

        IPC9bits.IC3IP = 3; // Setup IC3 interrupt priority level

        IFS2bits.IC3IF = 0; // Clear IC3 Interrupt Status Flag

        IEC2bits.IC3IE = 1; // Enable IC3 interrupt

        

        return 1;

}

int Input_caputre1(void)

{

        T3CON        = 0x8030;                // 1:256 internal clock, start T3.

        IPC0bits.IC1IP  =  1;                         // Setup Input Capture 1 interrupt for desired priority

        // level (this example assigns level 1 priority)

        IFS0bits.IC1IF                 = 0;                 // Clear the IC1 interrupt status flag

        IEC0bits.IC1IE                 = 1;                 // Enable IC1 interrupts

        IC1CON                         = 0x0000;        // Turn off Input Capture 1 Module

        IC1CONbits.ICSIDL        = 0;                // Input capture module will continue to operate in CPU Idle mode

        IC1CONbits.ICTMR        = 0;                // TMR3 contents are captured on capture event

        IC1CONbits.ICI                = 0;                // Interrupt on every capture event

        IC1CONbits.ICM                = 1;                // Capture mode, every edge (rising and falling)



}

void __attribute__((__interrupt__,no_auto_psv))_IC1Interrupt(void)

{

        unsigned int t1;

        IFS0bits.IC1IF =  0;

        t1=IC1BUF;

        LATF=(PORTF ^ 0xff);

        //IC1flag = 1;

}

void __attribute__((__interrupt__,no_auto_psv))_IC3Interrupt(void)

{

        unsigned int t1;

        IFS2bits.IC3IF = 0;

        t1=IC3BUF;

        LATF=(PORTF ^ 0xff);

        

}

使用特权

评论回复
heweibig|  楼主 | 2021-12-7 23:25 | 显示全部楼层
多谢大家讨论这么多哈

使用特权

评论回复
tpgf| | 2022-1-6 10:07 | 显示全部楼层
楼主想实现什么功能呢

使用特权

评论回复
keaibukelian| | 2022-1-6 10:11 | 显示全部楼层
通过哪个模块实现的啊

使用特权

评论回复
labasi| | 2022-1-6 10:15 | 显示全部楼层
可以有多重模式吗

使用特权

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

本版积分规则

869

主题

13089

帖子

7

粉丝