我最近一直在玩ATtiny85作为在一个非常小的包装中对一些简单电子设备进行原型设计的方法。由于用于其许多功能的语言与标准Arduino草图中的语言非常不同(并且不那么直观!),因此我遇到了麻烦。我也很难找到适合硬件特定功能的参考。
首先,我想要做的是同时监听引脚更改和定时器。引脚状态的改变将复位定时器,但同时代码需要响应定时器本身,如果它在引脚状态改变之前结束。
现在,从我已经设法发现的教程中,似乎引脚更改和定时器中断都通过相同的功能 - ISR()汇集。我想知道的是:
答案 0 :(得分:4)
ISR()
不是函数,它是construct (macro) that is used to generate the stub for an ISR以及将ISR注入向量表。传递给宏的向量名称决定了它所服务的中断。
ISR(INT0_vect)
{
// Handle external interrupt 0 (PB2)
...
};
ISR(TIM0_OVF_vect)
{
// Handle timer 0 overflow
...
};
答案 1 :(得分:0)
根据数据表ATtiny85
,PCINT0
和TIMER1 COMPA/OVF/COMPB
没有相同的中断向量,因此您可以为每一个定义不同的ISR处理程序。
如果您使用相同的处理程序进行更多中断,则可能无法区分它们,因为在ISR向量执行时,硬件通常会清除中断标志。
答案 2 :(得分:0)
作为接受答案的补充:
是否可以同时进行引脚和定时器中断?
中断可以在硬件级别上完全同时发生,并且相应的中断标志也会相应地设置。标志表示应执行相应中断的ISR。但实际的ISR(或多或少显然)不是同时/并行执行的。首先执行哪个ISR(如果多个中断挂起)取决于中断优先级,该优先级在数据表的中断向量表中指定。