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

148 Часть 11 . Программирование микроконтроллеров АVR на ассемблере Ее можно еще упростить, если, во-первых, отказаться от включаемого INС-файла, во-вторых, удалить команду обнуления регистра rl 7 ( c l r rl 7), которая здесь вклю­ чена больше для порядка: регистры общего назначения и без того обнуляются при сбросе в момент включения питания . А i пс -файл, содержащий мнемонические на­ именования регистров, включен для упрощения переноса на другие модели - проще раз и навсегда запомнить название PortD, чем лазать по даташитам в поисках абс о лютных адресов регистров ввода/вывода для каждой модели. В этом случае для другой модели нужно будет только заменить название iпс-файла и, конечно, прове­ рить, существуют ли у нее используемые порты. Эта программка содержит 6 команд и займет в памяти 1 2 байтов. Первые две команды выполняются один раз, а далее в цикле по одному такту занимают коман­ ды out и еще два такта - команда безусловного перехода rjmp, так что цикл зани­ мает четыре такта, и, следовательно, при любой тактовой частоте выдаст на выводе PDS (выводе ATmega8 под номером 1 1 ) частоту, равную ровно четверти от тактовой. Если у вас есть осциллограф, можете попробовать различные кварцы или менять частоту встроенного генератора и убедиться, что частота каждый раз дейст- 1 ; � вительно равна ровно 4 от установленнои. Но программа из листинга 6 . 1 1 не очень хороша с точки зрения экономии ресурсов контроллера: мы занимаем два регистра общего назначения r l б и rl 7 на все время, пока работает цикл. К тому же эти регистры не меняют своего состояния, т. е . хра­ нят константы. Нельзя ли действовать как-то попроще, если нам всего-то надо установить или сбросить бит? Конечно, можно (листинг 6 . 1 2) . . include "mBdef . inc" ldi rl б , ObO O l O O O O O ; регистр r l б = Ох2 0 out DDRD , rl б ; вывод PD5 на выход Gcykle : sbi PortD , 5 ; PD5=1 - 2 такта cbi PortD , 5 ; PD5=0 - 2 такта rjmp Gcykle ; переход обратно 2 такта Эта программа делает то же самое, но регистров не занимает, а непосредственно устанавливает/сбрасывает бит в порту D. Единственное отличие: каждая операция sЬi /cЬi занимает не один такт, а два. Потому частота на выходе будет равна уже не 1 / 4 от тактовой, а 1 / 6 • Можете проверить этот факт осциллографом. Вы еще увидите далее примеры того, что любую программу можно оптимизировать по числу зани­ маемых регистров, можно - по времени выполнения, а можно и по количеству ко­ манд, т. е. по объему, занимаемому в памяти. Разительное отличие от Arduino, где мы можем вроде бы делать то же самое, но даже не знаем, как именно организован вывод в порт по команде PORTD = о, и сколько времени это занимает, правда? ПРИМЕЧАНИЕ Напомню, что все законченные программные примеры из этой книги читатель может найти в архиве по адресу, указанному во введении, - в данном случае в папке GLAVAб.

RkJQdWJsaXNoZXIy MTExODQxMg==