ATtiny85:如何同时响应引脚和定时器中断

ATtiny85: how to respond simultaneously to pin and timer interrupts

我最近一直在使用 ATtiny85 作为一种在非常小的封装中制作一些简单电子产品原型的方法。我在这方面遇到了一些麻烦,因为它的许多功能所使用的语言与标准 Arduino 草图中的语言非常不同(而且不那么直观!)。我也很难为特定于硬件的功能找到合适的参考。

首先,我想做的是同时监听引脚变化和定时器。 pin 中的状态更改将重置计时器,但与此同时,如果计时器在 pin 状态更改之前结束,则代码需要响应计时器本身。

现在,从我设法发现的教程中,引脚更改和定时器中断似乎都通过相同的函数 - ISR() 汇集。我想知道的是:

  1. 是否可以同时进行引脚中断和定时器中断?
  2. 假设它们都调用同一个函数,你如何区分它们?

ISR() 不是一个函数,它是一个 construct (macro) that is used to generate the stub for an ISR 以及将 ISR 注入向量 table。传递给宏的向量名称决定了它服务于哪个中断。

ISR(INT0_vect)
{
// Handle external interrupt 0 (PB2)
   ...
};

ISR(TIM0_OVF_vect)
{
// Handle timer 0 overflow
   ...
};

根据数据表 ATtiny85 PCINT0TIMER1 COMPA/OVF/COMPB 没有相同的中断向量,因此您可以为它们中的每一个定义不同的 ISR 处理程序。

如果您对多个中断使用相同的处理程序,则可能无法区分它们,因为中断标志通常在 ISR 向量执行时由硬件清除。

作为已接受答案的补充:

Is it possible to have both a pin and a timer interrupt going at the same time?

中断可以在硬件级别完全同时发生,相应的中断标志将相应地设置。这些标志指示应执行相应中断的 ISR。但是实际的 ISR(或多或少明显)不是同时/并行执行的。首先执行哪个 ISR(如果有多个中断挂起)取决于中断优先级,中断优先级在数据 sheet.

的中断向量 table 中指定