HC18M121B1单片机编程问题
C语言编程,在主程序下方写了两个中断程序,INT0和Term1,用IDE软件编译报错,说是在同一优先级,请问什么原因,怎么解决 HC18M121B1单片机只有一个中断向量地址(0008H),这意味着所有中断都共享同一个入口点,不能像某些单片机那样为每个中断单独编写中断服务函数,从数据手册第11页可以看到:复位向量是0000H
中断向量是0008H(只有一个!)
这意味着所有中断(INT0、INT1、Timer0、Timer1、Timer2、ADC等)都共用同一个中断入口地址。
你需要将两个中断服务程序合并为一个统一的中断服务函数,然后在其中判断具体是哪个中断源触发的。
为了更好地管理多个中断,建议采用以下结构
void interrupt ISR(void)
{
// 按优先级检查各个中断标志
if(INT1F) {
INT1F = 0;
INT1_Handler();
}
else if(T1IF) {
T1IF = 0;
Timer1_Handler();
}
else if(INT0F) {
INT0F = 0;
INT0_Handler();
}
// ... 其他中断
}
// 各个中断的具体处理函数
void INT1_Handler(void)
{
intpwmcount++;
// INT1具体处理代码
}
void Timer1_Handler(void)
{
count++;
// Timer1具体处理代码
} 感谢回复,问题已解决
再请教下,我在做PWM信号检测,方法是外部中断设置边沿触发,通过计数到一定数量,判断有PWM信号输入,但是检测的PWM信号周期为1us,占空比可能很大,也可能很小,致使IO口无法检测到边沿触发,这个单片机FCU为4MHz,想问下需要怎么解决,或者有没更好的PWM检测方法 试试定时器输入捕捉功能
根据数据手册看,Timer1和Timer2都有外部时钟输入功能
// 使用Timer1作为PWM周期测量
void PWM_Detection_Init(void)
{
// 配置Timer1为外部计数器模式
T1CON = 0b00011000;// T1CK=10, T1CKI上升沿计数
T1EN = 1; // 使能Timer1
// 配置Timer0作为时间基准
OPTION = 0b00000111; // 预分频给Timer0,1:256
T0IE = 1; // 使能Timer0中断
}
// Timer0中断用于定期读取Timer1计数值
void interrupt ISR(void)
{
if(T0IF)
{
T0IF = 0;
static unsigned int last_count = 0;
unsigned int current_count = T1;
// 计算频率 = (current_count - last_count) / 定时时间
unsigned int pulse_count = current_count - last_count;
last_count = current_count;
// 根据脉冲计数计算PWM频率
if(pulse_count > 0) {
// 检测到有效PWM信号
}
}
} 是否可以用T0做外部计数器模式,看数据手册,这个计数器不需要EN吗 HC18M121B1 的 Timer0 可以用作外部计数器,并且它不需要一个独立的“ENABLE”位。通过将 OPTION寄存器的 T0CS 位设置为 1(选择外部 T0CKI 引脚作为时钟源),就自动启动并“使能”了计数器功能。 已使用T0做好了PWM边沿计数,我现在要检测上图周期间断的PWM波形,请教如何编程将这种波形识别出来
请教大佬分享该单片机C代码
页:
[1]