今天调试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]