0

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

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

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

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

3 回答 3

4

ISR()不是一个函数,它是一个构造(宏),用于为 ISR 生成存根并将 ISR 注入向量表中。传递给宏的向量名称决定了它服务的中断。

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

ISR(TIM0_OVF_vect)
{
// Handle timer 0 overflow
   ...
};
于 2016-10-23T05:50:11.813 回答
0

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

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

于 2016-10-23T06:09:13.673 回答
0

作为已接受答案的补充:

是否可以同时使用引脚和定时器中断?

中断可以在硬件级别上完全相同的时间发生,并且相应的中断标志将被相应地设置。这些标志指示应执行相应中断的 ISR。但是实际的 ISR(或多或少显然)不是同时/并行执行的。首先执行哪个 ISR(如果有多个中断未决)取决于中断优先级,该优先级在数据手册的中断向量表中指定。

于 2016-10-24T08:43:24.893 回答