Программирование микроконтроллеров для начинающих "урок 3"

Поделиться
HTML-код
  • Опубликовано: 18 сен 2024
  • Микроконтроллеры AVR для начинающих. Урок 3 тема: Битовые операции и особенности компилятора в atmel studio.
    Поддержите проект: лайк и подписка будут лучшим стимулом развиваться!

Комментарии • 114

  • @vasiapupkin9869
    @vasiapupkin9869 7 лет назад +2

    БРАВО!!!! ВЫСОКАЯ ОПТИМИЗАЦИЯ!!!! а я голову ломал почему так код выполняется. Супер! Спасибо!!!

  • @user-yz2my6kp5i
    @user-yz2my6kp5i 6 лет назад +1

    Изключително висок професионализъм, кратко, ясно и лаконично изложение! Благодаря! Успехи!

  • @MAGDEBACH
    @MAGDEBACH 8 лет назад +4

    буквально на пальцах. Спасибо за ваши уроки, всё очень подробно и доступно.

  • @firstrobot3870
    @firstrobot3870 10 лет назад +4

    Александр благодарю за уроки! Здорово у Вас получается!

  • @vitalyivanov7228
    @vitalyivanov7228 2 года назад

    спасибо что обращаете внимание на не понимание каких то вещей и розжовываете их более тчательно

  • @interoad
    @interoad 6 лет назад +1

    Ну хоть один человек доступно разъяснил что это за крючочки с загагулинками. Прямо камень с плеч! ))) А то у всех "Ноль на ноль, нулем погоняет и АГА..." )))
    А тут все понятно, даже для особо одаренных!!! ))))
    Спасибо большое. )))

  • @pavelv3913
    @pavelv3913 10 лет назад +3

    Супер! Больше никто это не объясняет!

  • @goodwin039
    @goodwin039 6 лет назад +1

    Спасибо Александр, продолжай выкладывать подобные ролики.

  • @xJerubbaalx
    @xJerubbaalx 6 лет назад +1

    Очень информативно, отличные уроки, даже слово "налаживаем" можно простить:) Спасибо)

  • @nikolaiutemov7985
    @nikolaiutemov7985 7 лет назад +2

    огромное спасибо, очень доходчиво объясняете!

  • @ЛёхаГагарин-э5ч
    @ЛёхаГагарин-э5ч 7 лет назад +1

    Спасибо за это видео.Наконе то до меня дошло.Не прошло и 2ух лет изучений)))нерегулярных

  • @a_annaev
    @a_annaev 8 лет назад +1

    Спасибо огромное, реально доступно объяснил.

  • @ДмитрийНосатый
    @ДмитрийНосатый 8 лет назад +2

    Спасибо тебе добрый человек!

  • @maxforte4508
    @maxforte4508 8 лет назад

    меня сегодня взяли на испытательный срок в одну фирму, сказал там что освою микроконтроллеры, но благодаря этим урокам вижу что нет) завтра не выйду на работу и не буду позориться, однозначный лайк!

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад +1

      Та ну. Если взяли однозначно нужно воспользоватся. Когда обучение происходит непосредственно с человеком, все намного проще. Все у вас получится, главное чтобы вам это нужно было.

  • @olegshcherban9697
    @olegshcherban9697 8 лет назад +1

    Огромное Вам спасибо!

  • @АлександрМирошник-о7ч

    Спасибо за видео

  • @ЕкатеринаАнуфриева-ф1ы

    Спасибо автору за большой труд, очень доходчиво, но вы иногда путаете и (or) от (and) или, например 3.24 мин. и т.д.

  • @aleksandrkryukov1821
    @aleksandrkryukov1821 10 лет назад

    Александр, огромная просьба организуйте доступ к исходникам, код не весь можно разглядеть, а прогнать программку для усвоения материала сами понимаете необходимо. Это в принципе просьба и для других уроков. Если не очень сложно... За весь труд Большое спасибо.

  • @БорисКоротков-э6и
    @БорисКоротков-э6и 7 лет назад +2

    спасибо

  • @user-xw4nh5dv6h
    @user-xw4nh5dv6h 3 года назад

    4.14 эта команда выполняется одним действием, потому что эта операция является константой и компилятор её сразу же вычисляет и записывает в память для экономии ресурсов. А предыдущая операция разбита на несколько, покуда там работа с переменной происходит. Поправте если не прав.

    • @АлександрПисанец
      @АлександрПисанец  3 года назад

      Все правильно. Но на высоких оптимизациях все сложнее происходит.

    • @user-xw4nh5dv6h
      @user-xw4nh5dv6h 3 года назад

      @@АлександрПисанец значит вы хорошо преподаете информацию!

  • @manor_by_programmer
    @manor_by_programmer 9 лет назад +2

    суперские видео, отличное объяснение. Но вот над грамотностью автору стоит поработать.

  • @ИмяФамилия-э4ф7в
    @ИмяФамилия-э4ф7в 6 лет назад

    Круто, побольше бы такой информации. Более-менее разобрался в ардуино ИДЕ, но нужно переходить на этот уровень работы с МК. Все дошло, но есть вопрос: как работает if, в том смысле, она же булевая. А мы суем ей байт, делаем, например, PORTA | 0b00000101, ну пусть получим 0b11000101, так это что, правда или брехня?

  • @MastrksXTV
    @MastrksXTV 8 лет назад +1

    Я немного запутался и хотел бы у Вас спросить: чем отличается Логическая операция "ИЛИ" от побитовой? То же самое не понятно с "И" и "НЕ".)

  • @dmitrynazarov9922
    @dmitrynazarov9922 10 лет назад

    Александр, это опять я, извините :)
    на 12:20 вы описываете работу конструкции if:
    if ( (PINA | (1

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад

      Надо было в уроке этот момент поподробнее рассмотреть, мое упущение.
      Представим что на РОRTA.0 = 0, PORTA.1 = 0.
      1. (PINA | (1

    • @dmitrynazarov9922
      @dmitrynazarov9922 10 лет назад

      Теперь понял, благодарю. Не учел ИЛИ в скобках.
      Ну ничего, с регулярными выражениями когда-то разобрался, и с этим разберусь.

    • @LiminP
      @LiminP 10 лет назад

      Александр Писанец Это получается что если в условии в скобках выходят все биты в 0 то лож, а если хоть один бит в 1 то истина? я правильно понял?

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад

      Да.

    • @demonspel
      @demonspel 9 лет назад +3

      Александр Писанец а если в первом случае PINA = 0b11110000?т.е. истина - если на абсолютно любой ножке логическая еденица
      может будет так:
      if ( (PINA & (1

  • @wAnubiSw
    @wAnubiSw 10 лет назад +1

    ИМХО стоило добавить, почему нельзя писать if(PORTA == (1

  • @ericsson3507
    @ericsson3507 10 лет назад

    Александр Николаевич если вам не тродно сделайте пожалуйста урок по двум кнопкам с антидребезгом ( увиличение и уменшение переменной) без использования delay

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад

      В принципе, я уже подобное объяснял, в уроке по матричьной клавиатуре.
      Все делается через таймер.
      Программирование микроконтроллеров для начинающих "Урок13 матричная клавиатура"

  • @Trikster567
    @Trikster567 2 года назад

    Все это конечно прекрасно. Но опять же, приближение к какому то уровню понимания снова условно. Это похоже на то как если бы рассматривать молекулу, потом ее увеличить и увидеть в ней еще и атомы, а потом увеличить атомы и увидеть последний атом, а потом и его увеличить и увидеть атом и его электрон. Так вот на каком уровне приближения ведется рас сказ? Мне хотелось узнать последний, что происходит когда включается светодиод и как попалает на него напряжение. Скорее всего через включение транзистора, а как включается именно тот самый транзистор на том самом выходе? Почему напряжение попадает именно на него? И как напряжение связано с программой?

    • @Valeriy1509
      @Valeriy1509 6 месяцев назад

      А происходит вот что:
      Бешельме кешельме шайтана-ма!

  • @ИгорьФлейфле
    @ИгорьФлейфле 8 лет назад

    С Наступившим!! Поборол я проблему с файлом .ELF. Это брэндмауэр "запрещал опасные действия этой программы"! (наверно, не без моей помощи!) Смотрю Ваши уроки по 10 раз! Отличные!! Ващето я не новичок в деле программирования, когда-то написал программу, которая решает задачи "Судоку" на Вижуал Бейсик! А на С++ не смог ни строчки! Вопросов к Вам тыщщи! Ну почему нельзя писать по-человечески?
    S = 0b00110000;
    S = 0b00110101;
    После второй строки в переменной должно быть нужное!! Зачем эти головокружительные выкрутасы?? И ещё при инициализации можно написать просто: DDRB = 0b00011000; ?? Зачем это? : DDRB = 1

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      +Игорь Флейфле Вас также с новым годом. Сам когда начинал с ассемблера на си программировать тоже офигивал от всего ). Но это си, и знать как можно работать с битовыми операции нужно. А как и в каких вариантах вы будете использовать это уже решайте сами.

    • @MrDacnick
      @MrDacnick 6 лет назад +1

      Для инициализации можно и так DDRB = 0b00011000, и так DDRB = 1

    • @ДимаДимов-в6п
      @ДимаДимов-в6п 5 лет назад

      @@MrDacnick Доброго времени суток. А какие проблемы что бы сделать такую запись DDRB |= 0b00011000 и не трогаются остальные биты

    • @MrDacnick
      @MrDacnick 5 лет назад +1

      @Дядя Федор при такой записи трогаются ВСЕ биты. Нулевые- тоже, просто это не очевидно. Хотя исходный ноль в бите при ней физически ПЕРЕЗАПИСЫВАЕТСЯ НУЛЕМ бита присваемого числа . Для инициализации - да, это без разницы- исходные то 00000000, вам надо только сввои единицы записать, нули при этом как были нулями,. так и останутся ими в результате операции А если там в ходе выполнения программы уже что-то полезное записано? Допустим 11100111 ? Правильно, сделав DDRB |= 0b00011000 сотрете его, записав в регистр 00011000. А так- DDRB = 1

    • @ДимаДимов-в6п
      @ДимаДимов-в6п 5 лет назад

      @@MrDacnick DDRB = 0b00011000 вот такой записью да я сотру, а я вам написал про такую DDRB |= 0b00011000 вот такой записью я ни чего не сотру. Обратите внимание в перовом случае "=" а во втором "|=". Посмотрите листинг ассемблера в видео автора с 9:40. И да записью DDRB = 1

  • @alexcafpir8166
    @alexcafpir8166 8 лет назад

    Александр а в С или Асме нет возможности напрямую работать с битом порта? Библиотека какая удобная или еще чего?
    Допустим в ПЛК обычно сразу с переменной boolean типа работаю или in1, in2... out1, out2 как-то удобней так.
    Момент оптимизации не особо волнует, а удобство чтения и понимания программы важней, сразу понятно, что эта нога включает допустим Мотор1, а не сидеть и лоб морщить вычисляя какой бит там по маске включился или сбросился.

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      Это все можно при помощи #define прописать.

    • @alexcafpir8166
      @alexcafpir8166 8 лет назад

      Чтоб с битом как с булевой переменной работать? (читать\писать?)
      Поискал, что-то нашел с километровыми простынями кода...
      Если интересно, сделайте видео :)

  • @Trikster567
    @Trikster567 2 года назад

    Скорее всего все транзисторы уже пронумеровпны еще до того как на них попадет программа. Пронумерованы при создании. Программа это лишь нахождение совпадения или не совпадения. Включаем 5 бит на 10 контроллере, во 2 регистре. Вот откуда нарряжение знает что именно туда надо попасть и включить базу транзистора?

  • @ОхранаВневедомственная

    Александр, где В ПРОГРАММЕ видно что на порту "А" 6-й и 7-й бит выставлены в единицу (7:40 минута видео)?
    На видео четко видно что в PORTА записывается результат побитовой операции ИЛИ в битах нулевом и втором. Результат этого действия - число 4 или 0b0000101

    • @АлександрПисанец
      @АлександрПисанец  9 лет назад

      Охрана ВневедомственнаяЯ наглядно в видео принудительно установил данные биты в ручную.

  • @nagirich
    @nagirich 10 лет назад

    Класный и полузнай урок! У вас случайно нету ссылки на хорошую инфу по инструкция для ассемблера? Есть какие нибудь хитрости и особености по оптимизации кода и будете ли вы делать по этому урок в будущем?

    • @electronics_is_easy
      @electronics_is_easy 10 лет назад

      easyelectronics.ru/avr-uchebnyj-kurs-postanovka-zadachi.html

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад

      Для того чтобы применять разные хитрости. Нужно знать ассемблер. По поводу оптимизации вашей программы подготовлю материал, но это будет не скоро.

  • @magamedalbakov8650
    @magamedalbakov8650 5 лет назад

    Здравствуйте ! Помогите найти человека который заменит и прошьет микро чип ATMEGA8A Au 1245 , стоит на зуботехническом сканере ,DD ARGUS M1. !!!!!?????

  • @Алексей-б8щ6й
    @Алексей-б8щ6й 8 лет назад +1

    Александр добрый день!
    Вы можете написать программку на заказ ? atmega 2560

  • @ЕвгенийАлександров-и9я

    Спасибо за видео!
    Вопрос. У меня при операциях 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)

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      +Евгений Александров Возможно у вас оптимизация установлена на минимум OS0.

  • @123MarkII
    @123MarkII 8 лет назад +1

    Создайте видео с нуля как работать в студии. Многого не понятно. Студия 6.2

  • @Prostoslojnom
    @Prostoslojnom 8 лет назад

    Александр, здравствуйте !
    int - 2 байта
    char - 1 байт
    Подскажите пожалуйста, как объявить переменную (зарезервировать место в памяти) для переменной более 2 байт
    например если нужно считать до пару миллионов ??? (Например это таймер на 1 год)

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      uint32_t

    • @Prostoslojnom
      @Prostoslojnom 8 лет назад

      Александр Писанец Большое СПАСИБО !
      1. Подскажите, а где предел ? unit64_t unit96_t unit128_t
      2. Я понял кратность 8 бит ?
      3. И нужно ли подключать особую библиотеку ( кроме )
      Извините , что отрываю Вас.

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      Я больше чем 64 не использовал. Насколько я знаю, не какой библиотеки не нужно подключать.

    • @Prostoslojnom
      @Prostoslojnom 8 лет назад

      Александр Писанец Спасибо !
      Дай Бог Вам крепкого здоровья !

  • @ericsson3507
    @ericsson3507 10 лет назад

    Александр. Помогите решить такую задачу есть датчик температуры тс1047 в нем выход в вольтах от 0.1 до 1.75. Равно -40 до 125 грд цельсия 0.5в ето ноль градусов 0.6 ето 10 градусов и так далие .... я подключаю его к ацп настроеного на опорн напряжение 5 вольт как мне перевести напряжение с датчика в вывод градусов с шагом 0.1 градус

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад +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грд. Это все при условии линейности датчика.

  • @КоляЛев-й1в
    @КоляЛев-й1в 10 лет назад

    Здравствуйте. Хочу спросить . Может ли зависнуть микроконтроллер при длительной роботе???Если может то есть ли кокой-то способ с этим бороться?

    • @АлександрПисанец
      @АлександрПисанец  10 лет назад

      Микроконтроллеры avr для начинающих " Урок14 сторожевой таймер "

    • @КоляЛев-й1в
      @КоляЛев-й1в 10 лет назад

      Александр Писанец
      Спасибо.
      (Я думал что все ваши уроки посмотрел оказалось что не все.)

  • @fuchsi3965
    @fuchsi3965 2 года назад

    На 3:00 при сложеии бинарных чисел, допущена ошибка: 00000010 + 00000011 =00000101
    У вас получилось 00000011

    • @Valeriy1509
      @Valeriy1509 Год назад

      Нет там никакой ошибки. Это не математическое сложение двоичных чисел, а побитовое ИЛИ. В данном случае выполняется операция ИЛИ между двумя нулевыми битами (результат будет 1), между двумя первыми битами (результат будет 1), между двумя 2,3,4,5,6 и 7 битами (результат будет 0).
      Оператор ИЛИ:
      X Y результат
      O 0 0
      0 1 1
      1 0 1
      1 1 1

  • @KONARTIK1
    @KONARTIK1 4 года назад +1

    Говорите одно а написано другое (в if).

  • @micazivkovic8403
    @micazivkovic8403 8 лет назад

    В каком програме вы сделали эти видео уроки?

  • @vedgray9773
    @vedgray9773 7 лет назад +1

    выполняется может она и быстро, а написать ее долго.

  • @nickolaysosnitsky3420
    @nickolaysosnitsky3420 3 года назад

    Во-первых, "накладывать", а не "налаживать". Во-вторых, у нас RISC-архитектура и любая команда выполняется за один такт.

    • @АлександрПисанец
      @АлександрПисанец  3 года назад

      Вы ошибаетесь, не любая команда выполняется за один такт.

    • @nickolaysosnitsky3420
      @nickolaysosnitsky3420 3 года назад

      Да, тут вы правы. Пришлось заглянуть в "Instruction Set Summary".

  • @СамойловаАнгелина

    Можете объяснить? Пишу код:
    #define F_CPU 8000000
    #include
    #include
    int main(void)
    {
    DDRB |=(1

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      +Мальцева Ангелина
      DDRC &=~(1

    • @narodable
      @narodable 8 лет назад

      +Александр Писанец Получается, что высокий уровень на порту из за внутреннего подтянутого сопротивления, верно?

    • @narodable
      @narodable 8 лет назад

      +Александр Писанец спасибо)) все, догнал

  • @tarassh01
    @tarassh01 7 лет назад

    у меня в компеляторе
    if (PINA & 3)
    {S=2;}
    выполняется і при PINA=1, PINA=2, PINA=3, это правильно???

  • @tuentinqarantin4504
    @tuentinqarantin4504 3 года назад +1

    первый урок был просто бомба, второй не очень, этот вообще не обучает , а рассказывает что сам знает.... смысла смотреть следующие нету, придётся искать другие уроки

  • @vel586
    @vel586 8 лет назад

    Да наверное видео полезные но не для меня, что то я походу туговат! пересмотрел кучю видео и всё равно не понимаю! Нууу чёта понял но это мелочи! вот скачать прошивку и залить её не сложно! а вот как свою схему разработать написать прогу, куда какие детали подпаять ну ни хрена не понимаю:( как эту стену тупизны пробить не знаю?:)

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      +vel ИЗМ Я делаю сайт там все подробно шаг за шагом буду описывать. К сожалению все очень мелено продвигается.

    • @vel586
      @vel586 8 лет назад

      Александр Писанец и когда примерно будет? и где его найти? или видео выйдет о сайте? былобы не плохо посмотреть может тогда у меня всё упорядочится!!!

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      На данном этапе я изучаю как сделать сайт ).

    • @vel586
      @vel586 8 лет назад

      Александр Писанец понятно! все что то изучают:) мне бы контроллеры изучить! да ещё с прогером разобраться TL866A так как бы разобрался прошивки сливал заливал! но вот вопрос все прошивают ардуиной и китайскими юсбишками! нету ли каких заковырок с моим прогером? по сути он выполняет роль загрузчика? и всё!

    • @АлександрПисанец
      @АлександрПисанец  8 лет назад

      Я с таким не работал,возможно кто то и подскажет вам.

  • @homeengineering876
    @homeengineering876 5 лет назад

    Ужас! Как же вдуплить то во всё это?! Из урока понятно, работаем так, сяк, но не понятно зачем. Как связать конкретную задачу с действиями? Вот самая трудная часть предмета. Понятно, как помигать диодом, а дальше? дальше связь с физикой теряется, начинается ахинея из "математических операций над бинарными числами". И Си, как писал один программист какой-то, это английский на китайском. То есть, учить Си, в его понимании, - это учить английский на китайском языке. По-моему, он прав.

  • @ДмитрийТарасов-в5р

    помогите сделать генератор прямоугольных импульсов на 58кгц на avr . email yatam@tut.by

    • @ИмяФамилия-э4ф7в
      @ИмяФамилия-э4ф7в 6 лет назад

      Дмитрий Тарасов берешь ногу, настраиваешь на выход, переводишь в 1, делаешь задержку в 17 микросекунд, переводишь в 0, такую же задержку, все это в бесконечном цикле. Так же как светодиодом мигаешь, только чаще. Если скважность нужно регулировать, то меняешь величины задержек так, чтобы сумма была та же, а сами задержки разные.

  • @vitalimitko5168
    @vitalimitko5168 9 лет назад

    простите у меня чет мозг взрывается:
    if ((PINA|(1

    • @АлександрПисанец
      @АлександрПисанец  9 лет назад

      У меня у самого, когда с ассемблера на си переходил мозг выносила :). Там есть заморочка, надо самому вспомнить, как там все происходит давно это уже было. Как разберусь, обязательно напишу.

    • @vitalimitko5168
      @vitalimitko5168 9 лет назад

      Я уже решил проблему прогнал в симуляторе 4 варианта. Код рабочий. Это я чет путаю.

    • @ВарвЙо
      @ВарвЙо 9 лет назад

      Vitali Mitko Все правильно получается, если на порту А 0b11101000, то соответственно числа будут 0b11101001 и 0b11101010 после логического ИЛИ, они не равны. А если 0b11101011 то числа после логического ИЛИ не изменятся и будут равны, что и требуется проверить. BREQ не проверяет на идентичность. Эта команда просто проверяет флаг Z в регистре SREG, а флаг там устанавливается после команды AND над этими числами и устанавливается только в случае их равенства. А вот второй вариант ассемблерный гораздо интереснее. Почему на ассемблере появился регистр R25 в который записали 0, а потом сравнили с 0...очень любопытно...какие-то бессмысленные действия)) Потому и вариант длиннее стал на ровном месте.

  • @XAngelsLifeX
    @XAngelsLifeX 8 лет назад +1

    Спасибо за видео