搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2010-7-25 15:42:10 | 显示全部楼层 |阅读模式
我用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)

出0入0汤圆

发表于 2010-7-25 15:49:56 | 显示全部楼层
这个要顶 我遇到过可能是干扰导致的类似问题 所以我建议先最小化你的硬件 参考!

出0入0汤圆

 楼主| 发表于 2010-7-25 16:05:10 | 显示全部楼层
回复【1楼】vipcff
-----------------------------------------------------------------------

谢谢!是干扰吗?我现在可以还没加高压.应该说现在还没有强干扰.烦死我了.

出0入0汤圆

 楼主| 发表于 2010-7-25 16:10:47 | 显示全部楼层
用C30编程应该不用考虑"不对齐的字数据取操"吧?如果要考虑的话,应该从何处下手?

出0入0汤圆

发表于 2010-7-25 17:01:17 | 显示全部楼层
要不直接用你的芯片造个脉冲给你的捕捉口,和外面的电路尽可能的先隔开,电源使用保守的线性电源,去掉输入捕捉输入口的电容,再看看?我用C30不考虑地址陷井的 当然啦 我也一菜鸟....还有 中断处先使用最简单的,比如去掉Shadow,autopsv

出0入0汤圆

 楼主| 发表于 2010-7-25 21:14:41 | 显示全部楼层
回复【4楼】vipcff
-----------------------------------------------------------------------
谢谢你!明天我再去试试.

出0入0汤圆

发表于 2010-7-25 22:59:07 | 显示全部楼层
IC4 中断写的有点问题。没有判FIFO。判一下,看看。

出0入0汤圆

发表于 2010-7-25 22:59:34 | 显示全部楼层
然后注意,所有的中断,如果开了IE,就一定要放处理代码。

出0入0汤圆

 楼主| 发表于 2010-7-26 17:57:26 | 显示全部楼层
回复【7楼】headwolf_83
-----------------------------------------------------------------------

谢谢!问题已经解决了.不是FIFO的问题.我去掉中断函数中的shadow参数,就可以了.

出0入0汤圆

 楼主| 发表于 2010-7-26 17:58:25 | 显示全部楼层
回复【4楼】vipcff
-----------------------------------------------------------------------

谢谢,去掉Shadow成功!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 05:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表