STC8H,我设置ADC之后,发现原来的定时器计时变大了
我开启了ADC中断后,发现定时器计时变大了,比之前快了1.4倍,用的是芯片内部的晶振,我查回ADC和定时器初始化的代码,也没有什么能够影响晶振频率的使用了定时器的手动重载方式吗? 你是怎么用定时器的,中断还是查询,我想可能是ADC中断程序影响了定时器值 晓飛飛 发表于 2024-6-25 13:39
使用了定时器的手动重载方式吗?
对的,我关闭了ADC相关的函数后,定时正常 xxxevery 发表于 2024-6-25 14:17
你是怎么用定时器的,中断还是查询,我想可能是ADC中断程序影响了定时器值 ...
我定时器中断优先级比ADC中断优先级高,应该不会 我猜测有可能是ADC配置时,要配置系统分频,有可能是那一步影响,正在查手册第六章内容 link123 发表于 2024-6-25 14:43
对的,我关闭了ADC相关的函数后,定时正常
建议使用定时器自动重装方式,这样其它中断就不太会影响定时器的周期了,另外定时器中断和ADC中断中的代码不要占用太长的周期才能互不影响。 你这个什么代码都没有提供,,,坛友们也就只能说说方法论的东西了。。有点感觉像是你的中断优先级没有配置正确 会不会是中断挂中断定时器中断被影响了。 _奶咖君_ 发表于 2024-6-25 15:49
你这个什么代码都没有提供,,,坛友们也就只能说说方法论的东西了。。有点感觉像是你的中断优先级没有配置 ...
void Timer0Init(void) //50毫秒@12.000MHz
{
AUXR &=0x7F;//定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时器初始值
TH0 = 0x3C; //设置定时器初始值
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0=1;
}
void timer0_ISR(void)interrupt 1
{
timerCnt++;
if(timerCnt >= 20)//20次50ms中断,即1S时间到
{
timerCnt = 0;
sec++;
sign++;
ADC_CONTR |= 0x40; //继续AD转换
}
TL0 = 0xB0; //设置定时器初始值
TH0 = 0x3C; //设置定时器初始值
}
void ADC_Init(void)
{
P1M0=0x00; //设置P10为高阻输入
P1M1=0x01;
ADCTIM = 0x3F; //设置ADC内部时序
ADCCFG = 0x2F; //设置ADC时钟为系统时钟,数据右对齐
ADC_CONTR = 0x80; //使能ADC模块
EADC = 1; //使能ADC中断
ADC_CONTR |= 0x40; //启动AD转换
}
void ADC_ISR() interrupt 5
{
ADC_CONTR &= ~0x20; //清中断标志
adc_val = (ADC_RES << 8) + ADC_RESL; //计算adc的数值
}
不好意思,没上传代码
这是我的代码,都是按照默认的优先级
页:
[1]
2