ATtiny85: как реагировать одновременно на пин и таймер прерываний
Недавно я играл с ATtiny85 как средство создания прототипа простой электроники в очень маленьком корпусе. У меня возникли проблемы с этим, так как язык, используемый для многих его функций, сильно отличается (и намного менее интуитивно понятен!), Чем тот, который можно найти в стандартном наброске Arduino. У меня возникли некоторые трудности с поиском подходящего справочника для аппаратных функций.
Прежде всего я хотел бы одновременно прослушивать смену булавки и таймер. Изменение состояния на выводе сбрасывает таймер, но в то же время код должен реагировать на сам таймер, если он заканчивается до изменения состояния вывода.
Теперь из уроков, которые мне удалось обнаружить, кажется, что и смена выводов, и прерывания по таймеру направляются через одну и ту же функцию - ISR(). Что я хотел бы знать, это:
- Возможно ли одновременное включение контакта и прерывания по таймеру?
- Предполагая, что они оба вызывают одну и ту же функцию, как вы их отличаете?
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.