心在飞翔 发表于 2025-2-15 11:29:36

8H1K08无法进入ADC中断查询? 想用定时器1时间触发ADC中断

#include <STC8H.H>
#include "USRE.H"
#include <math.h>
//------------------------------------------
#define TIMER_PERIOD_US 156.25// 定时器周期 (us)
#define TIMER_OVERFLOW_COUNT 65536 - (TIMER_PERIOD_US * 24 / 12)// 计算定时器溢出计数值
#define ADC_POWER0x80// ADC电源控制位
#define ADC_START   0x40// ADC启动位
#define ADC_FLAG   0x20// ADC完成标志位
#define ADC_SPEED_90 0x00// ADC转换速度设置

//-----------------------------------------
void      init_mcu(void)                                                                //初始化各IO口以及中断
{
                //      PxM1,PxM0 = 00               标准输出口
                //                                                = 01               推挽输出
                //                                                = 10               仅为输入
                //                                                = 11               开漏
                P_SW2 |=0X80;
                //--------------------------------------------------------------------
                        //_P0C();
                        //_P0();
                        _P1C();
                        _P1();
                        //_P2C();
                        //_P2();
                        _P3C();
                        _P3();
            //-----------------------------------------------------------------------------------------
                         // 初始化定时器1
                        TMOD |= 0x10;// 设置定时器1为模式1(16位定时器
                        reload_value = TIMER_OVERFLOW_COUNT;
                        TH1 = (unsigned char)(reload_value >> 8);// 加载定时器高字节
                        TL1 = (unsigned char)(reload_value);       // 加载定时器低字节
                        ET1 = 1;// 使能定时器1中断
                        //EA = 1;   // 使能全局中断
                        //PT1 = 1;      //高优先级中断
                        TR1 = 1;// 启动定时器1
                        // 使能ADC中断
                        // 初始化ADC
                      //ADC_CONTR = ADC_POWER | ADC_SPEED_90;// 启动ADC并设置转换速度
                        ADCTIM = 0x3F;               // 设置ADC 内部时序
                        //P_SW2 &= 0x7f;//脚位映射
                        ADCCFG = 0x2f;               // 设置ADC 时钟为系统时钟/2/16,ADC_RES左移6
                        ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道
                        EADC = 1;
                        EA = 1;

               //------------------------------------------------------------------------------------------
}
//------------------------------------------------------------------------------------------------------
void main(void)

{
       init_mcu();                                                                //初始化各IO口以及中断
            while(1)
                {
            }
}
//----------------------------------------------------------------------------------------
//========================================================================
void timer1_ISR (void) interrupt TIMER1_VECTOR
{
                reload_value = TIMER_OVERFLOW_COUNT;
          TH1 = (unsigned char)(reload_value >> 8);// 重新加载定时器高字节
    TL1 = (unsigned char)(reload_value);       // 重新加载定时器低字节
    // 启动ADC转换
         ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道
      
}
//=========================================================================
//AD中断入口5
void ADC_ISR(void) interrupt ADC_VECTOR
      {
                unsigned int adc_value;
                if(ADC_CONTR & ADC_FLAG)
                {
                        adc_value = (ADC_RES << 8) | ADC_RESL ;// 获取10位ADC结果
                        // 累加和
                        adc_sum += adc_value;
                        // 平方累加和
                        adc_square_sum += adc_value * adc_value;
                        sample_count++;
    if (sample_count >= SAMPLES_PER_CYCLE)
                        {
      sampling_complete = 1;// 标记一个周期采样完成
                        }
      }
    // 清除ADC中断标志
    ADC_CONTR &= ~ADC_FLAG;
}

//=========================================================================



神农鼎 发表于 2025-2-15 18:18:06


晓飛飛 发表于 2025-2-15 11:44:29

STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为ADC中断的全称是ADC完成中断,不启动采集何来完成?
另外,用定时器也可以,同样的,每次处理完ADC采集数据都需要再次启动ADC采集。

心在飞翔 发表于 2025-2-15 11:48:25

晓飛飛 发表于 2025-2-15 11:44
STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为AD ...

谢谢,需要每次都要置EADC = 1吗

晓飛飛 发表于 2025-2-15 11:52:31

心在飞翔 发表于 2025-2-15 11:48
谢谢,需要每次都要置EADC = 1吗

每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道

心在飞翔 发表于 2025-2-15 11:54:40

这边设个断点,一起就没有等到AD中断查询

心在飞翔 发表于 2025-2-15 11:56:21

晓飛飛 发表于 2025-2-15 11:52
每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道

有的,每次在定时器重时都启动了ADC,但就没有等到ADC中断

晓飛飛 发表于 2025-2-15 12:02:07

心在飞翔 发表于 2025-2-15 11:54
这边设个断点,一起就没有等到AD中断查询
既然都进入ADC采集完成中断了,就没必要判断中断标志了,把这个判断条件去掉
if(ADC_CONTR & ADC_FLAG)
替换成
ADC_CONTR &= ~0x20;               //清完成标志      
然后处理ADC采集数据
最后退出中断前启动ADC转换
ADC_CONTR |= 0x40;                        //继续AD转换

实在不行就去看看ISP软件或者芯片手册里面的相关例程,语句比较精简,充分理解一下每一句代码的含义。

心在飞翔 发表于 2025-2-15 12:13:29

晓飛飛 发表于 2025-2-15 12:02
既然都进入ADC采集完成中断了,就没必要判断中断标志了,把这个判断条件去掉
if(ADC_CONTR & ADC_FLAG)
替 ...

其实都是照着ISP里中断查询来写的,不知为何就不时入中断

心在飞翔 发表于 2025-2-15 12:13:59

这是后改的,还是没有进入AD中断

心在飞翔 发表于 2025-2-15 12:16:47

心在飞翔 发表于 2025-2-15 12:13
其实都是照着ISP里中断查询来写的,不知为何就不时入中断

是否要设定中断优先级?手册里没有找到相关资料,也许是手册把整个系列都写在一起了,找起来真心不容易
页: [1] 2
查看完整版本: 8H1K08无法进入ADC中断查询? 想用定时器1时间触发ADC中断