Всем привет! Имеется 2шт. ардуино: Нано1, Нано2 и генератор импульсов. Нано1 передает данные в Нано2 по UART. И в этот же момент Нано1 постоянно вкл и выкл пин который подключен к Нано2 и она обрабатывает прерывания. Работает все четко. А вот теперь вопрос, если от Нано1 запитать генератор импульсов и уже его подключить к Нано2 и обрабатывать прерывания, то данные по UART будут искажаться. Вот почему так? Даже если генератор запитать от другого источника питания все равно ничего не меняется.
Скорее всего потому что генератор импульсов работает асинхронно относительно обеих Ардуин. Он шлет сигнал когда ему вздумается. И на приемной стороне срабатывает обработчик прерывания блокирующий прием по Сериалу.
Как уже сказал Ариадна - они просто мешают друг другу. Прием сигнала от генератора и прием по Уарт оба работают через прерывания. Контроллер Нано одноядерный и не может выполнять больше одного действия одновременно. Если вы на генераторе поставите частоту побольше - у вас прием по УАРт не просто будет "искажатся", а вообще перестанет работать.
Очевидно, что уарт софтовый. По идее, прерывания в момент обработки софтовым сериалом должны запрещаться, либо же прочие прерывания не должны надолго занимать процессор. Банально подняли флаг и вышли. Если уарт аппаратный, то это какой-то косяк в коде. Аппаратный уарт всегда примет пакет и по окончании приема поднимет флаг прерывания. Задача программиста как можно быстрее забрать данные из него, т. к. следующий пакет все затрет.
Немного не так. У него два прерывания. И кто его знает какой длинны он наваял обработчик внешнего прерывания. Скорее всего он теряет байт пока выполняется обработчик внешнего прерывания. Я бы попробовал разрешить прерывания на старте этого обработчика. Благо в ардуино такое возможно.
Не знаю случая, когда в восьмибитках требовались бы вложенные прерывания. Все прекрасно поограммируется и без них, даже когда прерываний целая тьма.
чудес не бывает. Число процессорных циклов конечно. Если прерываний будет слишком много, на все просто не хватит времени.
одновременно придти два прерывания не могут - это прям чудо. Поэтому обрабатываться они будут в порядке поступления. Поэтому взводите в прерывании флаг, а обрабатываете его в основной программе. Не успеваете - меняйте частоту тактирования, слезайте с дурины, меняйте кристалл (нужное подчеркнуть).
Даже для такого чуда всё предусмотрено. Есть приоритетность прерываний. В данном случае прерывание INT выше по приоритету чем USART, RX. При одновременном приходе первым отработает INT-овое прерывание. Вот и я о том. Что ТС запихнул в INT-овое прерывание мы не знаем. Как я подозреваю, пока отрабатывает вышеупомянутый обработчик, процессор не успевает достать из UDR принятый байт и он затирается новым. По этому я и предлагаю попробовать вложенное прерывание. Вдруг поможет. Если прерывания приходят не одновременно, они выполняются в порядке поступления. Обработаются все, но на сколько это будет эфективно и своевременно это уже второй вопрос.
Согласно адресам. Адреса в даташите. Если прерывание по уровню, а не по фронту, то сам себе злобный Буратино.
Надо интовое прерывание запретить, а флаг прерывания сбросить. Ещё раз говорю - нет ситуаций, когда требуются вложенные прерывания. Все обыгрывается.
эта очередь не бесконечна. Если, пока вы обрабатываете прерывание А, придет два прерывания В - одно из них будет потеряно.
Там нет никакой очереди. Просто взводятся флаги. Если взведено несколько флагов, то выбирается тот, у которого адрес меньше. Если прерывание пришло, а флаг уже взведен, то ничего не произойдёт. Флаг можно снять самостоятельно (если нет обработчика прерывания или мы не хотим в него заходить) , либо же он снимется сам при входе в прерывание.