金牌会员
- 积分
- 1522
- 威望
- 307
- 贡献
- 1147
- 兑换币
- 0
- 注册时间
- 2011-1-10
- 在线时间
- 34 小时
|
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
复制代码 |
|