Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
1 72 Часть //. Программирование микроконтроллеров АVR на ассемблере Разобравшийся в алгоритме читатель уже, конечно, задает вопрос - а как обеспе чить цикличность? В Arduino вы, без сомнения, использовали бы delay ( ) , а в ас семблере подобный код грамотней всего включить в обработчик события по тайме ру с секундным, например, интервалом (хотя, конечно, можно и использовать про стые задержки, как в процедурах для кнопки в предыдущей главе). Но с таймерами мы будем еще разбираться дополнительно, потому полного кода примера я пока не привожу- просто посмотрим, как реализовывается в АVR собственно алгоритм (листинг 7.6) . sbrs Flag , 3 ; если флаг 3 стоит , rjmp dark ; иначе будем гасить sbrs Flag , 4 ; если флаг 4 стоит, rjmp set4 ; иначе красным cbr Flag , ObO O O l O O O O ; следующий cbi PortD , 7 ; гасим красный sbi PortB , O ; горим зеленым rjmp continue ; все готово будем мигать будем гореть зеленым раз горим красным set4 : ; если флаг 4 не стоит , будем гореть красным sbr Flag , ObO O O l O O O O ; следующий раз горим зеленым cbi PortB , 0 ; гасим зеленый sbi PortD , 7 ; горим красным rjmp continue ; все готово dark : cbi PortB , 0 ; гасим оба cbl PortD , 7 continue : В архиве программ для этой книги, расположенном по указанному во введении ад ресу, вы найдете демовариант реализации этого алгоритма с использованием ТimerO (файл migal ka_var1 .asm). Попробовав его, подумайте заодно над вопросом: почему там не задано никаких предварительных значений для регистра Count_time, отмеряющего задержку? Это непосредственно связано с темой предыдущего разде ла о командах передачи управления. С используемыми здесь командами установки и сброса отдельных битов ( sbl, sbr и т. п.) мы подробнее познакомимся чуть далее, а здесь задержимся на ключевой команде всего алгоритма - sbrs, что расшифровывается как Skip if Bit in Register is Set (пропустить, если бит в регистре установлен). Повторим, что «пропустить» нужно следующую команду, в зависимости от состояния бита (в рассматриваемом случае - если он set, т. е. установлен в единицу) . В качестве этой «следующей» обычно выступает одна из команд ветвления, как здесь, но далеко не всегда- так удобно, например, организовывать выход из прерывания или подпрограммы по ка кому-то условию, если поставить следующей после sbrs команду reti или, соответ ственно, ret.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==