1

我拼命尝试完成的项目在微控制器编程方面相当简单。我使用的 dspic33fj128mc802 基本上要做 3 件事:

  • 通过UART接收数据并将其转换为伺服电机的PWM信号

  • 定期唤醒其 ADC 以检查电池电量

  • 输入外部中断时更改其波特率工作值。

这是导致问题的最后一点。在我的电路中,我有一个开关。一个位置对应一个波特率值,另一个位置对应第二个值。我没有找到任何关于如何在任何电压电平变化时触发中断的文档,所以我结合使用上升沿和下降沿触发来检查我为中断选择的引脚的当前状态。

此外,我的代码中还有另外两个中断函数,一个用于 UART 接收,第二个是用于定期唤醒 ADC 的定时器中断。中断优先级如下:UART -> 1,定时器 -> 2,外部中断 -> 6(实际上是 2 以上的任何数字)。

这是我的中断代码:

void __attribute__((interrupt, auto_psv)) _INT0Interrupt( void ) 
{   
IEC0bits.INT0IE = 0; // disable INT0 interrupt

if(IFS0bits.INT0IF){ 
    if (PORTBbits.RB7 == 1){ //if pin at high logic level
        INTCON2bits.INT0EP = 1; //falling edge trigger
        LATAbits.LATA0 = 1;
        U1BRG = 23;
    }
    else{ //if pin at low logic level
        INTCON2bits.INT0EP = 0; //rising edge trigger
        LATAbits.LATA0 = 0;
        U1BRG = 1;
    }
}
IFS0bits.INT0IF = 0; //clear INT0 flag
IEC0bits.INT0IE = 1; // enable INT0 interrupt

}

现在奇怪的行为->当将引脚拉低时,波特率设置为正确的值,UART通信完美。当拉高时,之前的通信不再起作用,证明波特率已经改变,但是将新的通信设置为新的波特率也不起作用。LED 状态更改也可以正常工作。

需要注意的是,这个项目的所有不同方面都经过了多次测试,每个部分都运行良好,只是添加了这个外部中断导致整个事情崩溃。微控制器工作正常,我的波特率值很好,我的电路已经过测试并且没有问题......我想我不知道如何正确使用外部中断。

4

0 回答 0