苏紫方璇 发表于 2025-3-16 12:07:50

求助,8h比较器无法获取结果

想使用比较器做一个低压保护,先测试功能,结果出现了问题。
测试方法,使用的是`8h8k64u`芯片编号末尾是`HD`应该是使用新版的比较器。
接线方法`vcc--vref--P37`,预想中比较器+为`P37`,-为`内部1.19V`,结果应为恒等于1。然而实测结果是恒等0,调了好长时间代码,无果,特来求助各位大佬。


#include      "config.h"
#include      "STC8G_H_Delay.h"


int *BGV;

//关闭所有io
void      GPIO_config(void)
{
      P0M0 = 0x00; P0M1 = 0xff; P0IE = 0x00;
      P1M0 = 0x00; P1M1 = 0xff; P1IE = 0x00;
      P2M0 = 0x00; P2M1 = 0xff; P2IE = 0x00;
      P3M0 = 0x00; P3M1 = 0xff; P3IE = 0x00;
      P4M0 = 0x00; P4M1 = 0xff; P4IE = 0x00;
      P5M0 = 0x00; P5M1 = 0xff; P5IE = 0x00;
      P6M0 = 0x00; P6M1 = 0xff; P6IE = 0x00;
      P7M0 = 0x00; P7M1 = 0xff; P7IE = 0x00;
      //10开漏
    P1M0 = 0x01; P1M1 = 0xfc;
}

void sleep()
{
      _nop_();
      _nop_();
      PCON=0x02;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
}
//暂时不用ADC
int ADCfun()
{
      int i,res,vcc;
      //初始化ADC
      ADCTIM =0x3f;
      ADCCFG=0x2f;
      ADC_CONTR=0x8f;                //打开adc电源 15通道
      delay_ms(1);
      res=0;
      for(i=0;i<8;i++)
      {
                ADC_CONTR |=0x40;                //启动转换
                _nop_();
                _nop_();
                while(!(ADC_CONTR & 0x20));
                ADC_CONTR &=~0x20;
                res+=((ADC_RES<<8) | ADC_RESL);
      }
      res>>=3;
      vcc=(int)(4096L * *BGV/res);
      ADC_CONTR=0x0f;                //关闭adc电源
      return vcc;
}
void ADCtest()
{
      while(1)
      {
                ADCfun();
                sleep();
      }
}

void CMPinit()
{
      CMPEXCFG=0x04;
      //CMPEXCFG &= ~0x03;                //P37 +输入
      //CMPEXCFG |=0x04;                //1.19V为-输入
      CMPCR2=0x00;                        //
      CMPCR2&=~0x80;                        //正向输出
      CMPCR2&=~0x40;                        //0.1us滤波
      CMPCR2|=0x10;                        //比较器结果滤波输出
      CMPCR1=0;
      //CMPCR1|=0x30;                        //边沿中断
}
u8 CMPfun()
{
      u8 a=0;
      CMPCR1|=0x02;                        //启动比较器输出
      CMPCR1|=0x80;                        //启动比较器
      P11=CMPCR1 &0x01;
      a=CMPCR1 &0x01;
      CMPCR1&=~0x02;                        //关闭比较器输出
      CMPCR1&=~0x80;                        //关闭比较器
      return a;
}
void CMPtest()
{
      CMPinit();
      while(1)
      {
                P10=0;
                if(CMPfun()==0)
                {
                        P10=1;
                        sleep();
                }
      }
}

/**********************************************/
void main(void)
{
    EAXSFR();                /* 扩展寄存器访问使能 */
    GPIO_config();
    EA = 1;
      BGV=(int idata *)0xef;
      WKTCL=0xff;
      WKTCH=0x87;//1s

      CMPtest();
    while (1)
    {
    }
}



国芯人工智能 发表于 2025-3-16 12:08:00

针对您提到的8H比较器无法获取预期结果的问题,建议从以下几个方面进行排查和调试:<br><br>1. 硬件连接检查:<br>   - 确保VCC、VREF和P37引脚连接正确,且电压稳定。P37作为比较器的正输入端,其电压应与VREF(内部参考电压1.19V)进行比较。<br>   - 检查电源电压是否在芯片工作范围内,确保VCC电压足够高,以避免因电源不足导致比较器无法正常工作。<br><br>2. 比较器配置:<br>   - 确认比较器的配置是否正确。请检查相关寄存器(如CMPCR1、CMPCR2)的设置,确保比较器已启用,且正负输入端配置无误。<br>   - 如果使用内部参考电压作为负输入端,确保内部参考电压已正确启用并稳定。<br><br>3. 代码调试:<br>   - 在代码中增加调试信息,输出比较器状态寄存器的值,确认比较器是否正常工作。<br>   - 检查BGV指针的初始化是否正确,确保其指向的地址有效。<br><br>4. 芯片版本兼容性:<br>   - 确认使用的STC8H8K64U芯片是否为最新版本,不同版本的芯片可能在寄存器配置或功能上存在差异。<br><br>5. 示例代码参考:<br>   - 参考官方提供的比较器示例代码,确保配置和初始化流程正确。<br><br>通过以上步骤,应能有效定位并解决比较器无法获取预期结果的问题。如果问题仍未解决,建议进一步查阅芯片手册或联系技术支持。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]

梁工 发表于 2025-3-16 13:16:30

请直接下载HEX文件测试。





ercircle 发表于 2025-3-16 13:40:29

1、获取CMPCR1前加延时
2、注意sleep里有个PCON=0x02;进入主时钟停振/省电模式

苏紫方璇 发表于 2025-3-16 13:46:17

梁工 发表于 2025-3-16 13:16
请直接下载HEX文件测试。

直接下载hex文件,比较器可以正常工作

苏紫方璇 发表于 2025-3-16 13:50:49

ercircle 发表于 2025-3-16 13:40
1、获取CMPCR1前加延时
2、注意sleep里有个PCON=0x02;进入主时钟停振/省电模式

我加个延时试试,停振模式是故意加的。目标是检测电压过低进入停振模式,1秒检测一次

ercircle 发表于 2025-3-16 13:55:17

苏紫方璇 发表于 2025-3-16 13:50
我加个延时试试,停振模式是故意加的。目标是检测电压过低进入停振模式,1秒检测一次 ...

嗯我在擎天柱上测试你贴的代码,加你那个sleep nop可能不太够,加个delay_ms(1)才有反应。

苏紫方璇 发表于 2025-3-16 14:03:44

ercircle 发表于 2025-3-16 13:55
嗯我在擎天柱上测试你贴的代码,加你那个sleep nop可能不太够,加个delay_ms(1)才有反应。 ...

感谢,获取CMPCR1前加延时可以了
页: [1]
查看完整版本: 求助,8h比较器无法获取结果