标题: [讨论]请教一个关于MC9S12DG128的AD采样的问题 [打印本页]
作者: BHLT123 时间: 2007-10-31 16:13 标题: [讨论]请教一个关于MC9S12DG128的AD采样的问题
数据书上说,一旦对ATDCTL5赋值以后,ATD模块将重新开始采样,采样结束后,ATD0STAT0_SCF标志位置1。
我的程序是这样的:
main()
{
……
ADInit();//AD初始化
……
while(1) //死循环
{
程序1;
程序2;
……
ATD0CTL5 = 0X90;
while(ATD0STAT0_SCF == 0)
{
asm nop; //*
}
//存储采样数据
Data[i++] = ATD0DR0;
…………
程序n;
}//end of while(1)
}
现在在用P&E仿真器调试时候发现,先让程序全速运行,然后在任意时候让程序停止一段时间(大概也就几秒钟吧),再次全速运行,就会出现程序一直死在 * 位置,也就是这时候ATD0STAT0_SCF一直是0。不明白为什么会这样,因为程序再次运行以后肯定要先执行ATD0CTL5 = 0x90;这句话,重新启动AD采样并且采样完成后,ATD0STAT0_SCF不是会自动置1吗?还是P&E仿真器问题?
作者: strongchen 时间: 2007-11-1 10:05
你有没有将ATD的时钟选择在500K~2M的范围之内?
作者: BHLT123 时间: 2007-11-1 14:10
void AdInit(void)
{
ATD0CTL2_ADPU = 1 ;//ATD0启动
delay_100us();
ATD0CTL3 = 0x40 ;//ATD0: 8个采样通道
ATD0CTL4 = 0X61 ;//SRES8=0 : 10位转换模式
//SMP1=SMP0= 1 : 16个采样时钟周期
//PRS[4:1] = 00001 : ATD0CLOCK = 2MHz
}
作者: BHLT123 时间: 2007-11-1 14:14
我的系统时钟是 10MHz,ATD时钟设置成 2M,属于临界状态吧,这样会使 ATD 不稳定吗?
作者: BHLT123 时间: 2007-11-1 14:21
void AdInit(void)
{
ATD0CTL2_ADPU = 1 ; //ATD0启动
Delay_100us(); //延时100us
ATD0CTL3 = 0x40 ; //ATD0: 8个采样通道
ATD0CTL4 = 0x62 ; //SRES8=0 : 10位转换模式 //SMP1=SMP0= 1 : 16个采样时钟周期
//PRS[4:1] = 00001 : ATD0CLOCK = 2MHz
ATD0DIEN = 0x00; //禁止数字信号输入到ATD0中
ATD0CTL2_AFFC = 1; //设置当访问AD结果寄存器时,自动清除CCF标志位(AD完成标志位)
}
对不起,刚才的AD初始化程序发错了,应该是这个~
作者: strongchen 时间: 2007-11-2 11:12
你所说的系统时钟是总线时钟吗?总线时钟是多少?
作者: BHLT123 时间: 2007-11-2 14:53
是总线时钟,我用4Mhz晶振,然后将频率提升到20M,总线时钟 = 20 / 2 = 10MHz
用示波器测过,总线时钟是10MHz没错~
作者: freewolf008 时间: 2007-11-7 23:06
类似的问题,AD暂停后没法再次开始,ATD0STAT0_SCF始终为零
我采用的是中断的方式,开始是把ATD0CTL2_ASCIE位清零来暂停AD中断,后来换用关ADPU
效果一样,就是没法再次开始AD,调试后发现ATD0STAT0_SCF有问题,调了一下午,眼都花了……
我的程序有输出,现象就是只进了一次中断,中断后来绝对开了……
AD频率和楼主一样是2Mhz的,这个超了好像AD也能工作啊
PS:再请教版主,为什么单步执行的结果和直接运行的结果误差很大?
CODEWARRIOR的单步调试是模拟的还是在硬件基础上的?
我是在烧录后在debuger上调试的
先谢谢大家了
[此贴子已经被作者于2007-11-7 23:06:24编辑过]
作者: strongchen 时间: 2007-11-8 10:14
把整个project打包贴出来看看吧。
作者: freewolf008 时间: 2007-11-8 12:51
原来打算用
#define ATD_pause() ATD0CTL2_ASCIE = 0x00;
#define ATD_convert() ATD0CTL2_ASCIE = 0x01;
来控制AD的中断的开关,后来调试把这些语句注释掉了,让AD中断一直开着
程序改的有点乱了……
先谢谢版主了http://bbs.chinaecnet.com/uploadImages/camera_captureV_12.rar
作者: strongchen 时间: 2007-11-9 16:14
我看到你的project里只选了“Full Chip Simulation”,并没有选择硬件连接。你是如何将程序写入芯片的呢?
作者: strongchen 时间: 2007-11-9 16:23
另外,在软件仿真的时候,由于没有IRQ发生,pixels_width会一直上升到超出RAM空间。这在实际情况下也应该防止发生。
作者: feng200808 时间: 2007-11-9 20:26
FRZ1, FRZ0位的配置影响背景调试时观察窗口中结果寄存器中的值,调试时可以配置不同的值来观测结果寄存器值的变化
FRZ1, FRZ0决定在debugger时,当程序运行到断点处AD是停止采样转换还是继续工作
FRZ1, FRZ0
0 0 AD继续进行采样转换工作
0 1 为保留设置
1 0 AD完成当前换后停止采样转换工作
1 1 AD立即停止工作不管当前AD转换是否完成
作者: freewolf008 时间: 2007-11-10 09:10
strongchen版主:你说的硬件连接指的是P&E BDM Multilink ?
我在连接的时候硬件确实没有出来,但在调试窗口命令行输入 set gdi,就可以连接上开发版
联机文档中有:The GDI Connection is still available through the "set gdi" command line command.
可能功能一样吧,呵呵
作者: freewolf008 时间: 2007-11-10 09:18
多谢strongchen和feng200808!
strongchen:烧程序是和学长们学的,他们都是只选Full Chip Simulation,程序也确实烧进去了。
调试我也搞不清怎么弄,不过我都是插上芯片,连好线,下载程序后直接调试,这样对吧?
feng200808:看了好多书上都对Freeze无视,原来是调试用的,呵呵
再次谢谢大家!
[此贴子已经被作者于2007-11-10 9:18:37编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |