- 147
- 253 210
Александр Рожков
Ukraine
เข้าร่วมเมื่อ 19 พ.ค. 2017
Изучаем программирование микроконтроллеров AVR STM32 PIC PSoC TMS320 на языке программирования С C++ Assembler и microPython.
Урок №23.2 Настраиваем UART на прием данных в STM32f103 в среде программирования Keil uVision.
Настраиваем UART на передачу и прием данных в микроконтроллера STM32f103 в среде программирования Keil uVision.
Текстовую версию можно посмотреть на сайте: texnohelp.com/stm32-23/
Текстовую версию можно посмотреть на сайте: texnohelp.com/stm32-23/
มุมมอง: 347
วีดีโอ
Урок №48. Изучаем работу аналогового компаратора на микросхеме Atmega8.
มุมมอง 6137 หลายเดือนก่อน
Изучаем работу аналогового компаратора на микросхеме Atmega8. Текстовую версию можно посмотреть на сайте: texnohelp.com/avr-48/
Урок №49. Пишем программу для поиска адреса I2C датчиков в среде программирования Arduino IDE.
มุมมอง 7259 หลายเดือนก่อน
Пишем программу для поиска адреса I2C датчиков в среде программирования Arduino IDE используя плату Arduino Nano. Текстовую версию можно посмотреть на сайте : texnohelp.com/avr-49
Урок №5. Настраиваем UART c помощью языка программирования Assembler на микроконтроллере Atmega8.
มุมมอง 61610 หลายเดือนก่อน
Настраиваем работу шины UART c помощью языка программирования Assembler на микроконтроллере Atmega8.
Урок №13. Пишем программный код для подключения сдвигового регистра к микроконтроллеру AVR через SPI
มุมมอง 64911 หลายเดือนก่อน
Пишем программный код для подключения 8-битного сдвигового регистр SN74HC595 к микроконтроллеру Atmega8 через SPI. Текстовую версию можно посмотреть на сайте: texnohelp.com/AVR-13/
Урок№2. Настраиваем ножки микроконтроллера TMS320F28027 на вход.
มุมมอง 634ปีที่แล้ว
Настраиваем ножки микроконтроллера TMS320F28027 на вход, изучаем особенности работы аппаратной системы анти дребезга. Текстовую версию урока можно посмотреть на сайте: texnohelp.com/tms320-2/
Урок №10. Подключаем TFT экран на драйвере R61520 к микроконтроллеру STM32f103.
มุมมอง 691ปีที่แล้ว
Пишем программный код для подключения TFT экран на драйвере R61520 к микроконтроллеру STM32f103. Текстовую версию можно посмотреть на сайте: texnohelp.com/stm32-10/
Урок№1. Мигаем светодиодами на TMS320F28027 в среде программирования Code Composer Studio.
มุมมอง 1.2Kปีที่แล้ว
Мигаем светодиодами на микроконтроллере TMS320F28027 в среде программирования Code Composer Studio. Текстовую версию можно посмотреть на сайте: texnohelp.com/tms320-1/
Урок №4. Изучаем прерывания с помощью языка программирования Assembler на микроконтроллере Atmega8.
มุมมอง 1.3Kปีที่แล้ว
Изучаем работу прерывания с помощью языка программирования Assembler на микроконтроллере Atmega8. Текстовую версию можно посмотреть на сайте: texnohelp.com/assembler-4/
Урок №3 Подключаем кнопку на языке программирования Assembler, при нажатии кнопки включаем светодиод
มุมมอง 1.9Kปีที่แล้ว
Подключаем кнопку на языке программирования Assembler для микроконтроллеров AVR (atmega 8), при нажатии кнопки включаем/выключаем светодиод. Текстовую версию можно посмотреть на сайте: texnohelp.com/assembler-3/
Урок №8. Пишем музыку на микроконтроллере ESP8266 с помощью языка программирования microPython.
มุมมอง 1Kปีที่แล้ว
Пишем музыку на микроконтроллере ESP8266 с помощью языка программирования microPython. Текстовую версию можно посмотреть на сайте: texnohelp.com/microPython-8/
Урок №6. Включаем два ядра на работу в микроконтроллере ESP32 в среде программирования Arduino IDE.
มุมมอง 3.7Kปีที่แล้ว
Включаем два ядра на работу в микроконтроллере ESP32 в среде программирования Arduino IDE. Текстовую версию можно посмотреть на сайте: texnohelp.com/freertos-arduino-6/
Урок №4. Настраиваем ESP8266 / ESP32 в качестве точки доступа в среде программирования Arduino IDE.
มุมมอง 2.9Kปีที่แล้ว
Настраиваем микроконтроллер ESP8266/ESP32 в качестве точки доступа в среде программирования Arduino IDE. Текстовую версию можно посмотреть на сайте: texnohelp.com/esp-4/
Урок №1. Пишем программный код мигания светодиодом используя Assembler на микроконтроллере Atmega8.
มุมมอง 3.9Kปีที่แล้ว
Пишем программный код для мигания светодиодом с помощью языка программирования Assembler на микроконтроллере Atmega8. Текстовую версию можно посмотреть на сайте: texnohelp.com/assembler-1/
Урок№3. Пишем программный код для подключение экрана WINSTAR WH1602 к микроконтроллеру PIC16F873A.
มุมมอง 1.4Kปีที่แล้ว
Пишем программный код для подключение экрана WINSTAR WH1602 по 4 битной шиной к микроконтроллеру PIC16F873A в среде программирования MPLAB X IDE. Текстовую версию можно посмотреть на сайте: texnohelp.com/pic-3/
Урок №1. Пишем первую WEB страничку с подключением к WiFi сети на языке программирования Lua.
มุมมอง 1.2Kปีที่แล้ว
Урок №1. Пишем первую WEB страничку с подключением к WiFi сети на языке программирования Lua.
Урок№ 17. Пишем программный код для подключения графического экрана SSD1306 к плате Arduino Nano.
มุมมอง 1Kปีที่แล้ว
Урок 17. Пишем программный код для подключения графического экрана SSD1306 к плате Arduino Nano.
Урок №1. Выводим данные на WEB страничку с помощью JS на языке программирования С++ и microPython.
มุมมอง 967ปีที่แล้ว
Урок №1. Выводим данные на WEB страничку с помощью JS на языке программирования С и microPython.
Урок №5. Пишем программный код для настройки UART на прием данных на микроконтроллере Atmega8.
มุมมอง 2.1Kปีที่แล้ว
Урок №5. Пишем программный код для настройки UART на прием данных на микроконтроллере Atmega8.
Урок№2. Настраиваем аппаратный ШИМ на микроконтроллере STM32f103 в среде Keil uVision.
มุมมอง 1.5Kปีที่แล้ว
Урок№2. Настраиваем аппаратный ШИМ на микроконтроллере STM32f103 в среде Keil uVision.
Урок №2. Мигаем светодиодом используя счетчик в качестве прерывания на микроконтроллере CY8C21534.
มุมมอง 848ปีที่แล้ว
Урок №2. Мигаем светодиодом используя счетчик в качестве прерывания на микроконтроллере CY8C21534.
Урок №0. Настраиваем среду Code Composer Studio для программирования микроконтроллеров TMS320.
มุมมอง 3Kปีที่แล้ว
Урок №0. Настраиваем среду Code Composer Studio для программирования микроконтроллеров TMS320.
Урок №1.Создаем задачи в системе FreeRTOS на базе микроконтроллера STM32F103.
มุมมอง 4Kปีที่แล้ว
Урок №1.Создаем задачи в системе FreeRTOS на базе микроконтроллера STM32F103.
Урок №0. Почему важно уметь программировать на языке Assembler.
มุมมอง 13Kปีที่แล้ว
Урок №0. Почему важно уметь программировать на языке Assembler.
Урок №3. Мигаем лампочкой с помощью контроллера Siemens в среде программирования TIA portal.
มุมมอง 3.2Kปีที่แล้ว
Урок №3. Мигаем лампочкой с помощью контроллера Siemens в среде программирования TIA portal.
Урок №6. Пишем код для подключения OLED экрана к ESP8266 в среде программирования Arduino IDE.
มุมมอง 988ปีที่แล้ว
Урок №6. Пишем код для подключения OLED экрана к ESP8266 в среде программирования Arduino IDE.
Урок №5. Считываем температуру с датчика DS18B20 с помощью microPython на микроконтроллере ESP8266 .
มุมมอง 1.5Kปีที่แล้ว
Урок №5. Считываем температуру с датчика DS18B20 с помощью microPython на микроконтроллере ESP8266 .
Урок №0. Подготавливаем программное обеспечение для изучения языка Lua на микроконтроллера ESP8266.
มุมมอง 2.1Kปีที่แล้ว
Урок №0. Подготавливаем программное обеспечение для изучения языка Lua на микроконтроллера ESP8266.
Урок №36. Подключаем энкодер к плате Arduino Nano в среде программирования Arduino Ide.
มุมมอง 770ปีที่แล้ว
Урок №36. Подключаем энкодер к плате Arduino Nano в среде программирования Arduino Ide.
Урок №23. Пишем программный код для подключения датчика давления BM180 к плате Arduino Nano.
มุมมอง 6482 ปีที่แล้ว
Урок №23. Пишем программный код для подключения датчика давления BM180 к плате Arduino Nano.
Спасибо за работу! Хорошее и понятное объяснение) жду следующих видео
Вопрос - почему изменение выделенной памяти в стеке не меняет значение при компиляции? Или память выделяется не как глобальная?
Вы сами выделяете максимальное количество памяти. И тут главное не дать больше чем надо (память не резиновая), но и меньше дать нельзя - может/произойдет сбой работы программы. А компилятор компилирует Ваш программный код, он в душе не знает, что и сколько вы выделяете. При запуске программы система все создает, при чем можно и удалять не нужные "блоки" и создавать программно на лету. Но об это позже. Будет время сделаю урок.
Если я правильно понял, это комплексный (и переусложнённый)) ) вариант флагов.
почему биты ubrrh и ubrrl не меняют скорость uart ??? любое значение не меняет скорость uart, она стабильная 300 бод!!!
по моему это тот канал, который я искал ) У вас очень много видео-роликов и плейлистов. Я хочу посвятить жизнь созданию роботов разных масштабов от мини типа vector от anci до производственных. Можете пожалуйста подсказать в какой последовательности стоит смотреть ваши видео ролики (или плейлисты). Начиная с самых старых и на вверх или лично мне не все пригодиться в моей дальнейшей деятельности. И вообще стоит вас мне смотреть ли или нет (в плане необходимости). Я пока только начинаю, освоил базовые навыки программирования на python и немного c++ Я как увидел ваш канал у меня почему то глаза загорелись ) надеюсь первое впечатление меня не обмануло. Если это так то я буду вас мучать, в хорошем смысле этого слова.
На данный момент я ооочень занят, по этому видео выходит пока редко. Я не могу Вам сказать что именно Вам нужно, так как направлений ооочень много. Тем чем я занимаюсь, даже 10% нет в видео. По возможности буду добавлять разные видео. Но нормальное видео занимает много времени для его создания.
У ардуинки можно отключить передачу символов конца строки и перевода каретки
Можно, специально оставил - многие начинающие допускают тут ошибки.
Билиотеки на C++ от ето било круто узнать как писать чтобы расширить возможности...
Это скетч для точки доступа, а как подключить саму ЕСП к существующей сети, с возможностью управления аналоговыми сигналами, цифровыми на ПЛК через 485 интерфейс?
Здравствуйте! А можно сделать, чтобы сразу открывалась Web страничка, при подключении к точке доступа? Без набора ее IP адреса вручную?
Можно, я пока оооочень занят, как только освобожусь - сделаю урок.
Хороший урок - все работает. Правда долго мучилась мои LCD плохо от 3,3V работают, один не работает вообще, второй дает слабый контраст изображения. Использовала BluePill(STM32F103C8T6) на breadboard и китайский STLINK. От него и шло питание 3.3В.
Добрый вечер! Хочу сделать удаленный репитер посредством активный юсб-хаб (пауербанк,и провод юсб мама-мама. С питанием папа.. короче тд-клиент. Один модуль хочу вынести на крышу, а второй в дом! Сможет ли данный девайс это? Спасибо!!
но есть же millis и micros зачем там память контроллера бессмысленно расходовать...
У меня концепция, а дальше каждый сам решает для себя как писать программный код.
Если прерывание пишется в Callback-е то обработчик прерывания от дребезжащей кнопки должен выглядеть примерно так: if(GPIO_Pin==Button_Pin) //если это используемое прерывание на линии кнопки for (uint32_t i=0; i<=72000; i++) __NOP(); //делаем антидребезговую задержку примерно 1-2 мс if (HAL_GPIO_ReadPin(Button_GPIO_Port, Button_Pin)==1) //если это не помеха-иголка, выполняем необходимые действия ........................................................ //ДЕЙСТВИЯ по прерыванию от кнопки EXTI->PR|=1<<Button_Pin; //Сброс флага прерывания, который из-за дребезга во время задержки установится повторно и прерывание возникнет вновь, здесь обязательно Системный сброс флага производится не в Callback-е (как говорится в ролике), а в сгенерированном CubeMX обработчике в файле stm32f1xx_it.c.
Здравствуйте, а можно ли таким способом передавать данные температуры с датчика ds18b20?
Конечно можно, я пока ооочень занят, но как только освобожусь сделаю уроки в данной тематике.
В данном примере срабатывание аналогового компаратора принципиально устанавливать по переходу из 0 в 1 (нарастающему фронту). Когда напряжение батареи (инвертирующий вход AC) больше чем 1.22 (неинв. вход AC), тогда на выходе AC - 0 (ACO=0). Когда напряжение батареи падает и становится меньше чем 1.22, тогда на выходе аналогового компаратора - 1 (ACO=1). Т.е. при разряде батареи на выходе AC появится перепад из 0 в 1, что должно вызвать прерывание по снижению напряжения батареи, т.е. настройка регистра состояния AC ACSR должна выглядеть след. образом: ACSR = (1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0); //подключение внутр. ИОН 1.22V к неинв. входу AC, разреш. прер. от AC, прер по переходу из 0 в 1 (напряжение на AIN1 стало меньше 1.22V)
Такие все вумные😂😂😂 как слить и залить в эту херню и чем это сделать никто не знает! Мир дебилов! Логических!
Теперь исправления которые на работоспособности не сказываются, просто так ИМХО будет понятнее и лучше. 1. В обработчике таймерного прерывания по совпадению ISR (TIMER1_COMPA_vect), лучше сразу же после входа в него выключать катодные ключи единственным оператором PORTC&=0b11110000; //у меня базы катодных ключей разрядов слева направо подключены к PC3, PC2, PC1, PC0 а уже затем использовать оператор-переключатель switch. Так исходник короче и понятнее. 2. Насчет настройки таймерного прерывания. Несколько спорное утверждение о задании максимального быстродействия. При этом программа почти постоянно будет висеть в обработчике. Для этого существуют эргономические соображения. Частота развертки изображения должна быть не менее Fкчм =50 Гц, иначе изображение будет мелькать. Возьмем в примере частоту развертки 83 Гц> 50 Гц. Это значит, что период развертки равен12 мс. А каждое знакоместо при развертке изображения по знакоместам должно светиться 12/3=4 мс. Это и есть интервал между прерываниями таймера. Ниже возможная настройка TIM1 для ATmega8: TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению) TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания TIM1 по совпадению с OCR1A TCCR1B |= (1<<CS12); //делим тактовую частоту на 256 предделителем, в итоге Fctim1=8/256=31250 Гц OCR1AL=125; //TIM1 досчитает до 125 за 4 мс=125/31250, после этого возникнет прерывание OCR1AH трогать не надо, пусть остается в исходном нуле. В вечном цикле для быстрой смены чисел: num(n); n++; //инкремент индицируемого числа _delay_ms(200);
Первое исправление для тех, кто использует Proteus. Инициализацию начала передачи данных по SPI в модуле main делать не надо, т.е. оператор SPDR = 0b00000000; следует убрать. В этом случае все нормально работает и на модели Proteus и в железе на макете.
В который раз смотрю и восхищаюсь автором уроков, как блестяще легко и изящно он применяет модульность в программировании. Сложная задача разбивается на кучу простых, которые оформляются в виде функций С. И так в целом создается достаточно сложная иерархическая система. Ставлю лайк, хотя есть недоработки скорее всего из-за недостатка времени, о которых напишу далее в других комментариях.
12? 13?
В силу особенностей схемотехники портов ввода-вывода в Atmega во избежание сброса в инициализационной части программы (setup) следует поменять местами операторы задания режима пина и вывода в него 1, т.е. сделать так: digitalWrite(RST, HIGH); //в регистр выходных данных запишется 1 pinMode(RST, OUTPUT); //эта единица появится на выходном пине и заблокирует сброс Я делала наоборот, так как было у автора. При этом программа из-за короткого сигнала сброса (поскольку в исходном состоянии в регистре вывода нули) зацикливалась в setup-е и не выходила на общение с последовательным терминалом.
Все конфигурирование и настройка в Atmel Studio производится вручную с даташитом перед глазами... это медленно и печально... совсем не так, как платном Code Vision AVR.
5:52
Добрый вечер Как найти предыдущие уроки ( 1 и 2 уроки) этого третьего урока? Тиа портал Буду очень рад
texnohelp.com/tia-portal-1/
Все ясно и понятно, спасибо большое
Спасибо вам огромное за доступное объяснение! Изучаю программирование ESP32, но только у Вас понял что такое FreeRTOS, для чего нужна и как её применять
Спасибо Александр за отличные видео и уроки! Ещё будет слушателям интересно видео с Ротор-кодером. Ещё с синтезатором частоты будут полезны уроки. А если с ОЛЕД и ротором, - то можно задавать частоту SI5351, т.е. сделать простой VFO (с возможностью управления по ВЕБ). И ещё - опрос датчика напряжения ADS1115 был бы полезен начинающим. Сам вот думаю сделать такие видео, да всё некогда, только провожу вебинары по SIP-протоколу.
Подскажите пожалуйста два знака после запятой получилось но нужно три знака после запятой( вес ,целое кг а три после запятой граммы)?
Спасибо огромное Александр за ролики и статьи! Это реально крутая штука FreeRTOS на 328 меге. Честно, я раньше даже не знал, что можно на 328 меге ОСРВ запускать, ресурсов маловато, думал только для СТМов оказывается - можно. Это реально круто! Теперь можно отдельным потоком ротор-енкодер читать и кнопки, отдельным потоком значения на дисплей выводить, отдельным датчики опрашивать или делать что-то ещё. А ещё можно сделать кнопки, которые будут останавливать и запускать отдельные процессы, или по событиям! А если это ещё всё в ESP32 засунуть, наверное будет вообще - улёт!
Более того, Arduino core для ESP32 уже и так работает на FreeRTOS, там даже подключать дополнительно ничего не нужно).
@@pavelavoidfate Да, это очень круто! Сейчас набрал на алике кучку различных плат с чипами ESP8266, ESP32 - разных S, C3, китайских LGT328, CH32, а также STM32 несколько разновидностей синие и чёрные F401, F411, изучаю, буду разбирать. Стандартный ЛУП - не совсем устраивает, он для простых решений. Нужно разобрать многозадачность и многопоточность.
А мне напишите програму для холодильника?
Я сейчас ооочень занят, даже пришлось временно канал запустить.
Чтобы скорость изменения коэффициента заполнения ШИМ менялась надо использовать работающую задержку: for(j=0; j<700; j++) __NOP(); //чем меньше верхнее значение j, тем быстрее изменяется коэффициент заполнения (или обратная ему величина - скважность) В приведенном примере задержка не работает, она все время имеет минимальное значение, скважность меняется очень быстро.
Нашел наконец крутой канал😎
Спасибо большое😍😍😍
спасибо за уроки! скажите, вы больше не работаете с PIC-микроконтроллерами? увидел, что последний урок по ним был год назад
Работаю, но сейчас просто физически нет времени. Как только освобожусь - продолжу.
Стоит такой в кондиционере китайком, он сгорел, поставили новый пустой нет прошивки и как его шить тоже не понятно? Рядом епром 2402!
Задержка при помощи _delay() аж полсекунды. Я один угарнул? А что если нужно опрашивать датчик 100 раз в секунду и данные слать по UART? Какую задержку выставим тогда?
Хорошее объяснение достоинств ассемблера! Однако лучше было ассемблерную программу писать для ATmega328p, микроконтроллера с той же тактовой частотой 16 МГц что и на Arduino nano (собственно и с тем же микроконтроллером). А то Atmega8 имеет в 4 раза меньшую тактовую частоту (4 МГц). Естественно при сравнении меандров на С++, С и ассемблере это надо учитывать.
atmega8 работает на 16МГц, при подключении внешнего кварца, но это не обязательно поскольку в итоге все пересчитывается в такты.
странный код и странно как он у Вас скомпилировался??? Откуда появился ds. ???? Также нет схем подключения. Всё как обычно в уме, а остальным догадываться???
Прерывания здесь не используются. Окончание передачи байта устанавливается опросом бита регистра (поллингом флага). Так что прерывания можно и не разрешать, тем более что и обработчика прерывания в программе нет. Надлежащая работа программы (бегущий огонь) зависит от скорости работы SPI. У Вас частота SCK в 4 раза меньше тактовой частоты МК, т.е. Fsck=1 МГц, у меня (я пробовала в PROTEUS на ATmega328p с такт частотой 16 Мгц) что-то похожее на правду получилось лишь при Fsck=250 кГц. Разобралась, в чем проблема!!! - не надо перед входом в вечный цикл обращаться к регистру данных SPDR (строку SPDR = 0b00000000; следует закоментировать), из-за неё возникает проблема переполнения (в Proteus это хорошо видно). Это лишние данные, для которых в вечном будет производиться опрос готовности переданных данных (поллинг), из-за этого сбои в в передачах, и на параллельных выходах регистра (светодиодах) делается невесть что. На железе данное утверждение проверить не могу из-за отсутствия микросхемы регистра. Но в любом случае хуже не будет, если указанную строку убрать!
Добилась работы кода и на макете и в Proteus. Для этого надо более точно сформировать временные диаграммы на параллельной шине, подключенной к LCD. Определения e0 и e1 использовать не надо. Лучше откорректировать функцию пересылки полубайта sendhalfbyte(unsigned char c): void sendhalfbyte(unsigned char c) // передача полубайта (ниббла) { c<<=4; //сдвигаем младший ниббл в старшие 4 бита unsigned char byte=portlcd|c; //вычисляем передаваемый на шину байт с учетом упраавляющих сигналов I2C_SendByteAddr(byte,0b01001110); //передаем на 4-разр шину полубайт (ниббл) с учетом сигналов управления _delay_us(50); // небольшая задержка byte|=(1<<2); //Подготавливаем E=1 I2C_SendByteAddr(byte,0b01001110); //передаем на 4-разр шину полубайт (ниббл) с учетом сигналов управления, подготовка строба - спадающего фронта на E _delay_us(50); // небольшая задержка byte&=~(1<<2); //Подготавливаем E=0 I2C_SendByteAddr(byte,0b01001110); //передаем на 4-разр шину полубайт (ниббл) с учетом сигналов управления, строб - спадающий фронта на E //После заднего фронта полубайт защелкнется в контроллере LCD HD44780 }
Все работает на макете проверила (на плате Arduino Nano с ATmega328). Представленные библиотеки правильные. Не удалось к сожалению добиться работы соответствующей модели в PROTEUS.
При TWPS1=TWPS0=0 (как в коде на сайте) для получения частоты SCL 100 кГц TWBR должен быть равен 12. Для получения частоты 100 кГц при тактовой частоте МК 4 МГц TWPS1=0 TWPS0=1 и TWBR=3. Смотри формулу TWBR = ((F_cpu/F_scl) - 16)/(2*4^TWPS), 4^1=4, 4^0=1, 4^3=64 (4000000/100000-16)/(2*4)=24/8=3. Если же как в видео TWPS1=1 TWPS0=1, то частота шины будет явно меньше 100 кГц. Но это не скажется на работе устройств подключаемых к шине, т.к. подключение происходит по схеме монтажное И, и частота диктуется наиболее медленным устройством на шине.
Круть
Ставлю лайк - отличное объяснение проблематики зависаний программы и использования сторожевого таймера для их ликвидации. Жаль только, что используются встроенные библиотеки.
Могу посоветовать автору различать понятия нажатие (или отпускание) кнопки и одиночный клик кнопки (нажатие, а затем отпускание) кнопки. В данном случае задавалась реакция именно на клик кнопки, поэтому программирование прерываний по нарастающему фронту (отпускание кнопки после нажатия) проходит. В варианте на ассемблере - другая ситуация. Там принципиально задание прерывания по спадающему фронту (нажатие кнопки). Автор использует стандартные микрокнопки, в которых практически нет явления дребезга контактов (по крайней мере в новых). Если взять другую кнопку (с заметным дребезгом) то написанная программа будет работать точно также, из-за особенности реализуемых программой действий. После нажатия кнопки из-за явления дребезга на входах прерываний пройдет много нарастающих фронтов и прерывание возникнет несколько раз. Однако сколько раз не включай или выключай светодиод - результат будет одним и тем же. Влиять дребезг будет в том случае, если, например, в прерывании происходит подсчет кликов кнопки - в этом случае результат будет непредсказуемым. Именно в таком случае при входе в прерывание нужна антидребезговая задержка, а при выходе из прерывания сброс соответствующего флага прерывания. Т.к. во время антидребезговой задержки флаг прерывания из-за дребезга установится повторно и прерывание возникнет еще один раз. Кстати, при отпускании кнопки причины для дребезга нет, следовательно и дребезга нет, но он есть при нажатии, которое естественно происходит во времени до момента отпускания.
Следовало бы сказать о начальной системной области Flash памяти - области векторов прерываний. Ведь они используются: rjmp RESET rjmp EXT_INT0. И еще вопрос: прерывания на INT0 (PORTD.2) запрограммированы по нарастающему фронту (переход из низкого в высокий уровень), а когда нажимается кнопка возникает другой фронт - спадающий - переход из высокого уровня в низкий, а в обработчике прерывания после антидребезговой задержки проверяется нажатое состояние кнопки (низкий уровень на PIND.2). Таким образом прерывание возникнет после отпускания нажатой бездребезговой кнопки кнопки или во время дребезга дребезговой кнопки. Таким образом программа с бездребезговой кнопкой работать не будет, а с дребезговой будет (проверила на макете именно с разными кнопками). У вас по-видимому кнопка с дребезгом была, поэтому и заработало. Чтобы программа работала абсолютно верно (т.е. одинаково и с бездребезговой кнопкой и с кнопкой с дребезгом), надо запрограммировать прерывание INT0 по спадающему фронту, т.е. ldi temp, (1<<ISC01)|(0<<ISC00) ; прерывание INT0 по спадающему фронту (при нажатии кнопки) out MCUCR, temp А так глобально все верно и подход к обработке кнопки на прерывании правильный. Еще желательно перед возвратом из обработчика (а именно перед разрешением прерываний), сбросить флаг прерывания INT0, который может повторно установиться из-за дребезга, вызвав вложенное прерывание, т.е. добавить команды: ldi temp,(1<<INTF0) out GIFR,temp ;сброс флага прерывания, который возможно установился повторно во время дребезга Так что работа с кнопкой на прерывании, задача довольно сложная и требует массы экспериментов на железе, через что я прошла.
Судя по объяснениям автора нажатию кнопки соответствует подключение бита 2 порта D к земле (в настройках эта линия порта D настроена на ввод и подтянута к питанию внутренним подтягивающим резистором). Тогда 3-ей командой после метки PINCYCLE должна быть команда SBIC PIND,2 (Skip Bit Clear - пропустить следующую команду, если линия PIND.2 =0, или что то же самое - пропустить следующую команду, если кнопка нажата). В программе видеоролика там стоит команда SBIS PIND,2 - Skip Bit Set - пропустить следующую команду если бит установлен, что неверно - не соответствует продекларированному замыслу. И вообще для столь простой задачи как изменение состояний линий 0 и 1 порта D в зависимости от состояния кнопки (нажата - отпущена) данный код довольно запутанный и к тому же неоптимальный. Отсутствие же подробных комментариев к тексту программы при наличии ошибок делает восприятие данного ролика весьма затруднительным не только начинающему обучение, но и человеку имеющему опыт в практическом программировании. Кстати попробовала на железе с 3-ей командой после метки Pincycle SBIS PIND,2 (как у автора в ролике и на сайте). Внешне все как будто нормально - работает. Однако это из-за того что далее стоит задержка в 100 мкс (длинная часть кода) и наиболее вероятно момент нажатия кнопки приходится именно на эту часть, поэтому и работает. При уменьшении задержки появляются сбои - залипание в исходном состоянии при нажатии кнопки. Тогда как при использовании SBIC и с минимальной задержкой DELAY все продолжает нормально работать!!!
Добрый день! В принципе правильный разбор программирования на ассемблере, мне нравится. Есть одно замечание - ошибка в расчете тактов выполнения цикла WLOOP2 (начиная с 13 мин 10 сек). Цикл выполняется 199*3+2, а не так как сказано в видео 199*2+3. Т.к. именно в случае перехода на начало цикла WLOOP2 (повтор выполнения цикла) команда brne WLOOP2 выполняется 2 такта, а при выходе из цикла (нулевой результат), обычный инкремент программного счетчика PC - переход на следующую команду - 1 такт. В итоге: внутренний цикл WLOOP2 выполняется 3х199+2=599 тактов, средний цикл WLOOP1 - (599+1+3)х49+599+1+2=30149 тактов, внешний цикл WLOOP0 - (30149+1+3)х49+30149+1+2=1507649 тактов. Вся подпрограмма задержки, включая команды вызова rcall (3 такта) и возврата ret (4 такта) - 1507649+3+4=1507656 тактов. При тактовой частоте МК Atmega8 4МГц это будет 1507656/4000000=0.377 c. Для получения задержки свечения светодиодов 1 сек надо увеличить время выполнения внешнего цикла - 50Х(1/0.377)=133. Таким образом .equ Delay = 133.
Здравствуйте! Помогите пожалуйста, Нужно чтобы работало через Keil но аналогично как в CubeIDE без SWO, потому что много микроконтролеров есть без SWO, к примеру серия - G0. А переходить в куб не вариант. th-cam.com/video/mhrx0tNP_MM/w-d-xo.html
Добрый день. В процессе выполнения программы можно менять настройки таймера?
да