打印
[PIC®/AVR®/dsPIC®产品]

关于Interrupt On Change使用的疑问,坐等大侠解答~~~~~~

[复制链接]
1862|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhongs98|  楼主 | 2015-1-14 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我选用PIC12F615设计一款分频电路,想使用InterruptOnChange中断来检测输入信号的变化,
现输入信号是0-5V方波,问题是检测不到输入变化,、请各位分析下我的Firmware有什么问题。谢谢
void system_init01(void)
{
    ANSELbits.ANS = 0;          //
    TRISIObits.TRISIO2 = 1;     // Input
    TRISIObits.TRISIO5 = 1;     // Input
    TRISIObits.TRISIO4 = 1;     // Input
    TRISIObits.TRISIO0 = 0;     // Output
    TRISIObits.TRISIO1 = 0;     // Output

    WPUbits.WPU0 = 1;           // 1 = Pull-up enabled
    WPUbits.WPU1 = 1;           // 1 = Pull-up enabled
    WPUbits.WPU2 = 1;           // 1 = Pull-up enabled
    WPUbits.WPU4 = 1;           // 1 = Pull-up enabled
    WPUbits.WPU5 = 1;           // 1 = Pull-up enabled

    IOCbits.IOC0 = 1;           // 1 = Interrupt-on-change enabled
    IOCbits.IOC1 = 1;           // 1 = Interrupt-on-change enabled
    INTCONbits.GPIE = 1;        // 1 = Enables the GPIO change interrupt
    INTCONbits.GPIF = 0;        // 1 = When at least one of the GPIO <5:0> pins changed state (must be cleared in software)
}

bit Roll_IOC_Edge_Changed(void)
{
    if(INTCONbits.GPIF ==  1)
    {
        ioc_edge_count++;
        ioc_edge_count %= (unsigned int)(pulse_per_cycle*4);
        INTCONbits.GPIF = 0;
        return 1;
    }
    else
    {
        return 0;
    }
}

//-----------
void main(void) {
    system_init01();
    GPIObits.GP0 = 0;
    GPIObits.GP1 = 0;
    INTCONbits.GIE = 1;         //1 = Enables all unmasked interrupts
    while(1)
    {
        #ifdef NON_DIVIDE
            GPIObits.GP0 = GPIObits.GP2;
            GPIObits.GP1 = GPIObits.GP5;

        #else
            if(Roll_IOC_Edge_Changed())
            {
                //if(ioc_edge_count < Encoder_Cycle_Second)
                    if(ioc_edge_count < 8)
                {
                    GPIObits.GP0 = 0;       // A phase
                }
                else
                {
                    GPIObits.GP0 = 1;       // A phase
                }

                //if((ioc_edge_count < Encoder_Cycle_Third) && (ioc_edge_count >= Encoder_Cycle_First))
                if((ioc_edge_count < 24) && (ioc_edge_count >= 16))
                {
                    GPIObits.GP1 = 0;       // B phase
                }
                else
                {
                    GPIObits.GP1 = 1;       // B phase
                }
            }
        #endif
    }
}

沙发
zhongs98|  楼主 | 2015-1-14 11:15 | 只看该作者
Up

使用特权

评论回复
板凳
zhongs98|  楼主 | 2015-1-14 14:10 | 只看该作者
没人用过这个功能?

使用特权

评论回复
地板
949155525| | 2015-1-14 20:20 | 只看该作者
为什么不用74系列芯片

使用特权

评论回复
5
zhongs98|  楼主 | 2015-1-15 09:27 | 只看该作者
949155525 发表于 2015-1-14 20:20
为什么不用74系列芯片

你好,已经解决,输入端口没设置对,用单片机的原因是软体参数可以修改,也便宜

使用特权

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

本版积分规则

4

主题

129

帖子

2

粉丝