OK0
Offline
Зарегистрирован: 06.03.2020
Таймер3 может вызывать прерывания и через… э… ногу, так сказать. За счет того, что пины физически совмещены на платах. Выход Таймера3 PF2 вызывает прерывание на совмещенном с ним PD2.
//Прерывание PCINT2 вызванное таймером 3 // PF2 на плате с QFP32L физически сомещен с PD2 #define LEDPIN 13 #define KDV 5 // делитель 1024 // только 1,2,3,4,5 static bool volatile bFlag; //------------------------------------- void setup() { cli(); pinMode(LEDPIN, OUTPUT); digitalWrite(LEDPIN, HIGH); //================================================= PCIFR &= (0b11111000); // ? на всякий случай сбрасываем флаги запросов прерываний PCICR |= (1 << PCIE2); //разрешает обработку прерываний группы PCINT2. PCMSK2 |= (1 << PCINT18); // разрешает генерировать запрос прерывания PD2 //================================================= // PF2 на плате QFP32L физически сомещен с PD2 , если настроен PF2, PD2 настраивать нельзя TCCR3B = 1 << WGM32 | KDV; // Режим СТС WGM3[3:0]=4 + делитель = 1...5 (1...1024) DDRF |= (1 << PF2) ; // Разрешаем вывод в PF2 TCCR3A = 1 << COM3B0; // включаем режим "смена уровня" на пине выхода "B" таймера3 PF2 OCR3AH = 0b01111111; // регистры для сравнения OCR3AL = 0b11111111; sei(); } //========================================================================================= void loop() { digitalWrite(LEDPIN, bFlag); } //------------------------------------- ISR (_VECTOR(5)) { // Обработчик запросов прерывания PCINT от пинов порта D bFlag = !bFlag; }
Проверил прерывание 27
// Использовано модифицированое ядро давида буэноза с включенными пррываниями 26...29 #define LEDPIN 13 #define KDV 5 // делитель 1024 // только 1,2,3,4,5 static bool volatile bFlag; //------------------------------------- void setup() { cli(); pinMode(LEDPIN, OUTPUT); digitalWrite(LEDPIN, HIGH); //================================================= PCIFR &= (0b11100000); // ? на всякий случай сбрасываем флаги запросов прерываний PCICR |= (1 << PCIE3); //разрешает обработку прерываний группы PCINT3. PCMSK3 |= (1 << PCINT25); // разрешает генерировать запрос прерывания PE1 //================================================= DDRE |= (1 << PE1); //|= 0b10;// Разрешаем вывод в PE1 sei(); } //========================================================================================= void loop() { PORTE |= (1 << PE1); delay(500); PORTE &= ~(1 << PE1); delay(500); } //------------------------------------- ISR (_VECTOR(27)) { // Обработчик запросов прерывания PCINT от пинов порта E bFlag = !bFlag; digitalWrite(13, bFlag); }
и прерывание 28
// Использовано модифицированое ядро давида буэноза с включенными пррываниями 26...29 #define LEDPIN 13 #define KDV 5 // делитель 1024 // только 1,2,3,4,5 static bool volatile bFlag; //------------------------------------- void setup() { cli(); pinMode(LEDPIN, OUTPUT); digitalWrite(LEDPIN, HIGH); //================================================= //PCIFR &= (0b11100000); // ? на всякий случай сбрасываем флаги запросов прерываний PCICR |= (1 << PCIE4); //разрешает обработку прерываний группы PCINT4. PCMSK4 |= (1 << PCINT34); // разрешает генерировать запрос прерывания PF2 //================================================= // PF2 на плате QFP32L физически сомещен с PD2 , если настроен PF2, PD2 настраивать нельзя TCCR3B = 1 << WGM32 | KDV; // Режим СТС WGM3[3:0]=4 + делитель = 1...5 (1...1024) DDRF |= (1 << PF2) ; // Разрешаем вывод в PF2 TCCR3A = 1 << COM3B0; // включаем режим "смена уровня" на пине выхода "B" таймера3 OCR3AH = 0b00011111; // регистры для сравнения OCR3AL = 0b11111111; sei(); } //========================================================================================= void loop() { digitalWrite(LEDPIN, bFlag); } //------------------------------------- ISR (_VECTOR(28)) { // Обработчик запросов прерывания PCINT от пинов порта F bFlag = !bFlag; }
и, кстати, вход Таймера3 — это четвертый пин на котором можно организовывать прерывание по фронту
// Использовано модифицированое ядро давида буэноза с включенными пррываниями 26...29 // 29 - номер вектора прерывания от всех событий таймера3 #define KDV 2 // делитель 1024 // только 1,2,3,4,5 #define LEDPIN 13 #define PINCP 10 // pin захвата таймера3 PF4 физически соединен с PB2 volatile bool flag_29 = 0; // флаг изменеия состояния для LED //------------------------------------- void setup() { pinMode(PINCP, OUTPUT); // будем изменять состояние pinMode(LEDPIN, OUTPUT); digitalWrite(LEDPIN, LOW); digitalWrite(PINCP, HIGH); //============================== cli(); TCCR3A = 0; // на всякий случай обнуляем регисры настройки таймера3 TCCR3B = 0; // настраиваем таймер3 // Режим Normal WGM3[3:0]= 0 + делитель = 1...5 (1...1024)+ подавление помех ICNC3 (1 - подавление) // + ICES3 - активный фронт (1-нарастающий, 0 -ниспадающий) TCCR3B |= (KDV) | (1 << ICNC3) | (1 << ICES3); TIMSK3 |= (1 << ICIE3); // включить прерывание по захвату PF4 физически соединен PB2 sei(); } //------------------------------------- void loop() { TCCR3B = 0; // обновим регистр (без этого почему-то не работает) TCCR3B |= ((1 << ICNC3) | (1 << ICES3)) ; digitalWrite(PINCP, HIGH); // нарастающий фронт должен вызвать прерывание digitalWrite(PINCP, LOW); // ниспадающий фронт НЕ должен вызвать прерывание delay(1000); digitalWrite(LEDPIN, flag_29); } //------------------------------------- ISR (_VECTOR(29)) { TIFR3 = (1 << ICF3); //вручную сбрасываем флаг прерывания flag_29 = !flag_29; }
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель.
- Неисправен USB порт компьютера.
- Неисправен USB порт Arduino.
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка.
- Попробуйте другую плату, чтобы исключить часть проблем из списка.
- На плате Arduino сгорел диод по питанию USB.
- Плата Arduino сгорела полностью из-за неправильного подключения питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей.
- Кабель должен быть data-кабелем, а не “зарядным”.
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
- Не установлены драйверы для Arduino.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:
- См. предыдущий список неисправностей.
- Некорректно установлен драйвер CH341.
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику
4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
- [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать.
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека <название файла>, и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Возможно поможет урок по оптимизации кода.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда программа успешно скомпилирована и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
FAQ
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
Many Thanks for your prompt reply. I’m running Windows 7, I do not use Linux.
> Regarding the variant, I recommend you keep using the correct one, because the default settings and the bootloaders are not the same between SSOP20 and LQFP32/48.
I installed the board from your json link. Board present on IDE are:
328P-LQFP48 miniEVB
328P-LQPF32 (e.g. MiniEVB nanostyle and WAVGAT)
328P-LQPF32 wemos-TTGO-XI
328D rare
328P_SS0P20 (e.g. green pseudo pro mini)
From the seller page I need LGT8F32P-LQFP32 MiniEVB
are you sure the CP2102 drivers are correctly installed ? (does it work with other Arduino boards ?)
Yes. I use the CP2102 with Arduino Pro mini (168p or 328p) and it works without problem.
> does the Blue LED of the MiniEVB blinks when powered up ?
Yes, it blinks. At the same time on the CP2102 rx and tx leds are blinking.
> are you sure CP2102.RX is connected to MiniEVB.TX, and CP2102.TX is connected to MiniEVB.RX ?
Yes they are.
are you sure you have selected the correct COM port ?
> does it display some useful error message if you enable «File / Settings / Display detailed results during [_] uploading» ?
it stuck on this
> does it display some useful error message if you enable «File / Settings / Display detailed results during [_] compilation» ?
it stuck on this
> does it display some useful error message if you enable «File / Settings / Compiler Warning / All» ?
it stuck on this
As variant in these pictures, I used 328P-LQFP48 MiniEVB
Страница 1 из 2
-
Приветствую уважаемые!
Нужна помощь по прошивке с LGT8F328D (Китайский аналог Atmega 328P).
Задача:
Загрузить бутлодер, загрузить прошивку HEX и сделать так что бы микропрограмма работала так как работает с Atmega 328AU.Спасибо!
Последнее редактирование: 14 апр 2021
-
Ну если не было бы смысла, то зачем бы это всё затевать) По этому хочется понять как заставить работать этот камень. Ищу специалиста кто сможет помочь.
-
Смысл заморачиваться с вниканием в китайский аналог, если есть 328? Если только за хорошее вознаграждение. Оно хорошее или размером чуть меньше разницы в цене этих камней?
-
Конечно же смысл есть! Разницей чуть меньше тут и не пахнет =)
-
вроде залить бутлодер нетрудно, надо только нужные библиотеки в ардуино подключить https://radiolis.pp.ua/arduino/54-znakosmtvo-s-wemos-xi-lgt8f328d-kitajskij-analog-atmega328
но если под «загрузить прошивку HEX» имеется в виду не переделать исходник программы, а взять непосредственно НЕХ-файл, скомпилированный под атмегу, и засунуть в эту штуку — нереально.
-
Она будет работать так же как и на Атмеге 328.
Но аналог может и лучше работать , и это для каждой задачи индивидуально. -
Да, ПО скомпилировано под Атмегу 328 и соответственно работает на ней. Появилась мысль перейти на LGT8F328D т.к если качество их не хуже, зачем платить больше =)
-
это че прям полностью клон? то есть прям можно НЕХ тупо пересаживать и будет работать? но там же есть отличия, всякие фишки дополнительные и т.д. чет мне кажется это не факт. Но я не шарю, так что хз
-
Клон с расширенными возможностями.
-
На сколько мне известно то «прям клон», но есть незначительные особенность и отличия в +
Китайцы они такие)
-
разница в 2 раза?Видео от уважаемого Форумчанина Пушной Звер которого уже нет с нами.
Посмотрел и сам-выгоды не понял.Если только в цене.
Дайте угадаю-следующий вопрос будет почему не работают скетчи и библиотеки для Ардуино при компиляции в IDE?
sser и issaom нравится это.
-
Помигать светодиодом, а дальше всё сам.
-
Ну ясен пень!Мыж не ищем лёгких путей?
-
вас обманули, отличий чуть более чем дофига и я готов поставить банку пива(жигулевского что HEX от атмеги328 на этом камне не заведется.
Если у вас есть исходник прошивки. то с соответвующим пакетом библиотек можно перекомпилировать программу под этот МК — но не факт. что часть кода не придется переписывать. -
Виталик, а сколько вы рассчитываете выиграть от замены МК и сколько готовы платить за портирование прошивки? По моей оценке. в зависимости от сложности программы переход на китайский клон обойдется вам от 5 до 20 тысяч (и то только в том случае. если есть исходник под атмегу328).
Разница в стоимости камней эти расходы покроет?
Кстати. кроме атмеги328 есть ее младшие братья — атмега168 и 88, которые стоят В РАЗЫ дешевле 328-й. Если прошивка не очень большая, имеет смысл рассмотреть их — под них программу переписывать не придется -
Я мимо прошёл, а вы тут нафлудили на двадцать постов. Ну и кто из нас флудер?
-
Может автор планирует серийное производство? Тысячами! Тогда, возможно, смысл есть.
Страница 1 из 2
Плата LQFP32 MiniEVB не дорогой клон Arduino NANO на микроконтроллере LGT8F328P.
Подключение платы LQFP32 MiniEVB LGT8F328P в Arduino IDE:
- Скачайте zip архив с GitHub разработчика.
- Распакуйте архив …master.zip
- Папку hardware из этого архива поместите в папку со скетчами (sketchbook)
- Запустите или перезапустите Arduino IDE.
Замечание, размещение папки скетчей можно посмотреть в Arduino IDE, меню Файл / Настройки.
Теперь в списке плат появились платы LGT и Larduino.
Выбираем плату LGT8F328P-LQFP32 и порт. Можно программировать.
#define LED_BUILTIN 13
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
digitalWrite(LED_BUILTIN, LOW);
delay(990);
}
Скетч использует 1206 байт (4%) памяти устройства. Всего доступно 29696 байт.
Глобальные переменные используют 9 байт динамической памяти.