Программирование на ассемблере

11-11-2013, 18:52
Просмотров: 1885
В данном разделе предполагается, что при написании программ на ассемблере используется программатор PICkit 2 и его программное обеспечение. В случае использования другого программатора листинг программы будет, в основном, таким же, однако - с небольшими отличиями. Для разработчиков на PICBASIC соответствующие версии программ представлены в следующем разделе книги.
Программирование на ассемблере

Сообщение "Hello World"
Стало уже почти традицией, что в учебниках по программированию все начинается с простейшей программы, отображающей на экране монитора сообщение "Hello World" ("Привет, мир"). Рассмотренная далее программа - ее робототехнический эквивалент.
Она заставляет робот "Скутер" продемонстрировать свои возможности ввода-вывода под управлением простейшей подпрограммы.
В то же время, это - способ проверки работоспособности схем вывода данных.
Первое, что делает робот "Скутер" при запуске программы, - остается неподвижным в течении примерно пяти секунд, ожидая внимания окружающих. Затем он на пять секунд включает два передних светодиода, после чего движется вперед в течение двух секунд (убедитесь, что вы не стоите на его пути). В заключение "Скутер" на две секунды включает свой боковой светодиод.
Программа ScootOl.asm начинается с идентифицирующей, которая игнорируется ассемблером, поскольку ассемблер всегда игнорирует то, что указано в командной строке справа от символа Этот заголовок можно изменить или вообще убрать его.
Обычно первые строки любой программы определяют переменные и другие начальные настройки. Так, объявляется тип микроконтроллера, для которого написана программа (в данном примере - PIC16F690). Далее следует конфигурационный код 0x3Зс4. Обратите внимание на то, что директива CONFIG начинается двумя символами подчеркивания.
Затем листинг продолжается директивами, которые назначают адреса регистрам, определяют кодовые значения w (рабочий регистр) и f (текущий файловый регистр) и присваивают метки подпрограммам задержки. В зависимости от используемого программного обеспечения, может оказаться, что все эти адреса указывать необязательно, поскольку они уже встроены в программную оболочку или задаются с помощью включаемого файла.
Теперь настроим микроконтроллер таким образом, чтобы он правильно взаимодействовал с выходными схемами (входы от фоторезисторов в данной программе не используются). Разряды и регистра STATUS переключают банки регистров специального назначения. Регистры для порта В и порта С в банке 0 обнуляются. Порт А в этой программе не используется. Далее программа переключается на банк 1, чтобы установить регистры трех состояний таким образом, чтобы все каналы портов В и С были выходными.
В отличие от некоторых более ранних моделей микроконтроллеров PIC, каналы 16F690 являются аналоговыми по умолчанию и должны быть переведены в цифровой режим явным образом. Для этого следует переключиться на банк 2, где размещены регистры ANSEL и ANSELH, и обнулить все их разряды.
Фактическая программа начинается с обнуления регистров порта, чтобы гарантировать, что светодиоды не включатся сразу же.
После этого реализована временная задержка с помощью подпрограммы longdelay.
Программирование на ассемблере

Светодиоды и двигатель включаются и выключаются путем установки разрядов в регистрах порта. Устанавливаемые разряды.
Так, например, установка разряда 4 порта С переводит вывод RC4 в состояние лог. 1, что замыкает транзисторный ключ, включающий светодиоды LED1 и LED2. Команда bsf устанавливает разряд в 1, а команда bcf - обнуляет. Наконец, для того, чтобы убедиться, что ничто не осталось включенным, с помощью команды clrf обнуляются вср каналы обоих портов. После этого робот "Скутер" входит в бесконечный цикл endit.
Для формирования пауз программа обращается к подпрограмме longdelay, которая в свою очередь обращается к подпрограмме delay.
Обе подпрограммы находятся в конце листинга. Завершается листинг существенно важной директивой end.

Нечто большее, чем просто привет
Рассмотренный листинг можно модифицировать для расширения круга возможностей робота "Скутер":
• мигнуть светодиодами два или три раза, вместо одного;
• подать тройной звуковой сигнал до и после того, как робот проедет вперед;
• проехать назад, а затем вперед в различных направлениях;
• завершить подпрограмму миганием светодиодов в бесконечном цикле.

Поиск света
В этой программе предполагается, что робот "Скутер" находится в комнате с приглушенным освещением, в которой присутствует один более яркий источник света (например, установленная на полу настольная лампа). Задача робота заключается в том, чтобы локализовать этот источник света и начать движение к нему.
Эта программа также демонстрирует использование компараторов микроконтроллера PIC. Прежде чем перейти к разбору программы поиска света, рассмотрим программу для настройки переменного резистора VR1. Подобные диагностические программы полезны для проверки работоспособности датчика и корректности опорного напряжения.
Программа калибровки компаратора, а соответствующий ей НЕХ-файл.
После объявления типа PIC и конфигурационного слова определяется список меток для регистров специального назначения.
В общем случае этот список излишен, если применяется программная среда разработки, использующая включаемые.
В данном случае нет никаких Подпрограмм обслуживания прерываний, поэтому мы переходим прямо к главной программе.
Если фоторезистор принимает яркий свет, то на компаратор подается высокое входное напряжение. Если это напряжение превышает опорное, поступающее от VR1, то разряд регистра CM1CON0 принимает значение 1. Состояние этого разряда контролируется путем опроса флага нулевого результата в регистре STATUS. Если входное напряжение является высоким, то разряд CM1CON0 содержит 0, и установлен флаг нулевого результата. Команда приводит к пропуску следующей командной строки и включению светодиода на 0,2 с. Затем программа вновь возвращается к опросу флага нулевого результата. Если уровень освещенности фоторезистора будет низким, то разряд содержит 1, флаг нулевого результата сброшен, и программа вернется обратно в начало цикла без включения светодиода.
Разместите робот так, чтобы на него падал свет, столь же яркий, как и лампа-цель, которая будет использоваться при запуске программы поиска света. Запустите программу калибровки. Отрегулируйте VR1 отверткой так, чтобы светодиод срабатывал точно при заданной освещенности.
Светодиод должен немедленно гаснуть, если источник света удаляется или же его яркость уменьшается.
Теперь переходим к программе поиска света. Она основана на простой процедуре. Комната заполнена неярким рассеянным светом.
В ней присутствует один яркий источник света (например, настольная лампа), расположенный на полу. Робот "Скутер" находится на полу таким образом, чтобы не быть ориентированным на источник света. Робот "Скутер" вначале пытается найти источник света с помощью 0дПрограммы, которая начинается с метки sample. Он опрашивает компаратора, чтобы определить, является ли источник света ним ярким или неярким. Под словом "яркий" мы подразумеваем, что напряжение с фоторезисторного датчика превышает опорное.
Если свет перед роботом недостаточно яркий, то "Скутер" переходит к выполнению подпрограммы scan.
Он немного отъезжает назад, поворачивая вправо по мере движения, после чего немного продвигается вперед. Фактически, он немного повернулся вправо и теперь ориентирован в другом направлении.
До тех пор, пока источник яркого света не попадет в его поле зрения, робот будет продолжать опрашивать выход компаратора и немного поворачиваться.
После 10 таких попыток, соответствующих осмотру комнаты на 360°, он придет к выводу, что яркий источник света не обнаружен.
Робот прекратит процесс поиска и начнет мигать светодиодами. На этом работа программы завершается.
Если при опросе выхода компаратора и сканировании, компаратор выдаст лог. 1, то робот будет знать, что в данный момент времени он ориентирован на источник яркого света. Он перейдет к метке found программы, где прежде всего отметит свой успех включением бокового светодиода и подачей звукового сигнала. Затем он двинется вперед, по направлению к источнику света.
Однако, угловое разрешение фотоэлемента достаточно большое, поэтому робот может быть сориентирован недостаточно точно.
Проехав вперед в течение нескольких секунд, он может немного сбиться с пути, поэтому должен приближаться к источнику света поэтапно, проверяя в конце каждого этапа направление движения. Таким образом, остановившись, робот возвращается к метке sample и повторяет этап считывания сигнала и сканирования. Вновь обнаружив свет, он начинает двигаться вперед (возможно, в другом направлении).
Таким образом, достижение лампы происходит в пять этапов. По их прошествии робот остановится и начнет мигать передними светодиодами.
Программа подразумевает наличие подпрограмм и longdelay, за которыми следует директива end. Она внешнее опорное напряжение, что позволяет перенастраивать переключения с помощью отвертки вместо редактирования и позорного ассемблирования программы.
Роботы отличаются своими двигателями и колесам, поэтому значения переменной direction может оказаться недостаточно для покрытия всей окружности.
В таком случае отредактируйте программу, задав большее значение для direction (первая командная строка после Метки scanning). ,
Если робот "Скутер" запускается в большом помещении, то ему следует предоставить возможность сделать еще несколько шагов для достижения лампы. Для этого увеличьте значение переменной stages (командная строка сразу перед меткой scanning).
Источник: delete-it.ru
Автор: ziko
Опубликовано пользователем: 81 (смотреть все)
Комментарии: