Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

182 Микроконтроллеры AVR от азов программирования... файл и включить подобную строку в свою программу. Учтите, что без присоединения файла описаний дальнейшая программа работать не будет. Для микроконтроллера ATtiny2313 файл описаний имеет название tn2313def.inc. Если файл описаний находится в указанной выше директории, то в команде include достаточно лишь указать его полное имя (с расширением). Указывать полный путь необязательно. Назначение команды .list (строка 2), надеюсь, у вас уже не вызы ­ вает вопросов. Остановимся на команде макроопределения (строка 3). Эта команда, как уже говорилось, присваивает регистру г16 имя temp. Дальше в программе регистр temp используется для временного хра ­ нения промежуточных величин. Уместно задаться вопросом: почему выбран именно г 16, а, к примеру, не г 0? Это становится понятно, если вспомнить, что регистры, начиная с г 0 и заканчивая г 15, имеют меньше возможностей. Например, в строке 14 программы регистр temp исполь ­ зуется в команде ldi. Однако команда ldi не работает с регистрами г0-г15. Именно по этой причине мы и выбрали г16 . Следующие две команды (строки 4, 5) подробно описаны в начале этого раздела. Они служат для выбора программного сегмента памяти и установки начального значения указателя. В строках 6 и 7 производится инициализация стека. В регистр стека SPL записывается адрес его вершины. В качестве адреса выбран самый верхний адрес ОЗУ Для обозначения этого адреса в данной вер ­ сии Ассемблера существует специальная константа с именем RAMEND. Значение этой константы определяется в файле описаний (в нашем слу ­ чае в файле tn2313def . inc). Для микроконтроллера ATtiny2313 кон ­ станта RAMEND равна OxDF. Одной строкой записать константу в регистр стека невозможно, так как в системе команд микроконтроллеров AVR отсутствует подобная команда. Отсутствующую команду мы заменяем двумя другими. И тут нам пригодится регистр temp. Он послужит в данном случае переда ­ точным звеном. Сначала константа RAMEND помещается в регистр temp (строка 6), а затем уже содержимое temp помещается в регистр SPL (строка 7). В строках 8 — 12 производится настройка портов ввода-вывода. Ранее мы уже договорились, что порт PD у нас будет работать на ввод, а порт РВ — на вывод. Для выбора нужного направления передачи информации запишем управляющие коды в соответствующие регистры DDRx. Во все разряды регистра DDRD запишем нули (настройка порта PD на ввод), а во все разряды регистра DDRB запишем единицы (настройка порта РВ на вывод). Кроме того, нам нужно включить внутренние нагрузочные рези ­ сторы порта PD. Для этого мы запишем единицы (то есть число OxFF) во

RkJQdWJsaXNoZXIy MTExODQxMg==