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

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

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

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

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

3 ответа

Решение

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

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

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

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

Возможно ли одновременное включение контакта и прерывания по таймеру?

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

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

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

Другие вопросы по тегам