Ревич, Ю.В. Программирование микроконтроллеров 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 , о ) вообще ничего не делает, и такая запись бессмысленна.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==