Программирование микроконтроллеров для начинающих "урок 3"
HTML-код
- Опубликовано: 18 сен 2024
- Микроконтроллеры AVR для начинающих. Урок 3 тема: Битовые операции и особенности компилятора в atmel studio.
Поддержите проект: лайк и подписка будут лучшим стимулом развиваться!
БРАВО!!!! ВЫСОКАЯ ОПТИМИЗАЦИЯ!!!! а я голову ломал почему так код выполняется. Супер! Спасибо!!!
Изключително висок професионализъм, кратко, ясно и лаконично изложение! Благодаря! Успехи!
буквально на пальцах. Спасибо за ваши уроки, всё очень подробно и доступно.
Александр благодарю за уроки! Здорово у Вас получается!
спасибо что обращаете внимание на не понимание каких то вещей и розжовываете их более тчательно
Ну хоть один человек доступно разъяснил что это за крючочки с загагулинками. Прямо камень с плеч! ))) А то у всех "Ноль на ноль, нулем погоняет и АГА..." )))
А тут все понятно, даже для особо одаренных!!! ))))
Спасибо большое. )))
Супер! Больше никто это не объясняет!
Спасибо Александр, продолжай выкладывать подобные ролики.
Очень информативно, отличные уроки, даже слово "налаживаем" можно простить:) Спасибо)
огромное спасибо, очень доходчиво объясняете!
Спасибо за это видео.Наконе то до меня дошло.Не прошло и 2ух лет изучений)))нерегулярных
Спасибо огромное, реально доступно объяснил.
Спасибо тебе добрый человек!
Вам спасибо!
меня сегодня взяли на испытательный срок в одну фирму, сказал там что освою микроконтроллеры, но благодаря этим урокам вижу что нет) завтра не выйду на работу и не буду позориться, однозначный лайк!
Та ну. Если взяли однозначно нужно воспользоватся. Когда обучение происходит непосредственно с человеком, все намного проще. Все у вас получится, главное чтобы вам это нужно было.
Огромное Вам спасибо!
Спасибо за видео
Спасибо автору за большой труд, очень доходчиво, но вы иногда путаете и (or) от (and) или, например 3.24 мин. и т.д.
Александр, огромная просьба организуйте доступ к исходникам, код не весь можно разглядеть, а прогнать программку для усвоения материала сами понимаете необходимо. Это в принципе просьба и для других уроков. Если не очень сложно... За весь труд Большое спасибо.
Хорошо. А то вы не первый кто просит.
спасибо
4.14 эта команда выполняется одним действием, потому что эта операция является константой и компилятор её сразу же вычисляет и записывает в память для экономии ресурсов. А предыдущая операция разбита на несколько, покуда там работа с переменной происходит. Поправте если не прав.
Все правильно. Но на высоких оптимизациях все сложнее происходит.
@@АлександрПисанец значит вы хорошо преподаете информацию!
суперские видео, отличное объяснение. Но вот над грамотностью автору стоит поработать.
Круто, побольше бы такой информации. Более-менее разобрался в ардуино ИДЕ, но нужно переходить на этот уровень работы с МК. Все дошло, но есть вопрос: как работает if, в том смысле, она же булевая. А мы суем ей байт, делаем, например, PORTA | 0b00000101, ну пусть получим 0b11000101, так это что, правда или брехня?
Я немного запутался и хотел бы у Вас спросить: чем отличается Логическая операция "ИЛИ" от побитовой? То же самое не понятно с "И" и "НЕ".)
Александр, это опять я, извините :)
на 12:20 вы описываете работу конструкции if:
if ( (PINA | (1
Надо было в уроке этот момент поподробнее рассмотреть, мое упущение.
Представим что на РОRTA.0 = 0, PORTA.1 = 0.
1. (PINA | (1
Теперь понял, благодарю. Не учел ИЛИ в скобках.
Ну ничего, с регулярными выражениями когда-то разобрался, и с этим разберусь.
Александр Писанец Это получается что если в условии в скобках выходят все биты в 0 то лож, а если хоть один бит в 1 то истина? я правильно понял?
Да.
Александр Писанец а если в первом случае PINA = 0b11110000?т.е. истина - если на абсолютно любой ножке логическая еденица
может будет так:
if ( (PINA & (1
ИМХО стоило добавить, почему нельзя писать if(PORTA == (1
Александр Николаевич если вам не тродно сделайте пожалуйста урок по двум кнопкам с антидребезгом ( увиличение и уменшение переменной) без использования delay
В принципе, я уже подобное объяснял, в уроке по матричьной клавиатуре.
Все делается через таймер.
Программирование микроконтроллеров для начинающих "Урок13 матричная клавиатура"
Все это конечно прекрасно. Но опять же, приближение к какому то уровню понимания снова условно. Это похоже на то как если бы рассматривать молекулу, потом ее увеличить и увидеть в ней еще и атомы, а потом увеличить атомы и увидеть последний атом, а потом и его увеличить и увидеть атом и его электрон. Так вот на каком уровне приближения ведется рас сказ? Мне хотелось узнать последний, что происходит когда включается светодиод и как попалает на него напряжение. Скорее всего через включение транзистора, а как включается именно тот самый транзистор на том самом выходе? Почему напряжение попадает именно на него? И как напряжение связано с программой?
А происходит вот что:
Бешельме кешельме шайтана-ма!
С Наступившим!! Поборол я проблему с файлом .ELF. Это брэндмауэр "запрещал опасные действия этой программы"! (наверно, не без моей помощи!) Смотрю Ваши уроки по 10 раз! Отличные!! Ващето я не новичок в деле программирования, когда-то написал программу, которая решает задачи "Судоку" на Вижуал Бейсик! А на С++ не смог ни строчки! Вопросов к Вам тыщщи! Ну почему нельзя писать по-человечески?
S = 0b00110000;
S = 0b00110101;
После второй строки в переменной должно быть нужное!! Зачем эти головокружительные выкрутасы?? И ещё при инициализации можно написать просто: DDRB = 0b00011000; ?? Зачем это? : DDRB = 1
+Игорь Флейфле Вас также с новым годом. Сам когда начинал с ассемблера на си программировать тоже офигивал от всего ). Но это си, и знать как можно работать с битовыми операции нужно. А как и в каких вариантах вы будете использовать это уже решайте сами.
Для инициализации можно и так DDRB = 0b00011000, и так DDRB = 1
@@MrDacnick Доброго времени суток. А какие проблемы что бы сделать такую запись DDRB |= 0b00011000 и не трогаются остальные биты
@Дядя Федор при такой записи трогаются ВСЕ биты. Нулевые- тоже, просто это не очевидно. Хотя исходный ноль в бите при ней физически ПЕРЕЗАПИСЫВАЕТСЯ НУЛЕМ бита присваемого числа . Для инициализации - да, это без разницы- исходные то 00000000, вам надо только сввои единицы записать, нули при этом как были нулями,. так и останутся ими в результате операции А если там в ходе выполнения программы уже что-то полезное записано? Допустим 11100111 ? Правильно, сделав DDRB |= 0b00011000 сотрете его, записав в регистр 00011000. А так- DDRB = 1
@@MrDacnick DDRB = 0b00011000 вот такой записью да я сотру, а я вам написал про такую DDRB |= 0b00011000 вот такой записью я ни чего не сотру. Обратите внимание в перовом случае "=" а во втором "|=". Посмотрите листинг ассемблера в видео автора с 9:40. И да записью DDRB = 1
Александр а в С или Асме нет возможности напрямую работать с битом порта? Библиотека какая удобная или еще чего?
Допустим в ПЛК обычно сразу с переменной boolean типа работаю или in1, in2... out1, out2 как-то удобней так.
Момент оптимизации не особо волнует, а удобство чтения и понимания программы важней, сразу понятно, что эта нога включает допустим Мотор1, а не сидеть и лоб морщить вычисляя какой бит там по маске включился или сбросился.
Это все можно при помощи #define прописать.
Чтоб с битом как с булевой переменной работать? (читать\писать?)
Поискал, что-то нашел с километровыми простынями кода...
Если интересно, сделайте видео :)
Скорее всего все транзисторы уже пронумеровпны еще до того как на них попадет программа. Пронумерованы при создании. Программа это лишь нахождение совпадения или не совпадения. Включаем 5 бит на 10 контроллере, во 2 регистре. Вот откуда нарряжение знает что именно туда надо попасть и включить базу транзистора?
Александр, где В ПРОГРАММЕ видно что на порту "А" 6-й и 7-й бит выставлены в единицу (7:40 минута видео)?
На видео четко видно что в PORTА записывается результат побитовой операции ИЛИ в битах нулевом и втором. Результат этого действия - число 4 или 0b0000101
Охрана ВневедомственнаяЯ наглядно в видео принудительно установил данные биты в ручную.
Класный и полузнай урок! У вас случайно нету ссылки на хорошую инфу по инструкция для ассемблера? Есть какие нибудь хитрости и особености по оптимизации кода и будете ли вы делать по этому урок в будущем?
easyelectronics.ru/avr-uchebnyj-kurs-postanovka-zadachi.html
Для того чтобы применять разные хитрости. Нужно знать ассемблер. По поводу оптимизации вашей программы подготовлю материал, но это будет не скоро.
Здравствуйте ! Помогите найти человека который заменит и прошьет микро чип ATMEGA8A Au 1245 , стоит на зуботехническом сканере ,DD ARGUS M1. !!!!!?????
Александр добрый день!
Вы можете написать программку на заказ ? atmega 2560
Увы, нет времени
Спасибо за видео!
Вопрос. У меня при операциях s=s|2 и s=1|3 дизассемблер показал команды
s=s|2;
00000045 LDS R24,0x0060 Load direct from data space
00000047 LDS R25,0x0061 Load direct from data space
00000049 ORI R24,0x02 Logical OR with immediate
0000004A STS 0x0061,R25 Store direct to data space
0000004C STS 0x0060,R24 Store direct to data space
s=1|3;
0000004E LDI R24,0x03 Load immediate
0000004F LDI R25,0x00 Load immediate
00000050 STS 0x0061,R25 Store direct to data space
Что в два раза больше чем у Вас. Почему? (использую студию 6.2)
+Евгений Александров Возможно у вас оптимизация установлена на минимум OS0.
Создайте видео с нуля как работать в студии. Многого не понятно. Студия 6.2
Александр, здравствуйте !
int - 2 байта
char - 1 байт
Подскажите пожалуйста, как объявить переменную (зарезервировать место в памяти) для переменной более 2 байт
например если нужно считать до пару миллионов ??? (Например это таймер на 1 год)
uint32_t
Александр Писанец Большое СПАСИБО !
1. Подскажите, а где предел ? unit64_t unit96_t unit128_t
2. Я понял кратность 8 бит ?
3. И нужно ли подключать особую библиотеку ( кроме )
Извините , что отрываю Вас.
Я больше чем 64 не использовал. Насколько я знаю, не какой библиотеки не нужно подключать.
Александр Писанец Спасибо !
Дай Бог Вам крепкого здоровья !
Александр. Помогите решить такую задачу есть датчик температуры тс1047 в нем выход в вольтах от 0.1 до 1.75. Равно -40 до 125 грд цельсия 0.5в ето ноль градусов 0.6 ето 10 градусов и так далие .... я подключаю его к ацп настроеного на опорн напряжение 5 вольт как мне перевести напряжение с датчика в вывод градусов с шагом 0.1 градус
Нужно ацп запитать хотябы внутренним опорным 2,5в. Или через операционик усилить до 5B. Дискретность измерения на градус в битах больше будет. Простой способ это замерить напряжение 0.5В (0грд.) и 1.75(125грд.) с помощью АЦП.
Для примера 0.5В - 100бит 1.75 - 800бит 800 - 100 = 700 бит вся положительная температура. Узнаем сколько бит на 1грд. 700бит / 125грд= 5,6бит ( округляем до целого числа 56 )
Поскольку вы хотите определить температуру с шагом в 0.1грд. то
Для примера у вас значения АЦП = 564бит
(564 * 100 ) / 56 = 1007 (значения после запятой не в счет мы работаем с целыми числами компилятор уберет их сам). Разжалуем температуру 1007
1007 / 100 = 100грд и остаток 7 в итоге 100,7грд. Это все при условии линейности датчика.
Здравствуйте. Хочу спросить . Может ли зависнуть микроконтроллер при длительной роботе???Если может то есть ли кокой-то способ с этим бороться?
Микроконтроллеры avr для начинающих " Урок14 сторожевой таймер "
Александр Писанец
Спасибо.
(Я думал что все ваши уроки посмотрел оказалось что не все.)
На 3:00 при сложеии бинарных чисел, допущена ошибка: 00000010 + 00000011 =00000101
У вас получилось 00000011
Нет там никакой ошибки. Это не математическое сложение двоичных чисел, а побитовое ИЛИ. В данном случае выполняется операция ИЛИ между двумя нулевыми битами (результат будет 1), между двумя первыми битами (результат будет 1), между двумя 2,3,4,5,6 и 7 битами (результат будет 0).
Оператор ИЛИ:
X Y результат
O 0 0
0 1 1
1 0 1
1 1 1
Говорите одно а написано другое (в if).
В каком програме вы сделали эти видео уроки?
+Mica Zivkovic не в одной программе все делалось.
выполняется может она и быстро, а написать ее долго.
Во-первых, "накладывать", а не "налаживать". Во-вторых, у нас RISC-архитектура и любая команда выполняется за один такт.
Вы ошибаетесь, не любая команда выполняется за один такт.
Да, тут вы правы. Пришлось заглянуть в "Instruction Set Summary".
Можете объяснить? Пишу код:
#define F_CPU 8000000
#include
#include
int main(void)
{
DDRB |=(1
+Мальцева Ангелина
DDRC &=~(1
+Александр Писанец Получается, что высокий уровень на порту из за внутреннего подтянутого сопротивления, верно?
+Александр Писанец спасибо)) все, догнал
у меня в компеляторе
if (PINA & 3)
{S=2;}
выполняется і при PINA=1, PINA=2, PINA=3, это правильно???
Условие должно быть таким
if (PiNA & (1
Спасибо!
первый урок был просто бомба, второй не очень, этот вообще не обучает , а рассказывает что сам знает.... смысла смотреть следующие нету, придётся искать другие уроки
Да наверное видео полезные но не для меня, что то я походу туговат! пересмотрел кучю видео и всё равно не понимаю! Нууу чёта понял но это мелочи! вот скачать прошивку и залить её не сложно! а вот как свою схему разработать написать прогу, куда какие детали подпаять ну ни хрена не понимаю:( как эту стену тупизны пробить не знаю?:)
+vel ИЗМ Я делаю сайт там все подробно шаг за шагом буду описывать. К сожалению все очень мелено продвигается.
Александр Писанец и когда примерно будет? и где его найти? или видео выйдет о сайте? былобы не плохо посмотреть может тогда у меня всё упорядочится!!!
На данном этапе я изучаю как сделать сайт ).
Александр Писанец понятно! все что то изучают:) мне бы контроллеры изучить! да ещё с прогером разобраться TL866A так как бы разобрался прошивки сливал заливал! но вот вопрос все прошивают ардуиной и китайскими юсбишками! нету ли каких заковырок с моим прогером? по сути он выполняет роль загрузчика? и всё!
Я с таким не работал,возможно кто то и подскажет вам.
Ужас! Как же вдуплить то во всё это?! Из урока понятно, работаем так, сяк, но не понятно зачем. Как связать конкретную задачу с действиями? Вот самая трудная часть предмета. Понятно, как помигать диодом, а дальше? дальше связь с физикой теряется, начинается ахинея из "математических операций над бинарными числами". И Си, как писал один программист какой-то, это английский на китайском. То есть, учить Си, в его понимании, - это учить английский на китайском языке. По-моему, он прав.
помогите сделать генератор прямоугольных импульсов на 58кгц на avr . email yatam@tut.by
Дмитрий Тарасов берешь ногу, настраиваешь на выход, переводишь в 1, делаешь задержку в 17 микросекунд, переводишь в 0, такую же задержку, все это в бесконечном цикле. Так же как светодиодом мигаешь, только чаще. Если скважность нужно регулировать, то меняешь величины задержек так, чтобы сумма была та же, а сами задержки разные.
простите у меня чет мозг взрывается:
if ((PINA|(1
У меня у самого, когда с ассемблера на си переходил мозг выносила :). Там есть заморочка, надо самому вспомнить, как там все происходит давно это уже было. Как разберусь, обязательно напишу.
Я уже решил проблему прогнал в симуляторе 4 варианта. Код рабочий. Это я чет путаю.
Vitali Mitko Все правильно получается, если на порту А 0b11101000, то соответственно числа будут 0b11101001 и 0b11101010 после логического ИЛИ, они не равны. А если 0b11101011 то числа после логического ИЛИ не изменятся и будут равны, что и требуется проверить. BREQ не проверяет на идентичность. Эта команда просто проверяет флаг Z в регистре SREG, а флаг там устанавливается после команды AND над этими числами и устанавливается только в случае их равенства. А вот второй вариант ассемблерный гораздо интереснее. Почему на ассемблере появился регистр R25 в который записали 0, а потом сравнили с 0...очень любопытно...какие-то бессмысленные действия)) Потому и вариант длиннее стал на ровном месте.
Спасибо за видео