智能车制作
标题:
AD装换设置为8位数据右对齐,读结果寄存器到底该读低8位还是高8位?
[打印本页]
作者:
LYL0707
时间:
2011-2-14 14:26
标题:
AD装换设置为8位数据右对齐,读结果寄存器到底该读低8位还是高8位?
AD装换设置为
8
位数据
右对齐
,理论上右对齐的8位数据应该储存在结果寄存器的
低八位
。实际测时却是
低8位值是乱的
,高8位是准确的。下面是我的代码,请高手解答下
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
byte AD_Data=0;
//*
void Delay(int i) {
int j;
for(;i>0;i--)
for(j=500;j>0;j--)
;
}
//*/
/***---------------初始化程序---------------***/
void InitBusClk(void)
{
CLKSEL=0X80; //PLLSEL 1 : Bus Clock=PLLCLK/2
// 0 : Bus Clock=OSCCLK/2
PLLCTL_PLLON=1; //开启PLL
SYNR=0;
REFDV=0X03; //OSCCLK=16MHz
//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz
while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环
CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz
// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}
void InitAD(void){
ATD0CTL2 = 0XC3;
// 110 000 11 启动A/D, 快速清除标志位,无等待模式, 外部触发禁止(bit2=0)
// 中断开放(bit1=1,bit0=1)
// bit1 :ATD Sequence Complete Interrupt Enable
// bit0 :ATD Sequence Complete Interrupt Flag
ATD0CTL3 = 0X0C;
// 0 0001 1 00 转换序列为 1 、 FIFO模式启动,冻结模式下继续转换
ATD0CTL4 = 0XE1; // 1 11 00001 8位精度, 16AD采样时间
// 总线(1+1)*2 = 4 分频,AD 时钟 = 1M
ATD0CTL5 = 0XA7;
// 1010 0111 右对齐,无符号,连续转换,单通道, 起始通道 ATD7
ATD0DIEN = 0X00; // 数字输入 disabled
}
/***---------------主程序---------------***/
void main(void)
{
/* put your own code here */
DisableInterrupts; //关中断
InitBusClk();
InitAD();
DDRB=0XFF; //设B口为输出口
PORTB=0X00;
EnableInterrupts; //开中断
for(;;)
{
while(!ATD0STAT2L_CCF7);
PORTB=(byte)AD_Data; //B口显示转换结构
}
}
/***---------------中断服务程序---------------***/
#pragma CODE_SEG NON_BANKED
void interrupt 22 IntAD(void){ // AD转换的中断向量号为22
DisableInterrupts; //关中断
while(!ATD0STAT2L_CCF7);
AD_Data=ATD0DR0H; //读取AD 转换结果寄存器高八位,理论上该是AD_Data=ATD0DR0L,实际测试却没问题这是为什么?
EnableInterrupts; //开中断
}
#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