本帖最后由 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非常不爽的心态,决定把他赶尽杀绝!
于是尝试调整编译器的编译等级,如下截图:
3.jpg (278.39 KB, 下载次数: 0)
下载附件
2013-4-8 22:34 上传
至此,以前编译和正弦波的频率都输出正常了。
关于y的地址分配实在是费解,还希望曾经有研究过编译过程的坛友能够指点一二,在此先谢过了!!!
一周热门 更多>