Пікірлер
@VX-4777
@VX-4777 2 күн бұрын
странный код и странно как он у Вас скомпилировался??? Откуда появился ds. ???? Также нет схем подключения. Всё как обычно в уме, а остальным догадываться???
@marina16350
@marina16350 3 күн бұрын
Прерывания здесь не используются. Окончание передачи байта устанавливается опросом бита регистра (поллингом флага). Так что прерывания можно и не разрешать, тем более что и обработчика прерывания в программе нет. Надлежащая работа программы (бегущий огонь) зависит от скорости работы SPI. У Вас частота SCK в 4 раза меньше тактовой частоты МК, т.е. Fsck=1 МГц, у меня (я пробовала в PROTEUS на ATmega328p с такт частотой 16 Мгц) что-то похожее на правду получилось лишь при Fsck=250 кГц. Разобралась, в чем проблема!!! - не надо перед входом в вечный цикл обращаться к регистру данных SPDR (строку SPDR = 0b00000000; следует закоментировать), из-за неё возникает проблема переполнения (в Proteus это хорошо видно). Это лишние данные, для которых в вечном будет производиться опрос готовности переданных данных (поллинг), из-за этого сбои в в передачах, и на параллельных выходах регистра (светодиодах) делается невесть что. На железе данное утверждение проверить не могу из-за отсутствия микросхемы регистра. Но в любом случае хуже не будет, если указанную строку убрать!
@marina16350
@marina16350 13 күн бұрын
Добилась работы кода и на макете и в 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 }
@marina16350
@marina16350 14 күн бұрын
Все работает на макете проверила (на плате Arduino Nano с ATmega328). Представленные библиотеки правильные. Не удалось к сожалению добиться работы соответствующей модели в PROTEUS.
@marina16350
@marina16350 16 күн бұрын
При 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 кГц. Но это не скажется на работе устройств подключаемых к шине, т.к. подключение происходит по схеме монтажное И, и частота диктуется наиболее медленным устройством на шине.
@dimahavryliuk8409
@dimahavryliuk8409 18 күн бұрын
Круть
@marina16350
@marina16350 22 күн бұрын
Ставлю лайк - отличное объяснение проблематики зависаний программы и использования сторожевого таймера для их ликвидации. Жаль только, что используются встроенные библиотеки.
@marina16350
@marina16350 22 күн бұрын
Могу посоветовать автору различать понятия нажатие (или отпускание) кнопки и одиночный клик кнопки (нажатие, а затем отпускание) кнопки. В данном случае задавалась реакция именно на клик кнопки, поэтому программирование прерываний по нарастающему фронту (отпускание кнопки после нажатия) проходит. В варианте на ассемблере - другая ситуация. Там принципиально задание прерывания по спадающему фронту (нажатие кнопки). Автор использует стандартные микрокнопки, в которых практически нет явления дребезга контактов (по крайней мере в новых). Если взять другую кнопку (с заметным дребезгом) то написанная программа будет работать точно также, из-за особенности реализуемых программой действий. После нажатия кнопки из-за явления дребезга на входах прерываний пройдет много нарастающих фронтов и прерывание возникнет несколько раз. Однако сколько раз не включай или выключай светодиод - результат будет одним и тем же. Влиять дребезг будет в том случае, если, например, в прерывании происходит подсчет кликов кнопки - в этом случае результат будет непредсказуемым. Именно в таком случае при входе в прерывание нужна антидребезговая задержка, а при выходе из прерывания сброс соответствующего флага прерывания. Т.к. во время антидребезговой задержки флаг прерывания из-за дребезга установится повторно и прерывание возникнет еще один раз. Кстати, при отпускании кнопки причины для дребезга нет, следовательно и дребезга нет, но он есть при нажатии, которое естественно происходит во времени до момента отпускания.
@marina16350
@marina16350 23 күн бұрын
Следовало бы сказать о начальной системной области Flash памяти - области векторов прерываний. Ведь они используются: rjmp RESET rjmp EXT_INT0. И еще вопрос: прерывания на INT0 (PORTD.2) запрограммированы по нарастающему фронту (переход из низкого в высокий уровень), а когда нажимается кнопка возникает другой фронт - спадающий - переход из высокого уровня в низкий. Таким образом прерывание возникнет после отпускания нажатой кнопки. Ну и собственно в результате получается алгоритмическая путаница, в которой Вам, я думаю, следует самому разобраться и откорректировать данный урок.
@marina16350
@marina16350 23 күн бұрын
Судя по объяснениям автора нажатию кнопки соответствует подключение бита 2 порта D к земле (в настройках эта линия порта D настроена на ввод и подтянута к питанию внутренним подтягивающим резистором). Тогда 3-ей командой после метки PINCYCLE должна быть команда SBIC PIND,2 (Skip Bit Clear - пропустить следующую команду, если линия PIND.2 =0, или что то же самое - пропустить следующую команду, если кнопка нажата). В программе видеоролика там стоит команда SBIS PIND,2 - Skip Bit Set - пропустить следующую команду если бит установлен, что неверно - не соответствует продекларированному замыслу. Эксперимент который как будто бы верно иллюстрировал работу данного кода, не совсем чистый, поскольку не видно подробно манипуляций с кнопкой. И вообще для столь простой задачи как изменение состояний линий 0 и 1 порта D в зависимости от состояния кнопки (нажата - отпущена) данный код довольно запутанный и к тому же неоптимальный. Отсутствие же подробных комментариев к тексту программы при наличии ошибок делает восприятие данного ролика весьма затруднительным не только начинающему обучение, но и человеку имеющему опыт в практическом программировании.
@marina16350
@marina16350 23 күн бұрын
Добрый день! В принципе правильный разбор программирования на ассемблере, мне нравится. Есть одно замечание - ошибка в расчете тактов выполнения цикла WLOOP2 (начиная с 13 мин 10 сек). Цикл выполняется 199*3+2, а не так как сказано в видео 199*2+3. Т.к. именно в случае перехода на начало цикла WLOOP2 (повтор выполнения цикла) команда brne WLOOP2 выполняется 2 такта, а при выходе из цикла (нулевой результат), обычный инкремент программного счетчика PC-переход на следующую команду - 1 такт.
@kendy8369
@kendy8369 Ай бұрын
Здравствуйте! Помогите пожалуйста, Нужно чтобы работало через Keil но аналогично как в CubeIDE без SWO, потому что много микроконтролеров есть без SWO, к примеру серия - G0. А переходить в куб не вариант. kzbin.info/www/bejne/o5nVqWOqg7WSg68
@Oleg-fp9hn
@Oleg-fp9hn Ай бұрын
Добрый день. В процессе выполнения программы можно менять настройки таймера?
@AlexanderRozhkov_
@AlexanderRozhkov_ Ай бұрын
да
@user-ww7cq8zj6q
@user-ww7cq8zj6q Ай бұрын
Очень сложно.....как можно во всем этом разбираться??!! Вы что...все гении??? Я обычный человек, вроде не дурак....но ничего не понятно...только копировать ваши скечи!!!
@user-ww7cq8zj6q
@user-ww7cq8zj6q Ай бұрын
Спасибо, но поподробнее бы про Клиента....что это такое? для чего его упоминать в коде.. Для меня это новое и совсем не понЯтное..
@user-ww7cq8zj6q
@user-ww7cq8zj6q Ай бұрын
Интересно. Я собираюсь разбирать ваши уроки. Интересует не только измерение но и управление / воздействие на измеряем величину. Т.е. обратная связь через web интерфейс. Я новичок, работал только с нано, интересует беспроводное измерение/управление.
@YurijVasiliev
@YurijVasiliev Ай бұрын
Наверное лучший урок по выделению памяти во Фриртос. !!! Более доступного и простого обяснения я не встречал
@egorchech
@egorchech Ай бұрын
Обязательно с setup убирать pinmode? Зачем каждый раз его вызывать при старте таска?
@user-gw9oz7gb2u
@user-gw9oz7gb2u 2 ай бұрын
Light-sleep чем можно подавать сигнал для засыпания и пробуждения? Sim800l с контакт RING сможет разбудить? ( Звонок на sim800l будет будить еsp ,для выполнения каких либо действий а после еsp уходить в сон)
@michaeljordan1283
@michaeljordan1283 2 ай бұрын
Если программа занимает меньше байт памяти, то потребление энергии тоже сократится?
@AlexanderRozhkov_
@AlexanderRozhkov_ 2 ай бұрын
Не совсем, все зависит от частоты работы и периферии которая включена.
@michaeljordan1283
@michaeljordan1283 2 ай бұрын
@@AlexanderRozhkov_ Согласен. Но, если при одинаковом потреблении энергии периферией то программа на ассемблере будет потреблять меньше энергии (из-за меньшего объема) чем программа, написанная на высокоуровневом языке.
@panika2247
@panika2247 2 ай бұрын
Здравствуйте! hc-05 получилось подключить к программе и вроде правильно мигает, но OK не отвечает. Подскажите пожалуйста, что можно с этим сделать?
@up7zy9mk5l
@up7zy9mk5l 2 ай бұрын
​ @AlexanderRozhkov_ добрый день. На основе вашего урока хочу освоить запись во флеш нужных параметров. Для разработки использую плату ESP32-C3 SuperMini. Так как у меня нет такого же датчика, как у вас, я присваиваю значения temp = random(255). Скетс компилится и заливается в контроллер. но в мониторе порта или глухо или иногда появляется строка / temp content. Пробывал менять размер памяти, flash mode QIO/DIO, через плагин предварительно создавать SPIFFS раздел в памяти и удаление true из SPIFFS.begin(). Скорость СОМ порта верная. Ничего не помогает, оказался в тупике. Подскажите, пожалуйста, в чем может быть проблема?
@Blond055
@Blond055 2 ай бұрын
Отличный материал! Спасибо!
@starboom92
@starboom92 2 ай бұрын
Chào bạn, tôi có thể xem sơ đồ đấu nối để nạp chương trình cho Cy8c21534 của bạn không, tôi đang nạp nhưng không được
@TempMep3aB4uk
@TempMep3aB4uk 2 ай бұрын
Спасибо. Доступно объясняете. Как раз то что и искал.👍
@torhristos115
@torhristos115 2 ай бұрын
А в чем может быть проблема если ввожу команды на включение и выключение 13го пина, примерно на 5й раз перестает работать? Спасибо
@user-kh6sr8tp1m
@user-kh6sr8tp1m 2 ай бұрын
важно для каких целей уметь программировать на Assembler ? Ответ не был дан
@Bezborodov_Nikolay
@Bezborodov_Nikolay 2 ай бұрын
Это что за фирма такая PIC?
@the_inevitability_of_stupidity
@the_inevitability_of_stupidity 2 ай бұрын
У меня почему то не работает printf
@user-wv1yz8cx3v
@user-wv1yz8cx3v 2 ай бұрын
Добрый день ! У меня почему то получается ошибка . : Error 1 Missing include file name. Ошибка 1. Отсутствует включаемое имя файла.
@user-hr9sb2fd6k
@user-hr9sb2fd6k 3 ай бұрын
вы полезный человек
@EdwardYamunaque
@EdwardYamunaque 3 ай бұрын
I like avr
@DAlexMaster
@DAlexMaster 3 ай бұрын
Если уйти от Ардуино и использовать взрослые IDE для написания программ на С/С++, то настраивая режимы оптимизации компилятора, мы получим почти такой же эффект, как от написания кода на ассемблере, а в некоторых случаях и лучше!
@user-kt5re4ul7y
@user-kt5re4ul7y 3 ай бұрын
Здравствуйте, а как прочитать-скопировать код с устройства
@Railerable
@Railerable 3 ай бұрын
Подскажите, пожалуйста, если у меня есть модуль hc-05 и мне нужно сделать его копию и перенести в другой купленный новый модуль hc-05, как-то можно настройки и прошивку из него скопировать со старого на новый?
@user-lw2wx2qb5z
@user-lw2wx2qb5z 3 ай бұрын
А МОЖНО БЛЯДЬ ЕЩЕ ПОБЫСТРЕЕ ? А ТО ЧТО ТО НЕ ПОНЯТНО
@Icanfly-
@Icanfly- 3 ай бұрын
Только людей в заблуждение вводите, на ESP32 и так два ядра работают, на одном FreeRTOS крутится на втором выполняется ардуиновская прослойка над ESP-IDF, все что вы сделали это запустили задачи на двух разных ядрах - смысла большого в этом нет так одно из ядер под операционку выделенно, можно только проблемы поиметь с ардуиновскими библиотеками которые ни как не учитывают многопоточность.
@user-cn9sh9md5e
@user-cn9sh9md5e 3 ай бұрын
А как настроить шим четыре канала с мертвым временем, для управления биполярным шаговым двигателем. МОжно дергать ноги в ручном режиме, но это не кашерно (хотя как вариант через ПДП или что-то в этом духе...). Если есть таймер с четырмя-шестью каналами, они как-то должны взаимодействовать?
@user-mb3gw1vg7y
@user-mb3gw1vg7y 3 ай бұрын
Прерывание раз в микросекунду, это жестоко. Особенно учитывая, что опрашивать датчик температуры нет никакого смысла чаще раза в секунду (и то много). Он и без прерываний прекрасно работает. Просто считыванием счётчика из таймера. Там достаточно большие допуски на времена. А вообще с этим ONE WIRE самое интересное начинается при подключении нескольких устройств на одну линию. (Если их адреса заранее не известны). Ну и CRC тоже специфически считается.
@user-sf9nn6dh2q
@user-sf9nn6dh2q 3 ай бұрын
А для esp8266 в среде Arduino, есть freertos?
@AlexanderRozhkov_
@AlexanderRozhkov_ 3 ай бұрын
да
@TheSoundshift
@TheSoundshift 4 ай бұрын
DHT22 - датчик влажности и температуры.
@AlexanderSuraev
@AlexanderSuraev 4 ай бұрын
Здравствуйте. Не подскажете, в чем может быть проблема. ESP32. описываем прерывание на 12 ноге attachInterrupt(digitalPinToInterrupt(12), prerivanie, RISING); само прерывание void prerivanie() { код исправно включает/гасит по кнопке на 12 ноге диод }, но вот вывод на индикатор 1602 в прерывании никак не происходит и измененные переменные из прерывания в основную программу не попадают . При попытке записать void IRAM_ATTR prerivanie() или же void ICACHE_RAM_ATTR prerivanie() выскакивает ошибка "void ICACHE_RAM_ATTR prerivanie()". Подозреваю что вывод на индикатор не идет, потому что использую библиотеку LiquidCrystal_I2C переменные которой не заявлены как volatile. Чем не нравятся IRAM_ATTR / ICACHE_RAM_ATTR и почему внутри прерывания не работает вывод на индикатор?
@slonbeskonechen8310
@slonbeskonechen8310 4 ай бұрын
ну а как во flash залить? и как дебажить из флеша?
@AlexanderRozhkov_
@AlexanderRozhkov_ 4 ай бұрын
Немного позже выпущу урок, сейчас ну ооочень занят.
@alekskapitonov2738
@alekskapitonov2738 4 ай бұрын
Спасибо большое!
@hakobhunanyan7153
@hakobhunanyan7153 4 ай бұрын
Ваши видео без фокуса
@user-ye8sd1ks5n
@user-ye8sd1ks5n 4 ай бұрын
Почти во всех Ваших скетчах идет цикл точки вместо соединения с WiFi. Так и в этом продолжается.
@AleksandrIvin
@AleksandrIvin 5 ай бұрын
А не пробовали wav файл таким образом проиграть?
@user-ty5px9hv5q
@user-ty5px9hv5q 5 ай бұрын
Почему то у меня программа атмел студио 7.0 не видит программатор. mkll
@user-yj7lh5rr9v
@user-yj7lh5rr9v 5 ай бұрын
Спасибо
@YangiyerBola
@YangiyerBola 5 ай бұрын
Циклы в разных местах расположены. Эксперимент не верен