Передача данных по uart

Тема в разделе "Arduino & Shields", создана пользователем TiMoN816, 28 янв 2024.

  1. TiMoN816

    TiMoN816 Нерд

    Всем привет!:)
    Имеется 2шт. ардуино: Нано1, Нано2 и генератор импульсов.
    Нано1 передает данные в Нано2 по UART.
    И в этот же момент Нано1 постоянно вкл и выкл пин который подключен к Нано2 и она обрабатывает прерывания. Работает все четко.

    А вот теперь вопрос, если от Нано1 запитать генератор импульсов и уже его подключить к Нано2 и обрабатывать прерывания, то данные по UART будут искажаться. Вот почему так?

    Даже если генератор запитать от другого источника питания все равно ничего не меняется.
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Скорее всего потому что генератор импульсов работает асинхронно относительно обеих Ардуин. Он шлет сигнал когда ему вздумается. И на приемной стороне срабатывает обработчик прерывания блокирующий прием по Сериалу.
     
  3. b707

    b707 Гуру

    Как уже сказал Ариадна - они просто мешают друг другу. Прием сигнала от генератора и прием по Уарт оба работают через прерывания. Контроллер Нано одноядерный и не может выполнять больше одного действия одновременно.
    Если вы на генераторе поставите частоту побольше - у вас прием по УАРт не просто будет "искажатся", а вообще перестанет работать.
     
  4. parovoZZ

    parovoZZ Гуру

    Очевидно, что уарт софтовый. По идее, прерывания в момент обработки софтовым сериалом должны запрещаться, либо же прочие прерывания не должны надолго занимать процессор. Банально подняли флаг и вышли.
    Если уарт аппаратный, то это какой-то косяк в коде. Аппаратный уарт всегда примет пакет и по окончании приема поднимет флаг прерывания. Задача программиста как можно быстрее забрать данные из него, т. к. следующий пакет все затрет.
     
  5. a1000

    a1000 Гуру

    Немного не так. У него два прерывания. И кто его знает какой длинны он наваял обработчик внешнего прерывания. Скорее всего он теряет байт пока выполняется обработчик внешнего прерывания. Я бы попробовал разрешить прерывания на старте этого обработчика. Благо в ардуино такое возможно.
     
  6. parovoZZ

    parovoZZ Гуру

    Не знаю случая, когда в восьмибитках требовались бы вложенные прерывания. Все прекрасно поограммируется и без них, даже когда прерываний целая тьма.
     
  7. b707

    b707 Гуру

    чудес не бывает. Число процессорных циклов конечно. Если прерываний будет слишком много, на все просто не хватит времени.
     
  8. parovoZZ

    parovoZZ Гуру

    одновременно придти два прерывания не могут - это прям чудо. Поэтому обрабатываться они будут в порядке поступления. Поэтому взводите в прерывании флаг, а обрабатываете его в основной программе. Не успеваете - меняйте частоту тактирования, слезайте с дурины, меняйте кристалл (нужное подчеркнуть).
     
  9. a1000

    a1000 Гуру

    Даже для такого чуда всё предусмотрено. Есть приоритетность прерываний. В данном случае прерывание INT выше по приоритету чем USART, RX. При одновременном приходе первым отработает INT-овое прерывание.
    Вот и я о том. Что ТС запихнул в INT-овое прерывание мы не знаем. Как я подозреваю, пока отрабатывает вышеупомянутый обработчик, процессор не успевает достать из UDR принятый байт и он затирается новым. По этому я и предлагаю попробовать вложенное прерывание. Вдруг поможет.
    Если прерывания приходят не одновременно, они выполняются в порядке поступления. Обработаются все, но на сколько это будет эфективно и своевременно это уже второй вопрос.
     
  10. parovoZZ

    parovoZZ Гуру

    Согласно адресам. Адреса в даташите.
    Если прерывание по уровню, а не по фронту, то сам себе злобный Буратино.
     
  11. parovoZZ

    parovoZZ Гуру

    Надо интовое прерывание запретить, а флаг прерывания сбросить.
    Ещё раз говорю - нет ситуаций, когда требуются вложенные прерывания. Все обыгрывается.
     
  12. b707

    b707 Гуру

    эта очередь не бесконечна. Если, пока вы обрабатываете прерывание А, придет два прерывания В - одно из них будет потеряно.
     
  13. parovoZZ

    parovoZZ Гуру

    Там нет никакой очереди. Просто взводятся флаги. Если взведено несколько флагов, то выбирается тот, у которого адрес меньше. Если прерывание пришло, а флаг уже взведен, то ничего не произойдёт. Флаг можно снять самостоятельно (если нет обработчика прерывания или мы не хотим в него заходить) , либо же он снимется сам при входе в прерывание.