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

268 Часть 111. Практическое программирование микроконтроллеров А VR 30 мА придется заботиться о перегреве ключа, и половина энергии источника пита­ ния уйдет на бесполезный нагрев окружающей среды. Пристраивать фильтр к светодиодной линейке не всегда возможно (скажем, это не­ применимо к фабричным светодиодным поло с ам, которые питаются от напряже­ ния, а не от тока), и конденсатор будет к тому же занимать много места. Потому целесообразно все-таки применить какие-то универсальные программные меры, благо контроллер тут в нашем полном распоряжении. В этом случае стоит растягивать период синуса, не слишком снижая частоту собст­ венно ШИМ (величины более 60- 1 00 Гц будут незаметны глазу). Это просто : если мы, ничего не меняя в алгоритме, будем выводить новые значения в регистры срав­ нения OCRl x не каждое прерывание, а каждое, например, четвертое, то увеличим период синуса в четыре раза. При делителе 1 : 256, когда мигание на глаз еще не заметно, мы получим в этом случае те же 20 секунд периода, которые получились бы при делителе 1 : 1 024. Отслеживать каждое п-е мигание в общем-то очень просто: для этого нужно реали­ зовать функцию mod, возвращающую остаток от деления на п какого-нибудь счет­ чика. Если остаток равен нулю, то выводим новое значение, если нет - пропуска­ ем. Но то, что просто в языке С или в ассемблере, в котором есть аппаратное деле­ ние (х86, х5 1 ), в нашем случае выливается в неоправданно долгую процедуру. В общем случае проще завести счетчик до нужного числа, который после его дос­ тижения каждый раз обнуляется . Но для частных случаев выделения моментов, когда счетчик кратен степени двойки (2, 4, 8 и т. д. ) в АVR-ассемблере можно при­ менить более изящную процедуру. В листинге 9 . 1 7 выделяется каждое четвертое прерывание тrю_сомРА (см. его текст в листинге 9 . 1 8 далее). TIМl СОМРА : inc t_count ; увеличиваем счетчик прерываний andi t_count , ObO O O O O O l l ; выделяем младшие два бита breq set_OCR ; если результат равен О - на установку OCRlx reti ; если нет - ничего не делаем set OCR : < продолжаем прерывание > Здесь в результате операции andi над значением счетчика прерываний t_count вы­ деляются младшие два бита. Если они равны оо , то устанавливается флаг нуля z и происходит переход на продолжение прерывания, иначе ждем до следующего раза. При выполнении операции andi, конечно, сбрасываются остальные биты счетчика, но нас они не волнуют - счет до четырех ( 0 1, 1 0, 1 1 , о о) обеспечен. Точ­ но так же можно обеспечить счет до 2-х, до 8-ми, до 1 6-ти и т. д. , выделяя соответ­ ствующее количество битов (пример с выделением каждого 8-го значения показан в программе ультразвукового дальномера в главе 16).

RkJQdWJsaXNoZXIy MTExODQxMg==