Всем привет! Кажется, я сделал то, что делать нельзя и в плату перестал загружаться скетч ) А именно: в качестве 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(); } ... ... ...
Вы правы. Вчера, когда бился с этой проблемой вроде отключал ноги, тоже об этом подумал. Но скетч все равно не хотел загружаться. Сейчас, когда все перезагрузил ещё раз после отключения ног, все заработало. Спасибо большое!