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; }
Hi,
I can not compile anything. Although fully complied with all the conditions specified in the file readme. The installation path is correct. All is correct, but I have error
«C:UsersKonstyantynAppDataLocalArduino15packagesarduinotoolsavr-gcc4.8.1-arduino5/bin/avr-gcc» -c -g -Os -Wall -Wextra -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_LARDU_328E -DARDUINO_ARCH_AVR «-ID:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8f» «-ID:KonstyantynDocumentsArduinohardwareLGTavrvariantslgt8fx8p» «D:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8fwiring_analog.c» -o «C:UsersKONSTY1AppDataLocalTemparduino_build_105324corewiring_analog.c.o»
«C:UsersKonstyantynAppDataLocalArduino15packagesarduinotoolsavr-gcc4.8.1-arduino5/bin/avr-gcc» -c -g -Os -Wall -Wextra -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_LARDU_328E -DARDUINO_ARCH_AVR «-ID:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8f» «-ID:KonstyantynDocumentsArduinohardwareLGTavrvariantslgt8fx8p» «D:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8fhooks.c» -o «C:UsersKONSTY1AppDataLocalTemparduino_build_105324corehooks.c.o»
«C:UsersKonstyantynAppDataLocalArduino15packagesarduinotoolsavr-gcc4.8.1-arduino5/bin/avr-gcc» -c -g -Os -Wall -Wextra -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_LARDU_328E -DARDUINO_ARCH_AVR «-ID:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8f» «-ID:KonstyantynDocumentsArduinohardwareLGTavrvariantslgt8fx8p» «D:KonstyantynDocumentsArduinohardwareLGTavrcoreslgt8fwiring_pulse.c» -o «C:UsersKONSTY~1AppDataLocalTemparduino_build_105324corewiring_pulse.c.o»
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
cc1.exe: error: -fno-fat-lto-objects are supported only with linker plugin.
exit status 1
Ошибка компиляции для платы LGT8F328P-LQFP32 MiniEVB.
In this case, I just tried to compile one of the examples for your board.
Will there be any help from your side?
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
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
Loading