打印
[AVR单片机]

我的算法哪里错了?怎么会出莫明其妙的结果

[复制链接]
1683|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powte|  楼主 | 2007-5-19 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个从电压电流算出功率的东西,在0.5A还正常,到0.7A,数值突然就不对了。
大家看下面两个图片,第一个电压×电流得出的功率是对的,第二个图片就差了好远,怎么回事?
程序:
    PA=(uint16_t)((uint32_t)(VA*IA)/100);
    if(I1)
    {
        if(V10)dot_p=3;
        else dot_p=2;
    }
    else
    {
        if(V10)dot_p=2;
        else dot_p=1;
    }
显示的电压电流数字就是得到的ADC的值,只是加上了小数点。dot_p是小数点位置。

显示部分的程序:
    if(dot_p==3)
    {
        i=3;j=4;k=5;
    }
    else if(dot_p==2)
    {
        i=4;j=3;k=5;
    }
    else
    {
        i=5;j=3;k=4;
    }
    
    //第二行
    LCD_data_G[1][0]=' ';        
    LCD_data_G[1][1]=48+PA/10000;        PA%=10000;
    LCD_data_G[1][2]=48+PA/1000;        PA%=1000;
    LCD_data_G[1]='.';
    LCD_data_G[1][j]=48+PA/100;        PA%=100;
    LCD_data_G[1][k]=48+PA/10;            PA%=10;
    LCD_data_G[1][6]=48+PA;
    LCD_data_G[1][7]='W';

相关帖子

沙发
powte|  楼主 | 2007-5-19 23:18 | 只看该作者

正确的图

使用特权

评论回复
板凳
powte|  楼主 | 2007-5-19 23:20 | 只看该作者

也没有别的调试手段,只有一个ISP下载器。

不知道从哪里下手找原因了。

使用特权

评论回复
地板
xwj| | 2007-5-19 23:40 | 只看该作者

数据溢出了,应该这样写:

PA=(uint16_t)(((uint32_t)(VA)*(uint32_t)(IA))/100);

算法的东西可以先软件仿真啊

使用特权

评论回复
5
powte|  楼主 | 2007-5-20 10:07 | 只看该作者

楼上的对,我昨天晚上用AVRSTDUIO试验解决了。就是这样

使用特权

评论回复
6
powte|  楼主 | 2007-5-20 10:13 | 只看该作者

再告诉大家一个好事。新版本WinAVR 20070525rc2可以优化很多

昨天晚上试的,同样一个TINY26的程序,用同一个MAKEFILE,20070525rc2和20060421编译出来的结果,差了50~60个字节。
还是新版本好。

20060421的

Size before:
AVR Memory Usage
----------------
Device: attiny26

Program:    1976 bytes (96.5% Full)
(.text + .data + .bootloader)

Data:         53 bytes (41.4% Full)
(.data + .bss + .noinit)

20070525rc2的

Size after:
AVR Memory Usage
----------------
Device: attiny26

Program:    1926 bytes (94.0% Full)
(.text + .data + .bootloader)

Data:         53 bytes (41.4% Full)
(.data + .bss + .noinit)

使用特权

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

本版积分规则

5

主题

69

帖子

1

粉丝