Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

1 76 Часть 11. Программирование микроконтроллеров АVR на ассемблере сконфигурирован на выход, то единица появится непосредственно на соответст­ вующем выводе микросхемы, если на вход, то эта операция управляет подключе­ нием «подтягивающего» резистора. Надо только не забывать, что непосредственная установка битов с помощью этих команд возможна лишь для первых 32 регистров из всего массива РВВ с адресами не старше $ 1 F (адреса проще всего посмотреть в соответствующем i пс - файле либо в описании, где есть раздел под названием Register Summary, - подробнее об этом рассказано далее, в разд. «Команды пере­ сылки данных») . Для остальных требуется несколько иная операция, которая также будет рассмотрена чуть позже . Гораздо сложнее действуют команды установки битов в регистрах общего назначе­ ния - взгляните на листинг 7.6, где имеется команда sbr Flag , оьо о о 1 0 0 0 0 , уста­ навливающая бит номер 4 в единицу. Почему так сложно, да еще и в двоичной сис­ теме? Дело в том, что эти команды просто осуществляют логическую операцию между значением регистра и заданным числом размером в байт, который в этом случае называют битовой маской. По сути это те же логические операции, что и в предыдущем разделе, только названные иначе: так, указанная команда расшифро­ вывается как Flag OR оьо о о 1 0 0 0 0 . Понятно, почему предпочтительно двоичное представление маски -так легче отсчитывать биты. Аналогично работает команда сброса бита cbr Flag , оьо о о 1 0 0 0 0 . Только для того чтобы ее можно было записывать в точности в том же виде, что и sbr, логическая операция, которую она осуществляет, сложнее: Flag AND ( NOT оьо о о 1 0 0 0 0 ) . Здесь сначала в маске инвертируются все биты, а затем полученное число и значение регистра комбинируются операцией логического умножения (а не сложения, как в предыдущем случае). В результате четвертый бит обнулится обязательно, а все остальные останутся в неприкосновенности. ПОДРОБНОСТИ Причем , если предыдущую операцию sbr можно просто заменить на ori (у них даже совпадают коды операций , т. е. это синонимы одной и той же команды) , то сьr заме­ нить напрямую на ancti не получается , тогда придется записать ее следующим обра­ зом : ancti Flag, - ( oь o o o 1 0 0 0 0 ) - где «-» есть заимствованный из С символ Поразряд­ ное НЕ . Но сами команды cbr и ancti также являются синонимами (у них тоже совпа­ дают коды операций) , откуда следует вывод, что операцию инверсии маски осуществляет компилятор заранее, когда встречает команду cbr вместо ancti . Не следует забывать об этой разнице : в sЬi / cЬi задается номер бита, а sbr / cьr - битовая маска. В программе нажатия кнопки по таймеру (см. листинг 6 . 1 7 в гла­ ве 6) вы встречали команду sbr Flag , 1, которая для наглядности может быть пере­ писана так: sbr Flag , оьо о о о о о о 1 . Здесь сразу видно, что эта команда устанавливает бит номер о. В то же время имеющаяся там же команда sbrs Flag , о проверяет этот бит именно по номеру. Я и сам до сих пор попадаюсь на том, что в случае необхо­ димости обнуления бита 1 в рабочем регистре temp записываю cbr temp , 1 (анало­ гично верной команде сЬi Portв , 1 ) , хотя такая операция обнулит в temp не первый бит, а нулевой. А операция сьr R , о (как и sbr R , о ) вообще ничего не делает, и такая запись бессмысленна.

RkJQdWJsaXNoZXIy MTExODQxMg==