打印

请教dsPIC30F4011使用的三个问题:除法指令/LVD/FRC PLL16X

[复制链接]
4011|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
碧水长天|  楼主 | 2009-8-6 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 碧水长天 于 2009-8-6 10:05 编辑

最近在用dsPIC30F4011这颗片子,遇到了3个问题:
开发环境:MPLAB V8.33+C30学生版+ICD2

问题1:除法指令的使用

    在C程序中,一条这样的指令:16位无符号=32位无符号/16位无符号,发现运行很耗时,查看汇编代码,发现没有编译成DIV.UD指令,而是recall 0x000180来处理,同样32位有符号除以16位有符号运算时,会调用0x0001a0的代码来处理。请问,如何才能避免编译器这样做?

问题2:LVD(低电压检测)的问题

    LVD初始化代码,我按照手册书写如下:
static void vInitLvd(void)
{
    RCONbits.LVDL = LVD_4D6V; //LVD_4D6V为自己的宏定义;
    IEC2bits.LVDIE = 0;
    RCONbits.LVDEN = 1;
    IFS2bits.LVDIF = 0;
    while (RCONbits.BGST == 0); // 此句取消不影响本问题结果
    IEC2bits.LVDIE = 1;
}
    系统打开了欠压复位,欠压复位设置为2.7V或者4.2V。仿真或者程序下载独立运行时,降低电压到阀值电压点以下,系统均无法进入LVD的中断(中断ISR设置无误,并且有LED监控和eeprom操作),请问问题可能出在哪里?

问题3:如何打开dsPIC30F4011的FRC PLL 16X?

    我使用内部振荡器,在器件配置中设置为FRC W/PLL 16X,查看F80000的内容也为0xFDF3了,但是程序运行时,仍然按7.3827Mhz运行,无法倍频到16,试过其他低的倍频数也不行;尝试用_FOSC指令来设置也不行,请教是何故?

     请了解的站友指点,不胜感激!
沙发
yewuyi| | 2009-8-6 10:07 | 只看该作者
俺没用过这么高档的MCU呢。

呵呵,联系MARTIN解决。

使用特权

评论回复
板凳
碧水长天|  楼主 | 2009-8-6 10:14 | 只看该作者
本帖最后由 碧水长天 于 2009-8-6 10:24 编辑

多谢yewuyi兄帮顶,其实,越低档的MCU越需要使用者的单片机系统设计技巧。

这些问题若能得到MARTIN的指点就更好了。

使用特权

评论回复
地板
rockn| | 2009-8-6 19:07 | 只看该作者
dspic分mcu指令和dsp指令,似乎编译器默认产生的代码都是mcu指令,怀疑想用dsp指令是否只能用汇编?请martin指点吧!

使用特权

评论回复
5
碧水长天|  楼主 | 2009-8-7 07:13 | 只看该作者
恩。LVD的问题是我自己不够细心,仔细阅读了4011的专用文档,发现没有提到LVD功能。应该该功能只在某些芯片上才存在。

使用特权

评论回复
6
martin| | 2009-8-7 11:48 | 只看该作者
问题一:对于C编译器来说,遇到数**算,它难以帮你分析当前的运算是否是可以用最简洁的汇编指令来实现,它只是图方便地直接调用数学库函数来实现。如果你觉得这样效率太低,可以自己用行内汇编来做。另外,你既有有符号的除法,又有无符号的除法,如果可能的话,尽量都统一到“有符号”或者“无符号”的运算,否则,它就会调用两种库函数。

问题三:FOS的两位应该为11。你选的01是直接使用FRC,此时FPR的4个位就失去作用了。

使用特权

评论回复
7
martin| | 2009-8-7 12:12 | 只看该作者
晕倒,“数学-运算”竟然变成了“数**算”,21IC也开始用滤霸了!

使用特权

评论回复
8
XIEYUANBIN| | 2009-8-7 20:59 | 只看该作者
早两天回复不起来~~~~这个问题,是因为PICC30是根据GCC开放代码改编过来,很多没有针对DSP内核做调整,还是要用汇编的。

使用特权

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

本版积分规则

20

主题

120

帖子

1

粉丝