Amperka iskra nano pro перестал загружаться скетч

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

  1. SEsin

    SEsin Нерд

    Всем привет! Кажется, я сделал то, что делать нельзя и в плату перестал загружаться скетч ) А именно:
    в качестве com порта передачи MIDI сообщений я в скетче стал использовать стандартный serial, который как я понимаю, используется и для перепрошивки платы. После этой манипуляции код залился один раз, после этого код компилится, но при заливке долго висит и выскакивает сообщение, что программатор не отвечает. При этом виртуальный Com порт виден.
    Честно говоря, не встречал информации, что эта какая-то запрещенная фишка. Если есть варианты это обойти или сбросить, прошу совета.

    А предыстория такая: у Amperka Iskra Nano Pro два аппаратных com порта. У меня проект в котором к плате подключено два MIDI входа и два MIDI выхода. В коде идет обработка входящих сообщений, преобразование, фильтрация и т.д. Изначально я задействовал Serial1 и SoftwareSerial и вроде все работало. В тестовом режиме оба порта работали нормально. Но при реальной игре на инструменте, когда клавиши нажимались более динамично, выяснилось, что аппаратный Serial1 работает отлично, а вот SoftwareSerial работает через раз, иногда пропуская MIDI сообщения. Я с этим долго бился, в итоге решил в коде прописать Serial и Serial1. В итоге скетч загрузился и все заработало круто и как нужно. Я обрадовался. Но счастье длилось не долго - я получил проблему с заливкой нового скетча и не знаю как выкрутиться. Я первый кто так сделал? )

    Вот кусок скетча:
    Код (C++):
    #include <SoftwareSerial.h>
    #include <MIDI.h>
    #include <TroykaTextLCD.h>
    #include <EEPROM.h>

    TroykaTextLCD lcd;
    //Создаем виртуальный Com порт на выводах 4 и 5
    SoftwareSerial softSerialIn(4, 5); // !!! раньше использовал этот порт, но он глючил

    //Определяем виртуальный порт под работу с MIDI
    MIDI_CREATE_INSTANCE(HardwareSerial, Serial, midi2);
    //Определяем предопределенный com порт под работу с миди на выводах 11 - передача и 12 - прием
    MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);

    byte ClockDel; //Делитель Midi Clock для дополнительного выхода
    byte CurClock; //Текущий номер сообщения Midi Clock, чтобы понять, какое сообщение пропустить, а какое передать
    const byte CountSet = 10; //Общее количество настроек
    const byte CountVal = 5; //Общее количество именованных значений
    bool ShowTitle;
    bool OnLoad;

    struct strPot {
      byte analogInPin; //Номер Пина
      int ValAnalog; //Аналоговое значение потенциометра 1
      byte ValMIDI; //MIDI значение потенциометра 1. От 0 до 127
      byte PrValMIDI; //Предыдущее значение для устранения дребезга потенциометра
      byte CC; //Номер CC
      byte Res; //Точность/шаг значения
    };

    strPot Pot[4];

      struct strSetCC {
        char* Title; //Название раздела настроек
        byte CC[4]; //Номера СС, соответствующие ручкам настройки, при выборе раздела настроек
        byte Res[4]; //Шаг ручки
        char* PotName[4]; //Названия ручек
        byte ValName[4]; //Если 0, то выводится числовое значение, если больше - выводятся спец. названия
      };

      struct strValName {
        byte BorderVal[10]; //Граничное значение для этого имени
        char* Name[10]; //Названия этого значения Синус, Треугольник и т.д.
      };

    byte CurSetting; //Текущая настройка, выбранная клавишей

    bool BtnStart; //Определяет, нажата ли кнопка Start на клавиатуре, которая определяет режим игры или режим ввода параметров синтезатора
    bool ChSpeed; //Флаг, что произошло изменение делителя Midi Clock

    void setup() {

      //Настройка виртуального Serial-порта для подключения к компьютеру
      while (!Serial);
      Serial.begin(115200);
      Serial1.begin(115200);

      MIDI.begin(MIDI_CHANNEL_OMNI);
      MIDI.turnThruOff();             // MIDI Thru Off

      midi2.begin(MIDI_CHANNEL_OMNI);
      midi2.turnThruOff();             // MIDI Thru Off

      lcd.begin(16, 2);
      // устанавливаем контрастность в диапазоне от 0 до 63
      lcd.setContrast(27);
      // устанавливаем яркость в диапазоне от 0 до 255
      lcd.setBrightness(255);
      // устанавливаем курсор в колонку 0, строку 0
      //lcd.createChar(0, heart);
     
      lcd.setCursor(0, 0);
      pinMode(2, OUTPUT);
      digitalWrite(2, HIGH); //Подсветка LSD на 2 пине

      ClockDel = 2;
      CurClock = 2;
      BtnStart  = false;

      Pot[1].analogInPin = A0;
      Pot[2].analogInPin = A1;
      Pot[3].analogInPin = A2;

      iniSetEEPROM();
      CurSetting = 0;
      ShowTitle = true;
     
      ReadSettings();

      OnLoad = true;

    }

    void loop() {

      //MIDI - будет основным портом, к которому подключается Мaster clock
      //midi2 - будет второстепенным, на нем midi clocдолжен фильтроваться

      ReadPots();
      ReadMasterMIDI();
      ReadSecondMIDI();

    }

    ...
    ...
    ...
     
  2. AlexU

    AlexU Гуру

    А во время загрузки Вы отключаете MIDI от ног RX/TX?
     
  3. SEsin

    SEsin Нерд

    Вы правы. Вчера, когда бился с этой проблемой вроде отключал ноги, тоже об этом подумал. Но скетч все равно не хотел загружаться. Сейчас, когда все перезагрузил ещё раз после отключения ног, все заработало.
    Спасибо большое!