打印

关于xc16编译器的乘法问题

[复制链接]
2377|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飞驰的蜗牛|  楼主 | 2016-4-25 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞驰的蜗牛 于 2016-4-25 15:33 编辑

关于dspic的单片机 在使用汇编和C语言做乘法发现其结果不一样(AN1078代码)
汇编代码是_CalcOmegaFltred:
CalcOmegaFltred:
        mov _smc1+SMC_OmegaFltred, W0   
        mov _smc1+SMC_Omega, W4
        mov _smc1+SMC_FiltOmCoef, W5

        lac W0, A
        mpy W4*W5, B
        add A

        mov _smc1+SMC_OmegaFltred, W4
        mpy W4*W5, B
        neg B
        add A

        sac.r A, #0, W0
        mov W0, _smc1+SMC_OmegaFltred

而我改写成C代码
void CalcOmegaFiltred(SMC *s)
{
    SFRAC16 data1=0;
    SFRAC16 data2=0;
    data1=s->Omega * s->FiltOmCoef;
    data2=data1+s->OmegaFltred;
    data1=s->FiltOmCoef ,*s->OmegaFltred;  
    s->OmegaFltred= data2-data1;
}

则发现C代码完全无法使用, 则发现是 sac指令导致截取累加器A的不同位造成的,如果不使用内嵌乘法__builtin_mpy(),指令,如何改造这个C代码使其能够正常工作,请大神指导下

沙发
飞驰的蜗牛|  楼主 | 2016-4-26 14:16 | 只看该作者
已解决

使用特权

评论回复
板凳
飞驰的蜗牛|  楼主 | 2016-4-26 17:29 | 只看该作者
额  还是不对  
void CalcOmegaFiltred(SMC *s)
{
   long data1=0;
   long data=0;
   data=s->Omega-s->OmegaFltred;
   data1=s->FiltOmCoef * data;
   s->OmegaFltred= s->OmegaFltred+data1/32768;   
}
求指导下

使用特权

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

本版积分规则

6

主题

22

帖子

0

粉丝