goolloo 发表于 2013-4-8 22:35:58

今天调试AD9850的32Bit串行数据输入时遇到了一个奇怪的问题

本帖最后由 goolloo 于 2013-4-8 22:37 编辑

第一段是店家给的串行51程序,经过试验,输入数据与输出数据完全不对应。void ad9850_wr_serial(unsigned char w0,unsigned long int frequence)
{
unsigned char i,w;
unsigned long y;
y=frequence*34.359738368;

//写w4数据
w=(y>>=0);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w3数据
w=(y>>8);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w2数据
w=(y>>16);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w1数据
w=(y>>24);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w0数据
w=w0;   
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//移入始能
ad9851_fq_up=1;
ad9851_fq_up=0;
}接着我将对应输入的输出8Bit的程序从w=(y>>16);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;改成了
//w=(y>>16);
for(i=0;i<8;i++)
{
ad9850_bit_data=(y>>(i+16))&0x01;
ad9850_w_clk=0;
ad9850_w_clk=1;
ad9850_w_clk=0;
}同时也修改了几个变量的类型:void ad9850_wr_serial(unsigned char w0,unsigned long int frequence)
{
unsigned char i,w;
unsigned long y;
这样的直接操作y的形式,但是依然设置和输出频率不对应。

接下来,我又一段一段从最低8Bit开始注销w=(y>>16);这样的语句,0-2这低3位一共24Bit在该语句注销之后能够正常产生1M的正弦波。
但是当我把//写w1数据
w=(y>>24);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}改成以下之后,输出频率又和设置再次不对应了。w=(y>>24);
for(i=0;i<8;i++)
{
ad9850_bit_data=(y>>(i+24))&0x01;我和朋友思考之后觉得可能是:y在编译之后实际占用了3个字节,而y之后的第四个字节应该就是w所在的那1个字节,因为w=(y>>24);正好将那一个8bit移动到了(y>>(i+24))&0x01;语句对应的8个bit之上,而且并没有调用w这一变量。


但是在下抱着对于w非常不爽的心态,决定把他赶尽杀绝!

于是尝试调整编译器的编译等级,如下截图:


至此,以前编译和正弦波的频率都输出正常了。


关于y的地址分配实在是费解,还希望曾经有研究过编译过程的坛友能够指点一二,在此先谢过了!!!
页: [1]
查看完整版本: 今天调试AD9850的32Bit串行数据输入时遇到了一个奇怪的问题