![Михаил Копычев](/img/default-banner.jpg)
- 66
- 77 885
Михаил Копычев
Registrace 1. 03. 2013
c714491b-d1f8-44d9-b6f0-a49cbe106bde
Взаимодействуем с Visual Studio Code и GitHub
Разбираемся с преимуществами среды разработки (которая таковой не является) Visual Studio Code и системы контроля версий git в лице GitHub. VSCode - это незаменимый инструмент, если вы хотите программировать AVR микроконтроллеры, но у вас нет компьютера с Windows, а также если вы просто хотите использовать среду разработки, которая помогает вам лучше узнать про AVR-GCC и AVRDude, а также подталкивает вас писать код более грамотно (с разбивкой на файлы и вот это всё). Git - незаменимый инструмент, если вам необходимо писать код не в одиночку или вы просто хотите удобно пользоваться несколькими компьютерами для своего программирования.
Тайм-коды:
00:00 Введение
00:05 Что есть Visual Studio Code?
01:20 Интерфейс VSCODE
06:06 Утилиты для программирования AVR
08:08 Компилятор AVR-GCC, прошивальщик AVRDude и репозитория Homebrew
09:46 Как пользоваться Homebrew (для macOS и Linux)
12:16 Опиши AVR-GCC и AVRDude
12:42 Расширения VSCODE - AVR Helper
14:22 Расширения VSCODE - Serial Monitor и C/C++ Extension Pack
15:25 Моя первая программа в VSCODE для AVR
20:30 Система контроля версий git и GitHub
22:30 Базовые команды git
25:35 Мой первый репозиторий в GitHub
28:19 Коммитим и пушим (commit and push) изменения в коде в GitHub
30:31 Подготовка к пулу (pull) изменений в коде из GitHub
32:40 Разбираемся с задачами (issues) и ветками (branches)
34:40 Слияние веток (merge)
36:05 Действия на локальном компе после слияния веток в GitHub
36:31 Немного про место git в процессе разработки
Тайм-коды:
00:00 Введение
00:05 Что есть Visual Studio Code?
01:20 Интерфейс VSCODE
06:06 Утилиты для программирования AVR
08:08 Компилятор AVR-GCC, прошивальщик AVRDude и репозитория Homebrew
09:46 Как пользоваться Homebrew (для macOS и Linux)
12:16 Опиши AVR-GCC и AVRDude
12:42 Расширения VSCODE - AVR Helper
14:22 Расширения VSCODE - Serial Monitor и C/C++ Extension Pack
15:25 Моя первая программа в VSCODE для AVR
20:30 Система контроля версий git и GitHub
22:30 Базовые команды git
25:35 Мой первый репозиторий в GitHub
28:19 Коммитим и пушим (commit and push) изменения в коде в GitHub
30:31 Подготовка к пулу (pull) изменений в коде из GitHub
32:40 Разбираемся с задачами (issues) и ветками (branches)
34:40 Слияние веток (merge)
36:05 Действия на локальном компе после слияния веток в GitHub
36:31 Немного про место git в процессе разработки
zhlédnutí: 1 171
Video
Указатели, структуры и разбивка кода на файлы
zhlédnutí 1,3KPřed 8 měsíci
Разбираемся с такими сущностями в языке СИ, как указатели, структуры, а также разбиваем код на отдельные файлы, что позволит нам вывести наше программирование на новый уровень удобства и красоты. Тайм-коды: 00:00 Введение 00:09 Указатели в СИ 04:04 Пример применения указателей 10:25 Структуры в СИ, объявление структур 16:53 Указатели на структуры 19:42 Стрелочный оператор в указателях на структ...
ШИМ на таймере
zhlédnutí 708Před 8 měsíci
Рассмотрим такой модуль внутри МК как таймер-счётчик. У него есть много особенностей, но нас будет интересовать в основном его способность к ШИМ-модуляции сигнала. ШИМ-модуляция - это способ кодирования аналогового сигнала с помощью дискретных импульсов постоянного периода, но переменного коэффициента заполнения. Тайм-коды: 00:00 Введение 00:27 Что такое таймер-счётчик? 02:40 Счётный регистр TC...
Внешние прерывания в МК
zhlédnutí 567Před 8 měsíci
Разбираемся с системой прерываний в AVR на примере внешних прерываний. Источником сигнала внешнего прерывания в данном случае выступит кнопка. Рассмотрим регистры настройки внешних прерываний, функции-обработчики прерываний и примеры. Тайм-коды: 00:00 Введение 00:24 Определение прерываний 02:40 Источники сигнала прерываний 03:56 Базовые вектора (источники) прерываний 05:33 Определение кнопки 06...
Плёночная механическая клавиатура
zhlédnutí 305Před 8 měsíci
В этом видео разбираемся как работает механическая клавиатура, боремся с эффектом дребезга контактов, пишем алгоритм опроса клавиатуры и вывода цифр (и значков) на символьный жидкокристаллический дисплей. Делаем скромные попытки написать свой собственный калькулятор с одним математическим действием. Тайм-коды: 00:00 Введение 00:14 Что ты такое - кнопка? 03:16 Схема соединений кнопок клавиатуры ...
Жидкокристаллический символьный дисплей
zhlédnutí 610Před 9 měsíci
Разбираемся, что можно сделать с LCD экраном на плате со своим собственным микроконтроллером, подключённым к Atmega по параллельному порту. Посмотрим и разберём схему подключения, напишем функции для инициализации контроллера дисплея, посылки команды и ASCII кодов символов на дисплей. Немного бросим взгляд на работу с указателями, когда будем работать со строками. Тайм-коды: 00:00 Введение 00:0...
Звуковой динамик и RGB светодиод
zhlédnutí 306Před 9 měsíci
Разберёмся, как работает и как подключается к микроконтроллеру звуковой излучатель и RGB светодиод. Напишем программу для вывода слова с использованием азбуки Морзе и световой индикации. Тайм-коды: 00:00 Введение 00:08 Схема подключения динамика и RGB диода 02:28 Сигнал на динамик 04:13 Азбука Морзе 05:41 Трёхцветный светодиод 06:39 Вырабатываем с потенциометра ШИМ на диоде в Proteus 12:26 Прог...
Шаговый двигатель
zhlédnutí 538Před 9 měsíci
Рассказывается про устройство, подключение и управление вращением ротора шагового мотора. Рассказывается про драйвер управления шаговым мотором и про режимы его работы. Тайм-коды: 00:00 Введение 00:05 Применение шаговых моторов 01:51 Схема подключения шаговика 04:55 Режимы работы шаговика 08:49 Алгоритм программы 11:13 Моделириуем мотор в Proteus 13:17 Программный код для полушагового режима 19...
Светодиодная матрица
zhlédnutí 633Před 10 měsíci
В видео рассказывается про работу со светодиодными сборками типа матрицы. Рассказывается процедура программирования через параллельный порт микроконтроллер, а также - описывается процесс вывода информации на матрицу посредством протокола TWI, но для этого нужна не просто светодиодная матрица, а матрица с драйвером, обеспечивающим общение по TWI. Тайм-коды: 00:00 Введение 00:11 Применение светод...
Семисегментные индикаторы
zhlédnutí 831Před rokem
В видео рассказывается про работу с семисегментными индикаторами как с устройствами вывода цифро-буквенной информации. Рассматриваются способы подключения индикаторов к микроконтроллеру и о способах программирования, включая процедуру передачи данных по протоколу SPI. Тайм-коды: 00:00 Введение 00:04 Применение семисегментников 00:52 Устройство семисегментника 03:12 Схема включения семисегментно...
Цифровая реализация систем автоматического управления
zhlédnutí 1,4KPřed rokem
Рассматривается реализация САУ на микроконтроллере. Раскрывается понятие САУ, зачем оно существует. Даются подробности о ПИД-регуляторе, об их настройке и особенностях. Приводится пример регулирования левитации магнитного подвеса с программным кодом. Тайм_коды: 00:00 Введение 00:19 Что такое "система управления"? 03:44 Примеры САУ (шар на столе) 07:06 ПИД-регулятор 09:36 Пропорциональный коэффи...
Протокол обмена данными 1-Wire (Microlan)
zhlédnutí 1,9KPřed rokem
В лекции рассматривается протокол обмена данным 1-Wire или Microlan и его программная реализация. Зрителю даётся представление о структуре и характеристиках этого протокола, рассматриваются его отличия и особенности по сравнению с протоколами, рассмотренными ранее. Приводятся примеры применения этого протокола, а также приводится конкретный программный пример общения с датчиком температуры/влаж...
Протокол обмена данными UART
zhlédnutí 5KPřed rokem
В лекции рассматривается протокол обмена данным Universal Asynchronous Receiver/Transmitter - UART и его аппаратная реализация. Рассматриваются правила обмена данными, регистры AVR микроконтроллера, ответственные за работу протокола, а также примеры применения данного протокола. В конце лекции даётся общее представление о более общем проколе обмена - USART. Тайм-коды: 00:00 Введение 00:11 Описа...
Протокол обмена данными SPI
zhlédnutí 1,5KPřed rokem
В лекции рассматривается протокол обмена данным Serial Peripheral Interface - SPI, в частности - его программная и аппаратная реализации. Рассматриваются правила обмена данными, регистры AVR микроконтроллера, ответственные за работу протокола, а также примеры применения данного протокола. Тайм-коды: 00:00 Введение 00:10 Аппаратный уровень SPI 03:00 4 режима работы SPI 05:53 Датчик температуры T...
Введение в протоколы обмена данными, I2C / TWI протокол
zhlédnutí 2,3KPřed 2 lety
Лекция вводит понятие "протокола обмена данными" между микроконтроллером (микроконтроллерами) и периферийными устройствами. Протокол - это способ кодирования сообщений между ведущим и ведомым устройством, которые могут передаваться по ограниченному количество проводов. Работа с каждым устройством, работающим на том или ином протоколе обмена должна рассматриваться отдельно, так как упомянутые вы...
Аналоговый компаратор AVR микроконтроллера
zhlédnutí 1,4KPřed 2 lety
Аналоговый компаратор AVR микроконтроллера
Система прерываний AVR микроконтроллера (инкрементальный энкодер)
zhlédnutí 2,3KPřed 2 lety
Система прерываний AVR микроконтроллера (инкрементальный энкодер)
Цифровые регистры ввода/вывода AVR микроконтроллера
zhlédnutí 4,3KPřed 2 lety
Цифровые регистры ввода/вывода AVR микроконтроллера
Введение в курс программирования микроконтроллеров
zhlédnutí 3,2KPřed 2 lety
Введение в курс программирования микроконтроллеров
Л.15. Прерывания AVR + символьный дисплей
zhlédnutí 723Před 3 lety
Л.15. Прерывания AVR символьный дисплей
Lab #4. Adaptive+modal control for double-mass resilient electromechanical plant
zhlédnutí 211Před 3 lety
Lab #4. Adaptive modal control for double-mass resilient electromechanical plant
Почему в .h файлах не пишется определение функций? Какой смысл переписывать одно и то же в .с?
Основное назначение хедера - это чтобы его содержимое было вставлено на место include, где он вызывается. Хедер не компилируется, а си-файл - компилируется, оттого и нужно тела функций прописывать не в хедерах, а в исходных файлах. Header файлы удобны тем, что их можно перетаскивать из проекта в проект и легко модифицировать в связке с исходным файлом.
Классные видосы, все подробно и понятно, но все же обычно стоит отделять какие-то объективно правильные вещи и собственные предпочтения с привычкми. Например, в заголовочнике прямо несколько раз было подчеркнуто "правило", что и как надо писать после #define и #ifndef, но на самом деле нет такого правила, и есть разные "стили" того, как это оформлять.
Прошу прощения - САУ- это система автоматизированного( а не автоматического) управления.
Я таки не понял Uart это протокол или интерфейс?
Правила, по которым вы обмениваетесь данными (типа - количество бит, количество стопов, скорость, порядок бит в посылке) - это протокол UART, а вот то, «по чему» обмен осуществляется (например - CH340G, RS-…) - это интерфейс. Интерфейс, вроде как принято считать, материальным, а протокол - это неосязаемые правила.
Смысл эту тягомотину разводить? Главное оснований принцип. Всё равно никто всё не запомнит А назначение битов регистров и свойства в даташите.
Спасибо за труды!
Почему так мало лайков?
Просто браво!!! Спасибо за труды!!!
Я одного не пойму, как устройства отличают, передаёт мастер "1" или он передаёт запрос на чтение, если обе команды выглядят абсолютно одинаково?
Мастер управляет потом данных на линии. Если мастер хочет получить от подчиненного информацию, то предварительно мастер отсылает на него байт чтения. В рассмотренном примере, подчиненное устройство сразу начинает слать байты, оно просто больше ничего не умеет, как только произошел сигнал сброс-присутствие, DHT11 (или DHT22) "неуправляемо" начинают слать байты. На программном уровне же протокол 1-wire устроен несколько более сложно и в нём есть стандартные (а также индивидуальные для каждого устройства) команды - байты данных, с помощью посылки которых мастер переводит слейва в состояние приема или отправки информации. Вот тут об этом есть подробнее: avr.ru/beginer/understand/1wire?ysclid=lxq0dwxnai70797933.
Большое спасибо, давно искал подобный контент. Однозначно подписка!
Здравствуйте Сколько стоит полный курс?
Здравствуйте. Честно говоря, весь курс (даже два) выложены на канале и доступны бесплатно.
⁸8⁸8⁸
Подскажите пожалуйста, есть проект с FreeRTOS в котором много задач в том числе с LWIP. для веб интерфейса. Не удается корректно заставить работать 1wire в этом проекте пробовал варианты с DMA+UART с UART + прерывание и т д пока либо 1wire живет нормально, либо веб интерфейс. Какой вариант реализации 1wire правильный в такой ситуации?
Насчёт подтягивания к питанию и помех не понял тему. Всегда думал что: - проще на старых архитектурах т.к. там pull мощнее push-a; - внутренняя подтяжка, если есть, то к питанию.
Есть такое мнение, что когда у вас помеха аддитивная (то есть на цифровой сигнал нуля «накладывается» сигнал единицы), в этом случае, подтяжка к питанию предпочтительнее, потому как бОльшую часть времени сигнал будет в высоком состоянии, а в непродолжительном активном состоянии - в низком.
А можете показать как подключить дисплей по I2C я имею в виду код на си? Спасибо за ваши обучающие видео 👍
Вроде бы в c массив заканчивается NULL (после последнего элемента резервируется еще 1 байт), поэтому можно не передавать длину. Поправьте, если не прав
Когда я передаю массив в функцию, я могу передать только адрес его первого элемента (указатель на массив) и в этом случае, у функции нет шансов узнать сколько байт занимает массив, поэтому мне нужно передать ещё и его длину, иначе есть шанс влезть в область памяти, не касающуюся интересующего нас массива. Массив типа строка заканчивается признаком конца строки ‘\0’, а массив вещественных чисел не имеет признака конца, насколько мне известно.
Зачем нужен command byte? Он всегда 1 или это указание на инструкцию?
Command byte в случае рассматриваемого датчика - это адрес его конфигурационного регистра, куда мы пишем настройки датчика температуры. В общем же случае - после старта и адреса слева, согласно методике TWI протокола, по линии мастером всегда передается адрес регистра слейва (этих регистров может быть больше одного, например у гироскопа-акселерометра mpu6050 их чёртова уйма), куда мастер будет писать биты (если выставлен признак записи после адреса слейва) или откуда будет читать биты (если выставлен признак чтения после адреса слейва). Короче в данном случае command byte - это либо конфигурационный регистр датчика температуры, либо предельные значения температуры, на которые должен срабатывать датчик. Вот, надеюсь, что стало немного понятнее.
Command byte в случае рассматриваемого датчика - это адрес его конфигурационного регистра, куда мы пишем настройки датчика температуры. В общем же случае - после старта и адреса слева, согласно методике TWI протокола, по линии мастером всегда передается адрес регистра слейва (этих регистров может быть больше одного, например у гироскопа-акселерометра mpu6050 их чёртова уйма), куда мастер будет писать биты (если выставлен признак записи после адреса слейва) или откуда будет читать биты (если выставлен признак чтения после адреса слейва). Короче в данном случае command byte - это либо конфигурационный регистр датчика температуры, либо предельные значения температуры, на которые должен срабатывать датчик. Вот, надеюсь, что стало немного понятнее.
Благодарю за видео! По моему мнению, лекция не для новичков. Но мне, как уже кое-что понимающему, было приятно послушать грамотное объяснение и получше уложить все эти вещи в голове
Спасибо!
Спасибо большое.
Спасибо
вообще четкие уроки и без воды, я за час стал программистом мк
LPT - это параллельный порт, а не последовательный.
Да, спасибо.
Скажите пожалуйста все сделал как на видео все компелируется но в папках не могу найти хекс файл ?
Перейдите в настройки VSCODE (иконка шестеренки слева внизу в интерфейсе), в строке поиска наберите avr helper, это приведёт вас к настройкам соответствующего расширения. В настройках найдите AVR > HEX > Dump: Enabled и поставьте в этом пункте отметку. Теперь при сборке проекта в папке Build будет создаться output.hex файл.
@@michael_mmk да спасибо все получилось
@@michael_mmk А не могли бы ли вы сделать видео как в проект добавлять сторонние библиотеки ?
По генетическим алгоритмам у Дмитриевича диплом защищал в 2008 году на САПРе :)
Да это не для среднего ума но за урок однозначно 👍
Добавьте ссылку на скачивание AVRDUDE, пожалуйста
Очень полезная инфа, для меня так точно, пользуюсь Visual Studio, так как пишу проги на С++, но для Arduino пишу на IDE. Писать всё в одной среде будет удобней. 👍😁
Михаил здравствуйте. Спасибо😊
А где должен крутиться цикл for для перебора канала?
Наверное, можно этим циклом for(i = 0…7) обернуть функцию readAdc(i); Ещё - можно сделать прерывание от ацп и когда прочитан один канал, класть номер следующего канала в младшие биты регистра ADMUX.
@@michael_mmk В общем вчера мучался, по итогам сделал функцию adcread(uint8_t channel) с переменной восьмибитной, в нее запихнул запуск преобразования, ожидание окончания и чтение результата. а уже в майне просто создал переменный соответствующие каналам adcresult1=adcread(1) и так со всеми каналами, и просто вывожу их на дисплей, незнаю насколько это правильно или быстродейственно. пока только начла изучать все. Осталось только прилететь домой и в железе проверять. Пилите еще ролики! у вас очень классный материал! если бы у вас был фулл курс я бы купил его!
Спасибо!
Теперь вопрос: списки, кортежи и деревья будут рассмотрены? А то все, как партизаны на допросе, молчат.
К сожалению, пока не планируется. Но если я освою материал до такой степени, что смогу о нём рассказать и объяснить - то запишу.
Вот, единственный, кто НОРМАЛЬНО объяснил!!! Сам я до этого дошёл не сразу, разжевать никто не мог. А тут всё понятно и ежу. 👍👍👍👍👍
Спасибо, огромное. Всё очень понятно. Продолжайте, пожалуйста, лекции записывать. Всегда их очень жду
Куда ты спешишь? На СВО? 100 плетей заслужил, как минимум, за свое бестолковое изложение материала. Работы непочатый край. А они ходят с растопыренными пальцами, типа вченные великие и ересь несут, даже не задумываясь над этим. Их так учили - они оправдываются. Но это не оправдание, а констатация факта, что своей головой эти типа самые грамотные, берущиеся учить других, думать не умеют.
Первые 3/4 видео очень хорошо изложены, спасибо. А вот начиная с "Разбивки программы на файлы" слишком беглое (на мой взгляд) объяснение. Я лично не совсем понял что значит "защита от двойного подключения". Можно ли продемонстрировать это на примере куска кода?
Давайте попробуем разобраться. Пусть есть файл типа common.h и в нём код: 1 #ifndef COMMON_H_ 2 #define COMMON_H_ 3 #include <avr/io.h> 4 #include <utils/delay.h> 5 uint16_t findMiddleValue(uint16_t a, uint16_t b, uint16_t c); 6 #endif Подключаем этот файл в main.c и, например, в ещё одном .c файле, где нам это требуется. Каждое подключение (директива #include "myHeader.h") занимает процессорное время. Когда мы подключаем common.h, мы же заинтересованы в том, чтобы иметь возможность обращаться к частям "хедеров" avr/io и utils/delay, а также иметь возможность находить среднее значение из трёх переменных с помощью функции findMiddleValue(). Возникает вопрос - если мы уже однажды подключили common.h - надо ли нам тратить процессорное время на повторное подключение этого файла, учитывая, что его содержимое не изменилось? Ответ - наверное, нет. Второй вопрос - должны ли мы сами следить за подключениями? Ответ - наверное, тоже нет. Мы должны писать программу и подключать всё, что нам требуется в каждом файле (программист - не компилятор). Компилятор должен нам помочь в экономии процессорного времени, но мы должны "сказать" ему о том, что нам нужна здесь помощь. А теперь - суть. В момент, когда мы впервые подключили common.h мы проверяем не задефайнено ли значение COMMON_H_ (мы сами придумали эту запись; обратите внимание, что мы не пишем #define COMMON_H_ 100, мы просто "декларируем дефайн"), и если оно не задефайнено, мы его дефайнем и делаем все строки, начиная с третьей и заканчивая пятой, после чего идёт endif. Если мы после этого опять пытаемся подключить common.h, то мы опять натыкаемся на условие #ifndef, только в этом случае оно будет ложно (COMMON_H_ уже задефайнен) и мы, экономя процессорное время, прыгаем на сроку, после шестой в коде выше.
@@michael_mmk Теперь стало более понятно, спасибо за развернутый ответ.
а если я хочу получить не данные которые храняться в переменной по указателю, а само значение адреса? допустим так: uint32_t* memADR = (uint32_t*)0x0807FFF4; if (*memADR == 0xFFFFFFFF) { .... и теперь мне нужно передать не то что храниться по этому адресу, а само значение 0x0807FFF4; и я делаю вот так writeDataToMemory ((uint32_t)memADR, 100); это нормальная практика?
Метод выглядит рабочим, VSCODE ни на что не ругается. Если нужно передать не просто абстрактный адрес (вот на это IDE ругается, потому что не факт, что по прописанному адресу что-то есть и не факт, что я обращусь к области памяти, которая мне не предназначается), а адрес конкретной переменной, то пишем просто int* memAdr = &myVar; (myVar тоже int) В этом случае будет возможность передавать адрес myVar, сравнивать его с какими то значениями и класть по этому адресу что-то.
@@michael_mmkну я сделал чуть по другому, я все адреса в дефайн запихнул, а где нужно просто присваиваю его указателю)
Здравствуйте. Спасибо огромное за труд для нас.
Эээ...Лайк конечно... но брат.... - с кем ты сейчас разговаривал? ))
То, что нужно было. Спасибо, помогло разобраться с таймерами для настройке ШИМ в ATmega128
Лекция очень понравилась. Спасибо вам за представленную информацию!
Михаил, прекрасно подаётся информация: без всяких "какбы" и прочих паразитных слов, но очень часто слышно словосочетание "чистота сигнала" но ни о каком фильтре речи не идёт, что вы имеете в виду, кода говорите "Чистота сигнала"?
Спасибо. Скорее всего, я всё-таки имею ввиду "чАстоту сигнала", когда говорю о периодических сигналах. Вместо слова "чистота" я бы в своих записях использовал слово "помехозащищённость" или вариации слова "фильтрация".
Михаил, Вы кандидат технический наук? Впши лекции просто высочайшего уровня. Досмотрю один курс и потом все сразу ваши лекции
Спасибо, но я просто преподаватель, до кандидата наук мне далековато.
@@michael_mmk главное поставить цель
Спасибо за Ваш труд!!! Благодаря таким уроком можно учиться и повышать свой тезнический уровень
Отличные уроки и подача!! Спасибо!
Офигенная подача для меня лично, даже немного не успеваю за материалом после рабочей смены, как говорят "не догоняю". Впервые на себе понял смысл "не догоняю".
Спасибо!
Красивое. Давая расшифровку имен регистров прям как с ассемблера на си переходите. Становится намного понятнее (не тц или типа r33 а таймер коунтер...)
Вы большой молодец. Спасибо за уроки.
Надо собрать такой стенд
Можно ещё такой экран использовать - roboshop.spb.ru/display/simvolnye-displei/lcd-0802-green - он тоже символьный, но общается по TWI протоколу.
Спасибо за урок.