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;
}
//=========================================================================
STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为ADC中断的全称是ADC完成中断,不启动采集何来完成?
另外,用定时器也可以,同样的,每次处理完ADC采集数据都需要再次启动ADC采集。 晓飛飛 发表于 2025-2-15 11:44
STC8H1K08可以进入ADC中断查询
处理完采集数据后,需要再次启动ADC采集,不然下次就无法进入中断了。因为AD ...
谢谢,需要每次都要置EADC = 1吗 心在飞翔 发表于 2025-2-15 11:48
谢谢,需要每次都要置EADC = 1吗
每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道 这边设个断点,一起就没有等到AD中断查询 晓飛飛 发表于 2025-2-15 11:52
每次都要ADC_CONTR = ADC_POWER | ADC_START | 0x08;// 选择通道
有的,每次在定时器重时都启动了ADC,但就没有等到ADC中断 心在飞翔 发表于 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:02
既然都进入ADC采集完成中断了,就没必要判断中断标志了,把这个判断条件去掉
if(ADC_CONTR & ADC_FLAG)
替 ...
其实都是照着ISP里中断查询来写的,不知为何就不时入中断 这是后改的,还是没有进入AD中断 心在飞翔 发表于 2025-2-15 12:13
其实都是照着ISP里中断查询来写的,不知为何就不时入中断
是否要设定中断优先级?手册里没有找到相关资料,也许是手册把整个系列都写在一起了,找起来真心不容易
页:
[1]
2