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

2020-01-30 13:53发布

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

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

  6. //写w4数据
  7. w=(y>>=0);
  8. for(i=0;i<8;i++)
  9. {
  10. ad9851_bit_data=(w>>i)&0x01;
  11. ad9851_w_clk=1;
  12. ad9851_w_clk=0;
  13. }
  14. //写w3数据
  15. w=(y>>8);
  16. for(i=0;i<8;i++)
  17. {
  18. ad9851_bit_data=(w>>i)&0x01;
  19. ad9851_w_clk=1;
  20. ad9851_w_clk=0;
  21. }
  22. //写w2数据
  23. w=(y>>16);
  24. for(i=0;i<8;i++)
  25. {
  26. ad9851_bit_data=(w>>i)&0x01;
  27. ad9851_w_clk=1;
  28. ad9851_w_clk=0;
  29. }
  30. //写w1数据
  31. w=(y>>24);
  32. for(i=0;i<8;i++)
  33. {
  34. ad9851_bit_data=(w>>i)&0x01;
  35. ad9851_w_clk=1;
  36. ad9851_w_clk=0;
  37. }
  38. //写w0数据
  39. w=w0;   
  40. for(i=0;i<8;i++)
  41. {
  42. ad9851_bit_data=(w>>i)&0x01;
  43. ad9851_w_clk=1;
  44. ad9851_w_clk=0;
  45. }
  46. //移入始能
  47. ad9851_fq_up=1;
  48. ad9851_fq_up=0;
  49. }
复制代码接着我将对应输入的输出8Bit的程序从
  1. w=(y>>16);
  2. for(i=0;i<8;i++)
  3. {
  4. ad9851_bit_data=(w>>i)&0x01;
  5. ad9851_w_clk=1;
  6. ad9851_w_clk=0;
复制代码改成了

  1. //w=(y>>16);
  2. for(i=0;i<8;i++)
  3. {
  4. ad9850_bit_data=(y>>(i+16))&0x01;
  5. ad9850_w_clk=0;
  6. ad9850_w_clk=1;
  7. ad9850_w_clk=0;
  8. }
复制代码同时也修改了几个变量的类型:
  1. void ad9850_wr_serial(unsigned char w0,unsigned long int frequence)
  2. {
  3. unsigned char i,w;
  4. unsigned long y;
复制代码这样的直接操作y的形式,但是依然设置和输出频率不对应。

接下来,我又一段一段从最低8Bit开始注销
  1. w=(y>>16);
复制代码这样的语句,0-2这低3位一共24Bit在该语句注销之后能够正常产生1M的正弦波。
但是当我把
  1. //写w1数据
  2. w=(y>>24);
  3. for(i=0;i<8;i++)
  4. {
  5. ad9851_bit_data=(w>>i)&0x01;
  6. ad9851_w_clk=1;
  7. ad9851_w_clk=0;
  8. }
复制代码改成以下之后,输出频率又和设置再次不对应了。
  1. w=(y>>24);
  2. for(i=0;i<8;i++)
  3. {
  4. 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的地址分配实在是费解,还希望曾经有研究过编译过程的坛友能够指点一二,在此先谢过了!!!
0条回答

一周热门 更多>