1. C# / Говнокод #25712

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        Master_Slave_Check();
        if (CtrlBrd_Mode == 1) //MasterMode
        {
          SSPC_Check_Proc();      
          Read_ADC();
          Logic();
          RS_Enable();
          Obmen_RS();
          //CAN_Enable();
          //Obmen_CAN();
          
          //if (SoftFlag.Flag1.bit.History_Wr_Req)
          //{
          //  SoftFlag.Flag1.bit.History_Wr_Req = 0;
          //  Write_History();
          //}
          
          HAL_IWDG_Refresh(&hiwdg);	//Dog reset
          
          Migalka();    //Working LED blink
        }
        else if (CtrlBrd_Mode == 0) //SlaveMode
        {
          Slave_DeInit();
          while(1)
          {
            Master_Slave_Check();
            if (CtrlBrd_Mode == 1)    //если плата снова стала мастером, когда сдох основной мастер,
              HW_RESET();             //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
            HAL_IWDG_Refresh(&hiwdg);	//Dog reset
            Migalka();
          }
        }
      }
      /* USER CODE END WHILE */
    }

    Так реализовал параллельную работу двух одинаковых плат управления, одна из которых висит в режиме ожидания.

    Запостил: ykypeHHbIu_nemyx, 10 Июля 2019

    Комментарии (70) RSS

    • Кто-нибудь?...
      Ответить
    • А как платы договариваются, кто станет мастером? Постепенно повышают напряжение на выходе, пока другая не начнет глючить?
      Ответить
      • Ждём код Master_Slave_Check().
        Ответить
        • Может, они там фехтуют пенисами, как моллюски-гермафродиты... Не, мне вот это понравилось:
          HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
          Неужели только так можно перезагрузить контроллер? Вот x86, помнится, перезагружался через контроллер клавиатуры, но тут вроде бы должна быть соответствующая инструкция... ну или через while(1); // Укуси меня собака
          (на x86 WDT не перезагружает процессор, а выдает сигнал на соответствующий выход, и если на плате он не разведен на Reset, то рестарт становится нетривиальной задачей...)
          Ответить
          • Можно выставить SYSRESETREQ в регистре AIRCR. Причём оно даже всю плату к хуям резетнет вместе с собой.
            Ответить
        • void Master_Slave_Check(void)
          {
          if ((Discrete1_State == 1) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
          CtrlBrd_Mode = 1;

          if ((Discrete1_State == 0) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
          CtrlBrd_Mode = 0;

          if ((Discrete1_State == 0) && ((Discrete2_State == 0) || (Discrete3_State == 0)))
          CtrlBrd_Mode = 1;
          }
          //первый вход - просто перемычка, я сам задаю, кто мастер, а кто слэйв. Другие два входа нюхают выходы со второй платы.
          //Не очень надежно, но другого пока не высрал)
          Ответить
          • > не очень надёжно
            Есть шанс, что после включения основной платы она сразу же станет мастером, а резервная плата узнает об этом только на следующей итерации.
            Ответить
          • Перечитал, теперь вообще не понимаю как это работает...

            > перемычка
            1 - основная плата, 0 - резервная?

            > выходы со второй платы
            Единичка выставляется на эти выходы при старте контроллера и никогда не убирается. Ноль - обрыв провода или сдох контроллер?

            Я правильно понял логику?

            З.Ы. Что лежит в CtrlBrd_Mode изначально?
            Ответить
            • Да, все верно. Подумываю заменить непрерывную 1 на стробы. Это пока еще прототип, впереди месяцы отладки...
              Ответить
              • в ктрлбрд лежит 1, но по-моему, без разницы, что там будет в начале т.к. дискрет№_стэйт есть макрос чтения состояния ноги хал_ридпин(гпио№, пин№)
                Ответить
                • Разница есть - без изначальной единички основная плата никогда не станет мастером если не увидит резервную.
                  Ответить
                  • они запускаются одновременно, та, что мастер, считает 1 с перемычки, вторая считает 0.
                    Ответить
                    • Ну вот если слейв дохлый, то мастер не запустится если в CtrlBrd_Mode изначально не 1. Т.е. начальное значение таки важно, а правило 1 никогда не используется :)
                      Ответить
          • > CtrlBrd
            Ккй бгр )))
            Ответить
      • Как геи договариваются, кто станет активом?
        Ответить
        • Зачем заминусовали? Коммент же в тему был...
          Ответить
        • 1) Перемычка может стоять
          2) Приоритет определяется адресом: при передаче адреса происходит одновременный мониторинг шины, несовпадение переданного бита означает присутствие на шине устройства с бóльшим приоритетом.
          3) Сражаются, пока один не отгрызет пенис другого
          4) При возникновении коллизии запускается алгоритм определения (например, CSMA/CD: генерируется сигнал помехи, чтобы партнер тоже перешел в режим определения, затем после [квази]случайной задержки и отсутствии приема происходит повтор передачи)
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий