智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8938|回复: 13
打印 上一主题 下一主题

AD装换设置为8位数据右对齐,读结果寄存器到底该读低8位还是高8位?

  [复制链接]

8

主题

68

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
QQ
威望
307
贡献
1147
兑换币
0
注册时间
2011-1-10
在线时间
34 小时
跳转到指定楼层
1#
发表于 2011-2-14 14:26:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
复制代码

8

主题

68

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
QQ
威望
307
贡献
1147
兑换币
0
注册时间
2011-1-10
在线时间
34 小时
2#
 楼主| 发表于 2011-2-14 14:53:39 | 只看该作者
这个问题本人已解决。查找XS128的头文件发现:AD数据左右对齐方式的控制位DJM在ATD0CTL3的最高位,而ATD0CTL5的最高位是任意位,这与大部分的参考资料上写的有所不同。本人程序中ATD0CTL3=0x0c设置的是左对齐不是之前认为的右对齐,因此数据存在了结果寄存器的高八位。
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
威望
261
贡献
63
兑换币
0
注册时间
2010-12-7
在线时间
19 小时
3#
发表于 2011-2-24 20:55:39 | 只看该作者
真是重要信息啊。。。我整了大晚上~得高人指点一下就出来了,哈哈。。。太谢谢啦
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
QQ
威望
298
贡献
32
兑换币
2
注册时间
2011-1-26
在线时间
48 小时
4#
发表于 2011-2-27 21:17:42 | 只看该作者
楼主,写多一点,太有用了,谢谢啦
回复 支持 反对

使用道具 举报

3

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
QQ
威望
259
贡献
34
兑换币
0
注册时间
2010-12-23
在线时间
46 小时
5#
发表于 2011-2-28 11:10:02 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
威望
285
贡献
82
兑换币
0
注册时间
2010-11-12
在线时间
6 小时
6#
发表于 2011-2-28 22:18:55 | 只看该作者
哦   恍然大悟
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
威望
235
贡献
51
兑换币
28
注册时间
2009-7-4
在线时间
9 小时
7#
发表于 2011-3-11 20:02:47 | 只看该作者
顶了,重要信息,和书上说的不同,领教
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
威望
197
贡献
21
兑换币
0
注册时间
2011-2-22
在线时间
7 小时
8#
发表于 2011-3-23 21:02:27 | 只看该作者
一语道破天机啊!谢啦
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
QQ
威望
234
贡献
41
兑换币
0
注册时间
2011-4-13
在线时间
2 小时
9#
发表于 2011-4-14 10:17:53 | 只看该作者
xs128 AD数据左右对齐方式的控制位是ATD0CTL3的最高位MJD,而楼主所说的ATD0CTL5的最高位则是DG128的!我为这个问题走了不少弯路啊!网上的资料将xs128和DG128混淆了!误人!误人!
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

高级会员

珍珠

Rank: 4

积分
562
威望
257
贡献
287
兑换币
6
注册时间
2011-1-17
在线时间
9 小时
10#
发表于 2011-4-15 12:34:08 | 只看该作者
回复 1# LYL0707


    为什么输入2.5v左右的时候就输出全是高电平了?我接的是5v参考电压,按理应该是10000000才对呀。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 11:15 , Processed in 0.054122 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表