Как организовать взаимную перезагрузку двух ардуин?

Тема в разделе "Arduino & Shields", создана пользователем UnSstrennen, 9 фев 2020.

  1. UnSstrennen

    UnSstrennen Нерд

    В устройстве планируется подключить две ардуины друг к другу так, чтобы они могли перезагружать друг друга, т.к. одна система запланирована как основная, другая - как резервная. На обеих ардуинах организована подтяжка резистором 10кОм к +5V. С каждой платы какой-нибудь цифровой пин подключен к ресету другой ардуины. Но возникает проблема: одна ардуина послала сигнал на другую, та перезагрузилась, в процессе перезагрузки на пинах возникает скачок напряжения, который перезагружает первую ардуину, и ардуины начинают перезагр. Как я могу реализовать подобную рабочую схему?
     
  2. a1000

    a1000 Гуру

    Может ёмкость добавить, что-бы растянуть время прохождения сигнала.
     
  3. Asper Daffy

    Asper Daffy Иксперд

    Подтяжка чего?
    Какой скачок напряжения? Вы его замеряли? Что за скачок? Думаю, что это Ваша фантазия, а причина в другом. Рисуйте схему, как и что собрано и давайте скетч перезагрузки.

    P.S. Нафига Вам это надо, я даже не спрашиваю, но думаю, что это костыль, чтобы прикрыть другую ошибку.
     
  4. Daniil

    Daniil Гуру

    Да, обычно перезагружать самих себя свидетельствует об ошибке в алгоритме.
    Но если очень хочется, то посмотрите на супервизоры питания с управляющим входом. Он вешается на ресет обоих микрух, их управляющие ресетом пины через ИЛИ на вход супервизора.
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Да, можно и так, как у ТС, почему нет. Я даже догадываюсь, что там за мелкая ошибка, но пусть код покажет, чтобы наверняка. Я то я буду тут бить пальцы своими догадками, а окажется. что это реинкарнация крауса - оно мне надо?
     
  6. microsystems

    microsystems Нерд

    Возможно, возникает не "скачок напряжения", а короткий импульс низкого уровня. Так происходит, если после сброса при настройке порта на вывод сначала выполняется запись в DDRx, а затем в PORTx. Нужно наоборот - сначала в PORTx, затем в DDRx. тогда не будет неконтролируемого импульса низкого уровня на выходе.
     
  7. parovoZZ

    parovoZZ Гуру

    Ресет подтяни к Vcc через резистор 10к и на нулевую шину замкни через конденсатор 10...100nF. Ежели в процессе перезагрузки МК сперва загружается загрузчик или ещё происходит какое-то колдовство от бабки Ардуиньки, то выбрасывай ардуньку.
     
  8. a1000

    a1000 Гуру

    Такое явление имеет место быть. Во время старта загрузчика ардуинка произвольно дёргает ногами. Возможно если заливать скетча через программатор и первой крммандой переводить нужную ножку в HIGH проблема уйдёт?
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Он уже подтянут. Не надо ничего.

    Мужики, давайте кода дождёмся. У меня вот такая штука отлично работает. Чтобы понять проблему ТС нужны схема и код.
     
  10. KindMan

    KindMan Гуру

    А вам зачем? :)
    У меня МК ESP перезагружает, и когда МК перезагружается сам то ничего на ноге не скачет. В Ардуине, вроде, только PORTB5 дергается при загрузчике.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Мне для игры. Суть игры примерно как Core Wars - угробить противника. Но игра получилась неинтересная, потому нигде про неё не публикую. А так, там можно было на любой пин противника (или союзника) любые сигналы подавать.
     
  12. parovoZZ

    parovoZZ Гуру

    Штатный имеет 30кОм.
     
  13. parovoZZ

    parovoZZ Гуру

    Я сканировал ЛА на 100МГц ноги SPI - иглы скачут в полный рост. Хотя и допускаю, что это наводки из патрахов)) У MSP430FR сделано вообще шикарно - выходные триггеры просто блокируются самим ядром в самом начале загрузки. Надо будет тоже как-то снять осциллограмму загрузки...
     
  14. UnSstrennen

    UnSstrennen Нерд

    Итак, проблема решилась следующим образом: послушав совет @microsystems я поменял команды pinMode и digitalWrite местами. Проблема решилась!
     
    microsystems нравится это.
  15. Asper Daffy

    Asper Daffy Иксперд

    Понятно. Хотел подсказать тебе как сделать это более правильно, но раз уж решилась то и ладно.
     
    UnSstrennen нравится это.
  16. sanik

    sanik Гик

    Вам поможет функция
    Код (C++):
    void(* resetFunc) (void) = 0;
    Вызов функции
    Код (C++):
    resetFunc();