2014-11-12 9 views
1

Я работаю над Arduinos, и я хотел бы использовать прерывания для использования поворотного энкодера . Но я хотел бы уменьшить код прерывания до минимума.Несколько триггеров при одном прерывании на Arduino

Могу ли я использовать несколько триггеров для одного прерывания?

Я хотел бы replcace мой фактический код:

attachInterrupt(0, ChangeA, CHANGE); 

к чему-то вроде

attachInterrupt(0, FailingA, FAILING); 
attachInterrupt(0, RisingA, RISING); 

Возможно ли это?

+0

Является ли используемый вами поворотным энкодером (т. Е. Это периферийное устройство ввода, например ручка) или двигателем? И следовательно ... Какова максимальная частота, которую вы получаете на контактах? И ... вот последний и самый важный вопрос: действительно ли вам нужен этот код для прерывания? Это так быстро и важно, что вам нужно прерывание, чтобы справиться с этим? Если частота меньше, скажем, 100 Гц, возможно, лучше ее обрабатывать в программном обеспечении (опрос) ... – frarugi87

+1

Хммм ... Извините, но у меня есть 2 поворотных энкодера ... с 1024 тиками каждый , Это означает, что с двумя вращениями в секунду (40 см/с) у меня есть 8000 прерываний ... 8 кГц слишком много, чтобы справиться с этим в программном обеспечении! (Это не единственное, что я должен сделать на этом Arduino). –

ответ

1

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

Одна вещь, которую вы можете сделать, это использовать процедуру обслуживания прерывания с CHANGE и проверить значение штифтом в начале ISR делать FallingA() или RisingA().

Существует потенциальная проблема. Штырь может быть изменен снова, прежде чем вы его проверите, поэтому прерывание, вызвавшее прерывание, могло падать, скажем, и ваш тест определяет, что он растет. Один из способов защиты от двух быстрых прерываний - проверить, установлен ли флаг. Он должен быть очищен, если в начале прерывания, и если он установлен, произойдёт изменение. Существует нет практического способа защиты от трех быстрых изменений.

Если вы действительно хотите использовать два отдельных ISR, есть ли у вас дополнительный контакт? Если это так, вы можете просто соединить контакты вместе и запустить ISA на одном и RISING ISR на другом.

+1

Вот что я подумал. Черт возьми! У меня есть 2 вращающихся энкодера, а 2 прерывистых штыря используются I2C. Спасибо, в любом случае! (: –