ATtiny85: как реагировать одновременно на прерывания по выводу и таймеру

Недавно я экспериментировал с ATtiny85 как средством создания прототипа простой электроники в очень маленьком корпусе. У меня возникли проблемы с этим, поскольку язык, используемый для многих его функций, сильно отличается (и намного менее интуитивен!), чем тот, который можно найти в стандартном эскизе Arduino. У меня возникли трудности с поиском достойного справочника по аппаратным функциям.

В первую очередь, то, что я хотел бы сделать, это одновременно прослушивать смену пин-кода и таймер. Изменение состояния вывода приведет к сбросу таймера, но в то же время код должен реагировать на сам таймер, если он завершится до изменения состояния вывода.

Теперь, из учебных пособий, которые мне удалось найти, кажется, что и изменение контакта, и прерывания таймера направляются через одну и ту же функцию - ISR(). Что я хотел бы знать:

  1. Возможно ли одновременное прерывание пина и таймера?
  2. Предполагая, что они оба вызывают одну и ту же функцию, как их отличить друг от друга?

person Ash    schedule 23.10.2016    source источник


Ответы (3)


ISR() — это не функция, это конструкция (макрос), которая используется для создания заглушки для ISR, а также для внедрения ISR в таблицу векторов. Имя вектора, переданное макросу, определяет, какое прерывание он обслуживает.

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

ISR(TIM0_OVF_vect)
{
// Handle timer 0 overflow
   ...
};
person Ignacio Vazquez-Abrams    schedule 23.10.2016
comment
Ааа! Вы понимаете, что я имею в виду, говоря о невозможности найти нужную документацию? Ни в одном из учебников, которые я нашел, не упоминается этот факт. - person Ash; 23.10.2016

Согласно таблице данных ATtiny85 не имеет одного и того же вектора прерывания для PCINT0 и TIMER1 COMPA/OVF/COMPB, поэтому вы можете определить разные обработчики ISR для каждого из них.

Если вы используете один и тот же обработчик для большего количества прерываний, может быть невозможно различить их, поскольку флаги прерывания обычно сбрасываются аппаратно при выполнении вектора ISR.

person KIIV    schedule 23.10.2016

В дополнение к принятому ответу:

Возможно ли одновременное прерывание пина и таймера?

Прерывание может произойти точно в то же время на аппаратном уровне, и соответствующие флаги прерывания будут установлены соответствующим образом. Флаги указывают, что должна быть выполнена ISR для соответствующего прерывания. Но настоящие ISR (более или менее очевидно) не выполняются одновременно/параллельно. Какой ISR выполняется первым (в случае ожидания нескольких прерываний) зависит от приоритета прерывания, который указан в таблице векторов прерываний из таблицы данных.

person Rev    schedule 24.10.2016