陈北 发表于 7 天前

ADC转换时,debug一直循环在等待完成标志位,求大佬帮助

#include <STC8G.H>
#include <intrins.h>
#include "adc.h"

void AdcSetRate(void)                //100KSPS@12.000MHz
{
        ADCCFG &= ~0x0f;
        ADCCFG |= 0x01;                        //SPEED(1)
        ADCTIM = 0x2e;                        //CSSETUP(0), CSHOLD(1), SMPDUTY(14)
}

void ADC_Init(void)
{
        P3M0 &= ~0x08; P3M1 |= 0x08;        //配置P3.3为高阻输入
        AdcSetRate();        //初始化ADC速度
        ADCCFG |= 0x20;        //对齐模式
        ADCCFG |= 0x80;        //打开ADC电源
}

uint ADC_Read(void)
{
        uint adcvalue = 0;
        ADC_CONTR &= 0xf0;        //清除低四位
        ADC_CONTR |= 0x03;        //配置ADC3,即P3.3
        ADC_CONTR |= 0x40;        //启动ADC转换
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));        //等待标志位
        ADC_CONTR &= ~0x20;        //清除标准位
        adcvalue = ((uint)ADC_RES << 8) | ADC_RESL; //读取ADC的值
        return adcvalue;
}
芯片为stc8g1k08a,debug时一直卡在while(!(ADC_CONTR & 0x20));

国芯人工智能 发表于 7 天前

您在使用ADC进行数据采集时,遇到“debug一直循环在等待完成标志位”的问题,可能是由于以下几个原因导致的:

1. ADC配置不正确:ADC的初始化参数可能未设置正确,导致无法正常启动转换或无法产生完成标志位。
2. ADC电源未开启:虽然代码中设置了ADCCFG |= 0x80;,但需确认该位是否真正生效,确保ADC模块已供电。
3. ADC转换通道未正确选择:检查ADCCONTR |= 0x03;是否对应正确的通道(如P33)。
4. ADC转换模式设置错误:例如,是否启用了单次转换模式或连续转换模式,影响标志位的触发。
5. 中断或标志位处理不当:若存在中断配置,可能导致标志位被误清除或未被正确读取。
6. 硬件连接问题:ADC输入引脚未接信号或接地不良,导致无法正常采样。

建议您逐步排查以下几点:
检查ADC模块的电源和时钟是否已正确使能。
使用示波器或逻辑分析仪观察ADC的控制信号和转换结果寄存器。
确认ADC转换完成后标志位是否确实被置位。
在等待标志位之前添加延时,确保ADC有足够时间完成转换。
若使用中断方式,检查中断服务程序是否正确处理了ADC完成事件。

通过以上步骤,应能定位并解决ADC转换时等待完成标志位的问题。

[本文内容由国芯人工智能辅助生成,仅供参考]

zhp 发表于 6 天前

打开ADC电源语句不正确
ADC电源打开需要设置ADC_CONTR的BIT7,不是ADCCFG的BIT7

陈北 发表于 6 天前

zhp 发表于 2025-8-18 09:23
打开ADC电源语句不正确
ADC电源打开需要设置ADC_CONTR的BIT7,不是ADCCFG的BIT7

是的,感谢指正

梁工 发表于 6 天前

没有打开ADC电源:
ADC_CONTR |= 0x80;   //打开ADC电源
打开电源后,至少要过1ms以上才做ADC转换,模拟电路从打开电源到稳定工作需要点时间的。
页: [1]
查看完整版本: ADC转换时,debug一直循环在等待完成标志位,求大佬帮助