标题: keil的单片机AD转换程序调试 [打印本页]

作者: a825563619    时间: 2023-8-10 10:30
标题: keil的单片机AD转换程序调试
想问一下大家,在keil在线调试的过程中,怎么手动把ADC_CONTR寄存器里的ADC_FLAG位置1呢,或者说,怎么模拟一个ad值给它,运行时一直卡在标蓝处不动了

51hei截图_20230810102751.png (82.96 KB, 下载次数: 34)

51hei截图_20230810102751.png

作者: xuyaqi    时间: 2023-8-10 14:56
实际器件会自动返回1,人为返回1调试没有意义。
作者: yzwzfyz    时间: 2023-8-10 16:10
将本句暂时改成 while(1或0)
调试完成后改回。
作者: cnfloatleaf    时间: 2023-8-10 16:28
你应该查查是不是单片机初始化不对?造成一直在等待转换结束,否则ADC不会出现这个问题
作者: wulin    时间: 2023-8-10 17:20
直接注释掉 while(!(ADC_CONTR & ADC_FLAG));,调试完后改回来。
作者: lkc8210    时间: 2023-8-10 17:42
本帖最后由 lkc8210 于 2023-8-10 17:53 编辑

1.在while行打断点
2.在Memory1窗口输入D:0xBC(ADC_CONTR的地址)
3.按运行,会停在while行
4.在0xBC位置的值加0x10
如现在看到89(即0x89) 0x89+0x10 = 0x99



5.在0xBC位置输入99
6.再按运行就会跳出while




作者: a825563619    时间: 2023-8-10 18:42
是不是代码有问题呢,清除标志位是不是不该这么写呢
作者: sttt300    时间: 2023-8-10 19:21
while语句后面没有加“;”,这样就会把下一句当成是while的循环体,刚好下一句是清零,就永远在while这里循环了
作者: sttt300    时间: 2023-8-10 19:30
举个例子:
a=2;
while(a--);
a=1;
a=2;
执行结果:a=2
假如少了个分号
a=2;
while(a--)
a=1;
a=2;
程序就执行不下去了,一直while循环
这样可以理解吧
作者: a825563619    时间: 2023-8-11 09:31
sttt300 发表于 2023-8-10 19:21
while语句后面没有加“;”,这样就会把下一句当成是while的循环体,刚好下一句是清零,就永远在while这里 ...

对的,是我疏忽了,之前试了别的跳出方式忘了加;
作者: a825563619    时间: 2023-8-11 09:37
lkc8210 发表于 2023-8-10 17:42
1.在while行打断点
2.在Memory1窗口输入D:0xBC(ADC_CONTR的地址)
3.按运行,会停在while行

原来如此,强啊,话说如果在线仿真可以采到ad值吗,还是说一定要实物呢
作者: a825563619    时间: 2023-8-11 09:38
xuyaqi 发表于 2023-8-10 14:56
实际器件会自动返回1,人为返回1调试没有意义。

只能实际器件吗,在线的可以吗
作者: liucan2020    时间: 2023-8-11 10:20
while(!(ADC_CONTR & ADC_FLAG));   这个分号一定需要

作者: xuyaqi    时间: 2023-8-11 10:29
a825563619 发表于 2023-8-11 09:38
只能实际器件吗,在线的可以吗

调试AD转换只能实际器件才有意义。
作者: sttt300    时间: 2023-8-11 11:16
a825563619 发表于 2023-8-11 09:38
只能实际器件吗,在线的可以吗

只是学习的话,仿真没问题的,学得差不多再搞实际器件
proteus 8.9是支持STC15器件的,其他仿真软件我就不清楚了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1