智能车制作

标题: AD装换设置为8位数据右对齐,读结果寄存器到底该读低8位还是高8位? [打印本页]

作者: LYL0707    时间: 2011-2-14 14:26
标题: AD装换设置为8位数据右对齐,读结果寄存器到底该读低8位还是高8位?
AD装换设置为8位数据右对齐,理论上右对齐的8位数据应该储存在结果寄存器的低八位。实际测时却是低8位值是乱的 ,高8位是准确的。下面是我的代码,请高手解答下



  1. #include <hidef.h> /* common defines and macros */
  2. #include <MC9S12XS128.h> /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12xs128"


  4. byte AD_Data=0;
  5. //*
  6. void Delay(int i) {
  7. int j;
  8. for(;i>0;i--)
  9. for(j=500;j>0;j--)
  10. ;
  11. }
  12. //*/
  13. /***---------------初始化程序---------------***/
  14. void InitBusClk(void)
  15. {
  16. CLKSEL=0X80; //PLLSEL 1 : Bus Clock=PLLCLK/2
  17. // 0 : Bus Clock=OSCCLK/2

  18. PLLCTL_PLLON=1; //开启PLL

  19. SYNR=0;
  20. REFDV=0X03; //OSCCLK=16MHz
  21. //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz

  22. while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环

  23. CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz
  24. // 0 : Bus Clock=OSCCLK/2=16M/2=8MHz
  25. }

  26. void InitAD(void){
  27. ATD0CTL2 = 0XC3;
  28. // 110 000 11 启动A/D, 快速清除标志位,无等待模式, 外部触发禁止(bit2=0)
  29. // 中断开放(bit1=1,bit0=1)
  30. // bit1 :ATD Sequence Complete Interrupt Enable
  31. // bit0 :ATD Sequence Complete Interrupt Flag
  32. ATD0CTL3 = 0X0C;
  33. // 0 0001 1 00 转换序列为 1 、 FIFO模式启动,冻结模式下继续转换
  34. ATD0CTL4 = 0XE1; // 1 11 00001 8位精度, 16AD采样时间
  35. // 总线(1+1)*2 = 4 分频,AD 时钟 = 1M
  36. ATD0CTL5 = 0XA7;
  37. // 1010 0111 右对齐,无符号,连续转换,单通道, 起始通道 ATD7
  38. ATD0DIEN = 0X00; // 数字输入 disabled
  39. }


  40. /***---------------主程序---------------***/
  41. void main(void)
  42. {
  43. /* put your own code here */
  44. DisableInterrupts; //关中断

  45. InitBusClk();

  46. InitAD();

  47. DDRB=0XFF; //设B口为输出口

  48. PORTB=0X00;

  49. EnableInterrupts; //开中断

  50. for(;;)
  51. {
  52. while(!ATD0STAT2L_CCF7);
  53. PORTB=(byte)AD_Data; //B口显示转换结构
  54. }
  55. }
  56. /***---------------中断服务程序---------------***/
  57. #pragma CODE_SEG NON_BANKED
  58. void interrupt 22 IntAD(void){ // AD转换的中断向量号为22

  59. DisableInterrupts; //关中断

  60. while(!ATD0STAT2L_CCF7);
  61. AD_Data=ATD0DR0H; //读取AD 转换结果寄存器高八位,理论上该是AD_Data=ATD0DR0L,实际测试却没问题这是为什么?
  62. EnableInterrupts; //开中断
  63. }
  64. #pragma CODE_SEG DEFAULT
复制代码

作者: LYL0707    时间: 2011-2-14 14:53
这个问题本人已解决。查找XS128的头文件发现:AD数据左右对齐方式的控制位DJM在ATD0CTL3的最高位,而ATD0CTL5的最高位是任意位,这与大部分的参考资料上写的有所不同。本人程序中ATD0CTL3=0x0c设置的是左对齐不是之前认为的右对齐,因此数据存在了结果寄存器的高八位。
作者: DONT    时间: 2011-2-24 20:55
真是重要信息啊。。。我整了大晚上~得高人指点一下就出来了,哈哈。。。太谢谢啦
作者: huang512ch    时间: 2011-2-27 21:17
楼主,写多一点,太有用了,谢谢啦
作者: lulo    时间: 2011-2-28 11:10

作者: 虫子    时间: 2011-2-28 22:18
哦   恍然大悟
作者: liuruipo    时间: 2011-3-11 20:02
顶了,重要信息,和书上说的不同,领教
作者: bleachznc    时间: 2011-3-23 21:02
一语道破天机啊!谢啦
作者: Mr_D    时间: 2011-4-14 10:17
xs128 AD数据左右对齐方式的控制位是ATD0CTL3的最高位MJD,而楼主所说的ATD0CTL5的最高位则是DG128的!我为这个问题走了不少弯路啊!网上的资料将xs128和DG128混淆了!误人!误人!
作者: QIULANZHU    时间: 2011-4-15 12:34
回复 1# LYL0707


    为什么输入2.5v左右的时候就输出全是高电平了?我接的是5v参考电压,按理应该是10000000才对呀。
作者: wscjun    时间: 2011-9-4 01:30
谢谢
作者: qaabq    时间: 2011-9-4 14:30
低八位
作者: quanwenbin    时间: 2012-2-29 20:52
强势顶起
作者: 安安安然。    时间: 2013-11-6 00:11
非常感谢!!!  搞了几个小时了  老是没搞定  




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2