【讨论】小问题,大家给点意见

bg7jw   2005-12-15 09:42 楼主
(1) 使用IAR3.30 4K限制版,怎样看程序总大小? 以前可以看,卸载了再重装就看不到了

(2) 在while(1)循环中怎么跳出来?使用break跳出之后程序就飞了

(3) 看资料好象看门狗的最长看门时间为1s(32768晶振,tX2的15次方=1S不知道理解的
可对?)如果我要睡眠2s,应该怎样喂狗呢?

(4) 编译的时候出现警告“last line of file ends without a newline"是怎么回事?

(5) (看我们买的别人的产品用的147)使用32K晶振,测5K的频率,可以精确到0.1Hz,他
们是怎么测出来的呢?一直不明白,我用了1.8432M的晶振才测出来的,并且还是最笨的
方法,Timer_A使用1.8432M的时钟,1s之内取20个周期的平均值来计算(好麻烦啊!)
并且测得的第一个数据还不对,只有19个可以用(浪费。。),不知道问题在哪?大家有
没有别的测频率的好方法吗?指点小弟一下!

(6) 用液晶片可以显示12.345和123.45,但我一直没找到好的方法确定我的小数点在什么地
方,大家有什么建议,小弟感激不尽!

回复评论 (11)

1\编译信息窗口就可以看见,或者生成一个MAP文件
2\while之后还有什么程序?
3、用定时器
4、在最后加一个回车
5、???
6、
int ftostr(dou××e data, char * str)
{
int i,j,k;
long temp,tempoten;
char intpart[20],dotpart[20]; //数的整数部分和小数部分

//1.确定符号位
if(data<0) {str[0]='-';data=-data;}
else str[0]='+';

//2.确定整数部分
temp=(long)data;

i=0;
tempoten=temp/10;
while(tempoten!=0)
{
intpart[i]=temp-10*tempoten+48; //to ascii code
temp=tempoten;
tempoten=temp/10;
i++;
}
intpart[i]=temp+48;

//3.确定小数部分,取了12位小数
data=data-(long)data;
for(j=0;j<12;j++)
{
dotpart[j]=(int)(data*10)+48;
data=data*10.0;
data=data-(long)data;
}

//4.数据组装
for(k=1;k<=i+1;k++) str[k]=intpart[i+1-k];
str[i+2]='.';
for(k=i+3;k<i+j+3;k++) str[k]=dotpart[k-i-3];
str[i+j+3]=0x0D;

return i+j+4;
}
点赞  2005-12-15 10:29
引用:

2\while之后还有什么程序?
5、???
谢谢!

(2)
main()
{
//程序
while
{
//程序
}
}
while结束main也结束了

5、我的意思是没有明白他用32768的晶振检测5KHz的频率为什么还那么准,他是怎么做到这一点的,我没有想明白,请大家一起思考。
我自己的检测周期的程序,测得的第一个数据比实际值小,所以我测了20个数据只有19个可以用,不知道可能是哪里出了问题,请大家给点意见,小弟感激不尽!
点赞  2005-12-15 15:56
2\这种处理方法似乎不妥WHILE后没有程序了,用BREAK后程序就有可能乱跑了,可以进睡眠,或者将WHILE循环改为其它的循环
5、测频法现在有很多,许多都是在程序上下功夫
点赞  2005-12-15 17:20
在AQ软件里编的程序,但是使用的是限制版,所以现在想用IAR软件了,但是还对IAR不太了解,请问,在IAR软件里运行在AQ软件下编的程序需要作什么?
点赞  2005-12-15 17:57
引用:

谢谢!

(2)
main()
{
//程序
while
{
//程序
}
}
while结束main也结束了

5、我的意思是没有明白他用32768的晶振检测5KHz的频率为什么还那么准,他是怎么做到这一点的,我没有想明白,请大家一起思考。
我自己的检测周期的程序,测得的第一个数据比实际值小,所以我测了20个数据只有19个可以用,不知道可能是哪里出了问题,请大家给点意见,小弟感激不尽!
我觉得测量频率,采用周期测量法,是难以达到高精度的。不妨试试“时标”控制计数法,及“单位时间内计数法”。这种方法缺点是测量时间长一点,但精度可以很高,并且与CPU主频关系不大。CPU主频只需要保证较高精度的“时标”间隔就可以了。大多数的频率计都是使用这种方法。
使用32768Hz的晶振,测量5KHz应该是没问题的。
点赞  2005-12-15 20:05
3.2K晶振8分频后可以使狗的看门时间延长至8秒。
点赞  2005-12-15 21:26
引用:

我觉得测量频率,采用周期测量法,是难以达到高精度的。不妨试试“时标”控制计数法,及“单位时间内计数法”。这种方法缺点是测量时间长一点,但精度可以很高,并且与CPU主频关系不大。CPU主频只需要保证较高精度的“时标”间隔就可以了。大多数的频率计都是使用这种方法。
使用32768Hz的晶振,测量5KHz应该是没问题的。

请问什么是“时标控制计数法”呢?是不是当做计数器使用啊,那样我感觉精度也不是很高啊,并且精确不到小数。。。
点赞  2005-12-16 10:48
[quote=lsdfae11]1\编译信息窗口就可以看见,或者生成一个MAP文件

[quote]

可我的编译信息窗口只能看到程序有多少行,错误和警告,并没有程序大小啊?
MAP文件在哪设置的?怎么找不到啊。。。。
点赞  2005-12-16 10:50
设置如下:
project--options--linker--list
选中 generate linker listing 即可
点赞  2005-12-16 12:52
引用:


请问什么是“时标控制计数法”呢?是不是当做计数器使用啊,那样我感觉精度也不是很高啊,并且精确不到小数。。。
所谓“时标控制计数法”就是使用一个定时器产生1个固定宽度的脉冲,比如10s、1s、1ms、0.1ms等。这个脉冲称为“时标”,使用时标的上升沿控制启动一个计数器,对外部输入的频率信号进行计数;在时标的下降沿停止计数器计数。此时计数器中的数值就是时标宽度这个单位时间的频率。对于较高的输入频率信号,还可以先进行分频处理(比如2、4、8、10分频),此时计数器中的值只要乘以分频系数就可以还原测量信号的频率值了。
所以,只要计数器具备高速特性和比较精确的时标信号,就可以精确测量频率了。如你所述的0.1Hz的精度,先将外部信号进行10分频后输入,采用1s或0.1s时标测量,就可以实现0.1Hz的测量精度。
点赞  2005-12-16 13:13
还有个问题,如果原来显示出来的是12.34,我想修改为2.345,我怎么修改不了呢?改也只能改一位,还不能保存。。。(不需要掉电保存,不掉电也保存不了)
点赞  2005-12-16 13:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复