找回密码
 立即注册
查看: 305|回复: 12

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 11:29:36 | 显示全部楼层 |阅读模式
#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_POWER  0x80  // 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;
}

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



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-2-15 18:18:06 | 显示全部楼层
截图202502151817472755.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2025-2-15 11:44:29 | 显示全部楼层
STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为ADC中断的全称是ADC完成中断,不启动采集何来完成?
另外,用定时器也可以,同样的,每次处理完ADC采集数据都需要再次启动ADC采集。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 11:48:25 | 显示全部楼层
晓*** 发表于 2025-2-15 11:44
STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为AD ...

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

点评

每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08; // 选择通道  详情 回复 发表于 2025-2-15 11:52
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2025-2-15 11:52:31 | 显示全部楼层
心在*** 发表于 2025-2-15 11:48
谢谢,需要每次都要置  EADC = 1吗

每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;  // 选择通道
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 11:54:40 | 显示全部楼层
这边设个断点,一起就没有等到AD中断查询
截图202502151153438986.jpg

点评

既然都进入ADC采集完成中断了,就没必要判断中断标志了,把这个判断条件去掉 if(ADC_CONTR & ADC_FLAG) 替换成 ADC_CONTR &= ~0x20; //清完成标志 然后处理ADC采集数据 最后退出中断前启动ADC转换 ADC_CONTR |= 0  详情 回复 发表于 2025-2-15 12:02
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 11:56:21 | 显示全部楼层
晓*** 发表于 2025-2-15 11:52
每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;  // 选择通道

有的,每次在定时器重时都启动了ADC,但就没有等到ADC中断
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 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软件或者芯片手册里面的相关例程,语句比较精简,充分理解一下每一句代码的含义。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 12:13:29 | 显示全部楼层
晓*** 发表于 2025-2-15 12:02
既然都进入ADC采集完成中断了,就没必要判断中断标志了,把这个判断条件去掉
if(ADC_CONTR & ADC_FLAG)
替 ...

其实都是照着ISP里中断查询来写的,不知为何就不时入中断
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 12:13:59 | 显示全部楼层
这是后改的,还是没有进入AD中断
截图202502151213381447.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-19 23:58:42

1

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-2-15 12:16:47 | 显示全部楼层
心在*** 发表于 2025-2-15 12:13
其实都是照着ISP里中断查询来写的,不知为何就不时入中断

是否要设定中断优先级?手册里没有找到相关资料,也许是手册把整个系列都写在一起了,找起来真心不容易

点评

不需要考虑中断优先级,你先把官方代码跑起来,你写的代码里面多余无用的太多,排除那些影响因素。  详情 回复 发表于 2025-2-15 14:10
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:47 , Processed in 0.145271 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表