Видеокурс по AVR микроконтроллерам - Урок 4

preview_player
Показать описание
Микроконтроллеры для начинающих.
Тема очередного урока - регистровый сдвиг. Основы сдвига, операторы, работа с регистром PIN-порта, рекомендации.
Симуляция в Proteus.
Тема поддержки уроков находится на форуме сайта Паяльник в разделе "МК для начинающих".
Рекомендации по теме
Комментарии
Автор

Всё предыдущие изложение было четко соединено в цепочку взаимосвязанных и последовательно излагаемых принципов и понятий, а вот на “PCO” её разорвали. Что это? Константа? Переменная? Почему не работает PINC0 == 1? В чем ошибка?

seriga
Автор

Здравствуйте. Я конечно извиняюсь, но по-моему Вы с подтягивающим резистором напутали. Подключили аж два вместо одного. Один подтягивающий к ПИТАНИЮ (встроенный в микроконтроллер) подключили программно, а второй подтягивающий к ЗЕМЛЕ подключили физически. Вроде как конфликт на порту получается... Или я ошибаюсь?

P.S. А заработало, т.к. номинал у подтягивающего резистора к земле был меньше (220 Ом), чем у встроенного в микроконтроллер (20 КОм) и земля просто пересилила.

JekaM
Автор

В общем так никто и не понял, зачем сдвиг в условии и как это вообще работает. Один из важнейших моментов остался не объяснённым. А остальное смотреть скучно. Не очень удачное видио.

ffsrqrl
Автор

Чесс слово, нифигище не понятно. Прокручиваю 26 минуту 48 раз, но так и не даю дупля зачем использовать в обычном условии сдвиг регистра. Почему сдвиг влево, а не вправо?  ЗЫ. У Вас очень интересные видео и мне они очень помогли, но завяления типа Вам тут никто ничего, звучат как " да пошли вы!". Обычно когда меня спрашивают и я знаю ответ, то я объясню, а не скажу идти в гугл.

Avrora
Автор

В выражении if((PINC & (1<<PC0)) == 1)  PC0-встроеная переменная=0. 1<<PC0  это сдвигается влево на 0 и получается то-же число Если кнопку нажали, операция & дает 1(TRUE) и получается PORTB=0xFF;
Если хотим использовать 2 регистр порта С, то if((PINC & (1<<PC1)) == 2) двойка появляется, т.к.в результате сравнения получается

barok
Автор

Поскольку нас интерсует сигнал на 1 регистре порта С, надо пренебречь состояниями других регистров порта. В выражении if((PINC & (1<<0)) == 1) число (1<<0)  и PINC & (1<<0) =0 если в первом бите=0, и =1 если в 1 бите=1. То что надо. PC0-константа=0, PC1-константа=1. и т.д. Они не зависят от состояния порта.

barok
Автор

PC0=0, запись 1<<PC0 равнозначна 1<<0, то есть сдвиг значения "1" в 0-й разряд регистра
В условии проверяется наличие тождественности конъюнкции("И") между PINC и значением сдвигового оператора (1<<PC0(=0)) То есть наличие единицы в 0-м разряде регистра PINC.
Не следует забывать что число-единица в операторе (1<<PCO) по умолчанию десятичная, следовательно
запись, например, 7<<N обозначает сдвиг двоичного представления числа 7(=111) на N позиций
Например: ch=7<<0; ch станет

SWDLAV
Автор

Круто, но с if (PINC & (1<<PC0) ) хотелось бы более подробно узнать что и как. Думаю многим будет полезно. Может отдельно видео сделать ?

IgorSwxy
Автор

непонятно, значение в скобках 1 << PCO будет означать сдвинуть 1 на значение на ножке PCO так чтоли? ну и что получается. "не будет работать PINCO ==0" а почему? объясняйте нормально.

pavelv
Автор

11:26 У Вас в настройках GCC стоит оптимизация типа О1. Чтобы программа в памяти контроллера занимала меньше объем нужно поставить в настройках оптимизации типа О3.

oopsblade
Автор

автор, конечно, не программист. )) это сразу видно. )) но за вводные в работе с контроллером спасибо!

zhuk
Автор

Покажите пожалуйста а как написать код что бы при первом нажатии на кнопку светодиоды включались, а при втором нажатии выключались та далее.

ipvbvwz
Автор

Работаю в Amtel Studio 7 там вообще PC0 нету, компилятор на строку с этой переменной ругается

lejlbxg
Автор

Ребята, насчет резистора у кнопки. я бы посоветовал поменять местами Power и Ground, поставить между power-ом и пином резистор на 1 или 2 килоом, следовательно кнопка уже идет с Ground-a и Условие нужно поменять с единицы на ноль "if (PINC==0) PORTB=1;" -- таким образом у нас никогда не будет короткого замыкания

Pepsiismylifeyo
Автор

Так можно тоже:  if((PINC & ==
проверяется 0 регистр порта. 
if((PINC & ==  true, если 1 и 2 регистры=1.
if((PINC == в любом регистре порта С будет 1, то false.

barok
Автор

Интересное видео. Подскажите пожалуйста как при помощи 1 нажатия кнопки включить в единицу порт на светодиод и оставить его включенным . при отпускании кнопки порт остался в единице . Если нельзя написать программу дайте хотя бы подсказку . Что использовать регистры, операторы или что то ещё ? Заранее спасибо.

vovanstukov
Автор

почему на ATMEGA 328P delay (1000) идет 7 секунд в протеусе. ?

alexg
Автор

Тема с кнопкой подробно обсуждалась на форуме. 
В данном уроке нас интересовал принцип по сему такими мелочами мы жертвовали. В конце курса мы будем собирать готовое устройство где этот момент уже будет освещен. То есть в данном контексте мы разибрались с принцыпами работы а не схемотехникой. :)

kobzarcheg
Автор

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

ezilmzv
Автор

2:25 правильно будет «на 4 регистра»? То есть, если сдвигаем R0, то всё попадает в R4? А для ячеек памяти как?

brawaga