我在用dsPIC33调试一个系统出了问题,大家给帮帮我吗?

2020-02-09 11:30发布

我用dsPIC33FJ64MC706+C30调试一个变频电源,不知道为什么总是进地址错误陷阱?查了芯片手册说:"所有字访问必须按偶地址对齐。不支持不对齐的字数据
取操作, 所以在混合字节和字操作时, 或者从8位MCU代码移植时,必须要小心。如果试图进行不对齐的读或写操作,将产生地址错误陷阱。如果在读操作时产生错误,正在执行的指令将完成;而如果在写操作时产生错误, 指令仍将执行, 但不会进行写入。无论是哪种情况,都会产生陷阱,从而系统和 / 或用户能够检查地址错误发生之前的机器状态。"
我不知道用C30编程为什么会发生不对齐的字数据取操作,你们在使用过程中碰到过这种情况吗?怎么解决呢?
以下是两个中断服务程序:
//IC4捕捉中断(捕捉时基来自T2)用于测定外部市电信号周期
void __attribute__((interrupt, shadow, auto_psv)) _IC4Interrupt(void)  
{
        uint tmp1;
        while(IC4CONbits.ICBNE) tmp1=IC4BUF; //取第二次捕捉值
        //section=0;    //同步相位
        //phasepoint=0;
        Tac=65536-oldIC4+tmp1;       
        if (tmp1<oldIC4) Tac+=65536;       
          if (Tac>108000 || Tac<72000) Tac=90000;
          oldIC4=tmp1;    //保存本次捕捉值
        _IC4IF=0;
}

void __attribute__((interrupt, shadow, auto_psv)) _PWMInterrupt(void)  //PWM周期匹配中断
{
        ulong tmp_point;
        uint tabpoint;
        uint Tmin,Tmid,Tmax;
        uint t1,t2;
        _IC4IE=0;
        if (LightTime) LightTime--;
        //计算t1,t2
        tabpoint=phasepoint>>24;   
        t1=((unsigned long long)Amp*PWMTOP*sintab[tabpoint])>>31;     //t1渐增
        t2=((unsigned long long)Amp*PWMTOP*sintab[256-tabpoint])>>31;  //t2渐减

        Tmin=(2*PWMTOP-t1-t2)>>1;
        if (section%2==0)
        {
                Tmid=Tmin+t1;     
                Tmax=Tmid+t2;               
        }
        else
        {
                Tmid=Tmin+t2;
                Tmax=Tmid+t1;               
        }
        if (section==0)                //K4渐小,K6渐大,Tmid渐增
        {
                PDC1=Tmax;                       
                PDC2=Tmid;
                PDC3=Tmin;
        }
        else if(section==1) //K6渐小,K2渐大,Tmid渐减
        {
                PDC1=Tmid;                       
                PDC2=Tmax;
                PDC3=Tmin;
        }
        else if(section==2)//K2渐小,K3渐大,Tmid渐增
        {
                PDC1=Tmin;                       
                PDC2=Tmax;
                PDC3=Tmid;
        }
        else if(section==3)//K3渐小,K1渐大,Tmid渐减
        {
                PDC1=Tmin;                       
                PDC2=Tmid;
                PDC3=Tmax;
        }
        else if(section==4)//K1渐小,K5渐大,Tmid渐增
        {
                PDC1=Tmid;                       
                PDC2=Tmin;
                PDC3=Tmax;
        }
        else if(section==5)//K5渐小,K4渐大,Tmid渐减
        {
                PDC1=Tmax;                       
                PDC2=Tmin;
                PDC3=Tmid;
        }
        tmp_point=phasepoint+delta_phase;
        if (tmp_point<phasepoint) //自然溢出
        {
                section++;
                if (section>=6) section=0;
        }
        phasepoint=tmp_point;
        _IC4IE=1;
        _PWMIF=0;
}
我关闭了IC4中断,就不会进地址错误陷阱,但是我必须用IC4捕捉输出波型的周期.

(原文件名:无标题.jpg)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
headwolf_83
1楼-- · 2020-02-10 16:32
然后注意,所有的中断,如果开了IE,就一定要放处理代码。
chy31238
2楼-- · 2020-02-10 20:18
回复【7楼】headwolf_83
-----------------------------------------------------------------------

谢谢!问题已经解决了.不是FIFO的问题.我去掉中断函数中的shadow参数,就可以了.
chy31238
3楼-- · 2020-02-11 01:08
回复【4楼】vipcff
-----------------------------------------------------------------------

谢谢,去掉Shadow成功!

一周热门 更多>