在 PIC 中使用多个外部中断

电器工程 微控制器 图片 编程 微芯片 中断
2022-01-15 14:19:27

我已经将PIC16F877数据表)用于多个项目。对于单个外部引脚变化中断,可以使用PORTB0中断。但现在我需要在单个电路中支持 8 个独立的外部引脚更改中断。

在数据表中它说有 15 个中断PIC16F877,但我猜这些被计算在内,包括定时器溢出中断等......在这种情况下是无用的。

这就是数据表中关于INTCON寄存器的内容。

在此处输入图像描述

我可以使用 bit0 有 4 个独立的中断RBIF吗?它代表PB7:PB4. 如何识别哪个引脚发生了变化,是通过读取中断例程中的端口值吗?

即使我得到以上的肯定答案,我也需要 8 次中断?当然,我仍然可以使用INTE, 进行PORTB0更改。那么4 + 1 = 5,但是其他 3 呢?(但是所有 8 个中断事件都是同一类型的,这4 + 1 + 3 = 8件事看起来很丑,不是吗?)

除了监控 8 个引脚之外,微控制器没有其他繁重的任务。(谈到其他任务,它必须维护一组单独的计数器变量,并经常向 PC 串行传输大约 4 个字节)

欢迎任何建议。即使是关于将微控制器更改为更适合的微控制器(但是,呃..不要告诉我远离PICs)。

3个回答

这是解释一个想法的 C 伪代码。它使用异或来确定哪些引脚已更改,并将在一个 RBIE 中断中调用您的不同处理程序。根据应用程序的重要性,您可能需要检查 PIC 如何在执行中断时处理端口更改等情况,以确保您不会错过任何事件。

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

该部分只有 4 个引脚更改中断和其他一些您可以在选定边沿上设置的中断。一种策略是在外部检测 8 位值的变化,然后在不匹配时中断。这在硬件中变得混乱,但正是你想要的。

您没有说明的重要参数是您需要多快响应引脚更改,以及引脚更改保持有效的最短时间。根据答案,您可以根据固件中的常规中断进行轮询。16F877 可以以 5 MHz 的指令速率运行,检查更改只需要几条指令。假设您每 50 条指令设置一次中断。这会将处理器时间的很大一部分留给前台代码。中断速率为 100 kHz,周期为 10 µs。当然,前台代码仍然需要查看更改标志并对其进行处理,因此响应时间将超过 10 µs,但是您还没有说明检测到更改时需要做什么。如果这只需要在人类时间内做出反应,

您可以使用@Brian Drummond 提到的 8 输入门 NAND 在 INT 引脚上产生一个中断,并将您的中断源连接到 8 位并行输入/串行输出移位寄存器,如“74HC165N”,所以你需要在中断上升后从该移位寄存器读取数据,这将为您提供有关实际中断源的信息......这可能不是最快的方式,但易于扩展并且不会使用超过 5 个引脚,并且如果您添加地址控制系统(MUX,LATCH,...),那么您将只需要一个用于中断通知的松树,其他引脚可以在不同的时间重复用于不同的资源;)