Обсуждаем контроллеры компании Atmel.
Ответить

Arduino Сделать прерывание по FALLING и RISING на одном пине

Пн ноя 29, 2021 01:15:30

Здравствуйте!

Имеется Arduino UNO. Нужно сделать два аппаратных прерывания на пине D2. Один обработчик должен обрабатывать FALLING на этом пине, второй обработчик должен обрабатывать RISING на этом же пине.

Возможно ли такое сделать? Судя по документации, определить можно только одно прерывание на одном пине, если определить второе, оно отменит первое.

Может быть, есть способы как-то обойти эту проблему?

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 07:35:18

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

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 07:48:21

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

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 08:20:53

1en2 писал(а):поставленная задача не имеет логики, поэтому процессору это не объяснить......настроить заранее на высокий уровень, а первым придёт низкий и пропустишь....
поставленная задача имеет логику, так как какой-то уровень будет на пине, либо высокий либо низкий, одновременно два уровня не придут.

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 09:47:11

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

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

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 10:12:46

КОТИЩИ!!!
Хотя бы в исходный референс (хоть оффлайн, хоть онлайн) адурино - IDE заглянуть надо!
"...
Parameters

interrupt: the number of the interrupt (int)
pin: the pin number (Arduino Due, Zero only)
ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode:
defines when the interrupt should be triggered. Four contstants are predefined as valid values:
LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.
The Due board allows also:
HIGH to trigger the interrupt whenever the pin is high.
(Arduino Due, Zero only)
Returns

none
..."

:tea:

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 11:12:30

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


Я не написал, что время между фронтами "спада" и "подъема" где-то 500нс.

Arduino UNO в дефолте работает вроде как на 8МГц.

Вопрос в том, если настроить прерывание на CHANGE, хватит ли времени в прерывании еще и вызывать чтение значения с пина, чтобы понимать какое состояние - FALLING или RISING? Или хватит ли времени переконфигурировать прерывание внутри прерывания?

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 11:19:15

Вопрос в том, если настроить прерывание на CHANGE, хватит ли времени в прерывании еще и вызывать чтение значения с пина?

Самому не понятно, что 500ns при 8MHz тактовой - это всего 4 такта, а учитывая, что речь про ардуино и 40 тактов для элементарного действия может не хватить.

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 12:32:49

UNO по заводским настройкам в виде кварцевого резонатора 16 МГц.
https://store.arduino.cc/products/arduino-uno-rev3/
Это если не клон какой-нить.
Ознакомьтесь хош с матчастью для начала...
Или поиграйтесь с симулятором (https://www.sites.google.com/site/unoardusim/) ....
Второе - по всей видимости недопонимание как алгоритм построить под имеющуюся задачу.
Ведь нам то все равно какой перепад прерывание вызвал - а уж затем по факту поимки перепада (после выхода из прерывания) проводим анализ события.
Ежли счет импульсов имелся ввиду - на то уже другое действо применять надо.
8)

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 13:38:31


Вот там где написано передний и задний фронт можешь вызвать функции ,которые хотел (это и есть Falling и Rising) только надо ещё функцию инициализации вместо стандартной вызвать.

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 15:51:48

UNO по заводским настройкам в виде кварцевого резонатора 16 МГц.
https://store.arduino.cc/products/arduino-uno-rev3/
Это если не клон какой-нить.


Это фирменная Ардуина УНО, 10 лет назад купленная. Это не R3, но и не v.1. А что-то такое промежуточное. На официальном сайте информация только про R3, на других сайтах черт ногу сломит. Пока что я так и не смог понять что у меня за модель, и где для нее документацию искать.

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 19:03:37

Ардуино УНО, Ардуино НАНО, 10 лет назад, какой МК установлен?

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 19:22:23

ATMega328

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 19:28:15

Ну раз Атмега328, есть 3 варианта построения:
1 вариант, тогда когда не знаем что на входе, да не важно
2 вариант, определяем что есть на входе
3 вариант, когда не знаем что на входе, да не важно

Re: Arduino Сделать прерывание по FALLING и RISING на одном

Пн ноя 29, 2021 20:42:19

Если "фирменная" - то там должна быть еще одна АВРка(AtMega16U/8U) для мостаUSB-TTL у которой свой кварц.
У "клонов" в роли моста выступает СН340.
Но в любом случае те уны работают на "стандартной" частоте в 16МГц (если работать в рамках стандартных платформ ардуиноIDE).
(http://arduino.ru/Hardware/ArduinoBoardUno , http://doc.arduino.ua/ru/hardware/Uno)
8)
Касательно прерываний - там в принципе достаточно только контрольный флаг поставить, который затем в основном цикле приведет к переходу на обработчик события. Это же не под ассемблером условный возврат из прерывания с подстановкой адреса перехода через стек строить - в Си подобные фокусы с "вольным обращением" со стеком весьма непрактичны.
Опять же для измерения интервала другие алгоритмы используются.
В том числе "штатный референсовский" pulseIn() возвращающий длину сигнала в микросекундах (причем на любом цифровом входе).
:roll:
Ответить