Введение Очень часто возникает задача измерить расстояние от одной точки до другой. Конечно, иногда достаточно напрямую измерить это расстояние при помощи линейки или измерительной рулетки. Однако если конечная точка является слишком удаленной или труднодоступной, возникает необходимость в дистанционном измерении расстояния до объекта. В настоящее время существуют различные виды измерителей расстояний: ультразвуковые, инфракрасные, лазерные. Для измерения небольших расстояний (до десятков метров) вполне подходят измерители на основе инфракрасного излучения. В курсовом проекте рассматривается процесс разработки контроллера измерителя расстояний. В основе устройства лежит микроконтроллер (МК) ATtiny2313 фирмы ATMEL. Особенностями данного контроллера измерителя являются использование инфракрасного светодиода в качестве источника зондирующего излучения, индикация посредством жидкокристаллического дисплея. 1. Потребительские свойства контроллера .1 Назначение Устройство предназначено для измерения расстояния от наблюдателя до какого-либо объекта, находящегося зоне в прямой видимости наблюдателя. .2 Технические показатели. Режимы Измеритель расстояния может работать в следующих режимах: режим «отключен»; режим «ожидание»; режим «измерение и вывод». Режим «отключен» соответствует отсутствию напряжения питания, что возможно при положении переключателя «ВКЛ/ВЫКЛ» в положении «ВЫКЛ» или при отсутствии батареи питания Режим «ожидание» соответствует состоянию контроллера, когда на него подано напряжение питания и он ожидает изменения на входах датчиков. Режим «измерение и вывод» соответствует измерению расстояния и выводу результатов на жидкокристаллический дисплей. Переход в данный режим осуществляется из режима «ожидание» при нажатии на одну из кнопок «Измерение». Также стоит отметить, что в разрабатываемом контроллере существует также промежуточный режим «очистка», который соответствует очистке результатов предыдущих измерений и выводу пустых строк на жидкокристаллический индикатор. После очистки контроллер вновь находится в режиме «ожидание». 1.3 Средства индикации, сигнализации, подключения, управления. Пульт Для того чтобы пользователь мог следить за работой устройства, имеется 1 сигнальный светодиод (рисунок ), а также жидкокристаллический дисплей для выдачи результатов измерения (см. ФВС КП 4.468004.017 Э2). Рисунок - Панель (корпус) прибора Один светодиод, расположенный на корпусе прибора, сигнализирует о наличии питания. Этот светодиод горит при состоянии «ВКЛ» кнопки “ВКЛ/ВЫКЛ” и исправности батареи питания. Жидкокристаллический дисплей служит для вывода информации о результате измерений в виде расстоянии выраженного в соответствующих единицах измерения. 1.4 Инструкция по применению Устройство начнет функционировать после подачи питания. Для этого необходимо установить исправные батареи и перевести переключатель «ВКЛ/ВЫКЛ» в положение «ВКЛ». Если питание присутствует загорится светодиодный индикатор «Питание». Для измерения расстояния необходимо навести прибор на объект, до которого необходимо измерить расстояние нажать на одну из кнопок «Измерение 1» или «Измерение 2» и дождаться результатов измерения, которые будут выведены на индикатор. При нажатии на кнопку «Измерение 1» результаты измерения будут выведены в первую строчку индикатора, При нажатии на кнопку «Измерение 2» результаты измерения будут выведены во вторую строчку индикатора. После окончания измерения при повторном нажатии на кнопки измерения новый результат заменит собою предыдущий. При нажатии на кнопку «Сброс» обе строчки дисплея очистятся. Если после измерении на дисплей выведены символы «---------», значит, измерение прошло неудачно и следует повторить попытку. Неудачное измерение возможно в следующих случаях: расстояние до объекта слишком велико и превышает предел измерения; объект имеет большой угол наклона относительно измерительного луча. индикация сигнализация датчик адресный 2. Датчики и исполнительные органы контроллера .1 Состав датчиков Датчиками микроконтроллера являются: 3 нефиксируемых переключателя и 1 фотодиод. .2 Принцип действия, кинематическая, функциональная схемы датчиков, предполагаемые диапазоны и значения выходных сигналов и входных воздействий Как было сказано выше датчиками являются нефиксируемые переключатели и фотодиод. Приведем функциональные схемы датчиков на рисунке. Рисунок - функциональная схема датчиков Как видно датчики в неактивном состоянии подают на вход контроллера логическую «1», а при активном состоянии логический «0». Кинематика датчиков такова: переключатели находятся в активном состоянии при нажатии, а фотодиод при его засветке. Благодаря использованию в качестве фотодатчика фотодиода инфракрасного диапазона удалось избежать ложных срабатываний датчика (выбранный фотопередатчик и фотоприемник рассчитаны на длину волны 940нм). Конденсатор на нефиксируемом переключателе служит для подавления дребезга контактов. .3 Состав исполнительных органов Исполнительными органами контроллера являются: светодиод видимого диапазона, светодиод инфракрасного диапазона, жидкокристаллический дисплей .4 Принцип действия, кинематические и функциональные схемы исполнительных органов, предполагаемые ограничения на входные сигналы и ожидаемую реакцию Приведем функциональную схему подключения светодиодов к контроллеру. Рисунок - Функциональная схема подключения фотодиодов Как видно из рисунка светодиоды (индикатор и фотопередатчик) будут гореть излучать свет при наличии на выходе контроллера напряжения низкого уровня, т.е. логического «0», следовательно при наличии на соответствующем выходе контроллера напряжения высокого уровня светодиод излучать ничего не будет. В качестве индикатора выступает жидкокристаллический дисплей 16 символов 2 строчки со встроенным контроллером HD44780 или его аналогом. Приведем дисплея. функциональную схему подключения жидкокристаллического Рисунок - Функциональная схема подключения дисплея Как видно из рисунка дисплей подключается к контроллеру по шести линиям, из которых 4 информационных и 2 управляющих. Вход «rw» дисплея используется для записи в память контроллера дисплея, для данного устройства он не задействован, следовательно он подключен к общему проводу. Вход «Vee» дисплея используется для настройки его контрастности, он подключен к источнику питания через переменный резистор, сопротивление которого при настройке меняется от 10 до20 кОм. Контроллер дисплея имеет свой блок управления, который обрабатывает команды и память. Она делится на три вида:- память дисплея. Все что запишется в DDRAM будет выведено на экран. Например, если записать туда код 0×31- на экране появится символ “1″ т.к. 0х31 это ASCII код цифры 1.таблица символов. Когда записывается в ячейку DDRAM байт, то из таблицы берется символ и рисуется на экране. CGROM нельзя изменить, поэтому от ее содержания зависит возможность вывода на различных языках. CGRAM - тоже таблица символов, но ее можно менять, создавая свои символы. Всего в CGRAM может быть 8 символов, соответственно CGRAMимеет 64 байта памяти. Для доступа к памяти необходимо указать область памяти в которую производится запись, а следом отправить данные. Для того чтобы передать команду необходимо выставить на входе «RS» напряжение низкого уровня. Таблица- Таблица команд дисплея DB7 0 DB6 0 DB5 0 DB4 0 DB3 0 DB2 0 DB1 0 DB0 1 0 0 0 0 0 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 1 S/C 1 D R/L I/D C - S B - 0 0 1 DL N F - - 0 1 AG AG AG AG AG AG 1 AD AD AD AD AD AD AD Значение Очистка экрана. Счетчик адреса на 0 позицию DDRAM Адресация на DDRAM сброс сдвигов, Счетчик адреса на 0 Настройка сдвига экрана и курсора Настройка режима отображения Сдвиг курсора или экрана, в зависимости от битов Выбор числа линий, ширины шины и размера символа Переключить адресацию на SGRAM и задать адрес в SGRAM Переключить адресацию на DDRAM и задать адрес в DDRAM Условные обозначения:/D - инкремент или декремент счетчика адреса. S - сдвиг экрана, если поставить 1 то с каждым новым символом будет сдвигаться окно экрана, D - включить дисплей. С - включить курсор в виде прочерка. B - сделать курсор в виде мигающего черного квадрата. S/C сдвиг курсора или экрана. R/L - определяет направление сдвига курсора и экрана. 0 - влево, 1 - вправо. D/L - бит определяющий ширину шины данных. 1-8 бит, 0-4 бита N - число строк. 0 - одна строка, 1 - две строки. F - размер символа 0 - 5х8 точек. 1 - 5х10 точек (встречается крайне редко) AG - адрес в памяти CGRAM АD - адрес в памяти DDRAM При работе с дисплеем до вывода на него какой либо информации, сначала следует пройти процедуру инициализации дисплея. Она заключается в первоначальной настройке таких его параметров, как тип интерфейса (4 или 8 бит данных), установка параметров курсора и его положения. После инициализации можно выводить на него информацию. 3. Элементная база контроллера .1 Мотивация функционального состава контроллера Для создания измерителя расстояния в качестве логического ядра устройства был выбран микроконтроллер Attiny 2313 фирмы Atmel. Контроллер был выбран, так как подходит по основным показателям для выполнения заданных функций. Он имеет 2 Кб программируемой в системе Flash-память программы, ОЗУ ёмкостью 128 байт, 18 линий ввода/вывода общего применения, что является достаточным для подключения всех нужных устройств, последовательный программируемый USART [3]. Также данный микроконтроллер имеет 32 рабочих регистра общего назначения. При этом все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды. В результате данная архитектура позволяет обеспечить большую производительность, чем стандартная CISC архитектура [5]. К тому же данный микроконтроллер имеет развитую систему команд. .2 Сведения о функциональных узлах контроллера Таблица Описание входов/выходов контроллера Входы: Количество входов датчиков Типы подключаемых датчиков Напряжение, подаваемое на входы датчиков Сопротивление входов датчиков Выходы: Количество выходов исполнительных устройств Максимальное коммутируемое напряжение Максимальный коммутируемый ток 4 Цифровые (контактные) 0..5 В 3,3 кОм 7 5В (пост) 300 мА Расположение выводов контроллера Attiny 2313 представлена на рисунке. Рисунок -Расположение выводов контроллера XTAL1 - вход инвертирующего усилителя генератора и вход внешнего тактового сигнала. XTAL2 - выход инвертирующего усилителя генератора. В нашем случае используется внешний кварцевый резонатор с частотой 10MHz. VCC - вывод источника питания. GND - «общий» провод (земля, корпус). RESET - вход сброса. Порт B (PB0 - PB7) является 8-битовым двунаправленным портом ввода/вывода. Порт D (PD0 - PD6) является 7-битовым двунаправленным портом вводы/вывода [3]. Рисунок - Функциональный состав микроконтроллера Архитектурная особенность построения портов ввода/вывода у AVR микроконтроллеров заключается в том, что для каждого физического вывода существует 3 бита контроля/управления, а не 2, как у распространенных 8-разрядных микроконтроллеров (Intel, Microchip и т.д.). Упрощенная схема элемента ввода/вывода, поясняющая логику его работы, приведена на рисунке. Рисунок - Упрощенная схема вывода PB1 B - бит контроля направления передачи данных. Значение битов в регистре DDRB определяет, чем будут ножки этого порта (входами или выходами). Если в этом регистре какой-либо бит имеет значение “0”, то соответствующая данному биту ножка является входом. Если же бит имеет значение “1”, то соответствующая ножка является выходом.B - бит для отображения логического уровня сигнала на физическом выводе микросхемы. Напряжение на выводе PB1 преобразуется в логические уровни «1» или «0», которые можно прочитать в регистре PINB это бит_1 или PINВ.1. Чтобы на ножках порта B появился «1» или «0», соответствующий бит в регистре PORTB нужно сделать «1» или «0». При этом такой же бит регистра DDRB должен быть установлен в «1», т.е. ножка должна быть выходом. Если она сконфигурирована как вход (т.е. соответствующий бит в регистре DDRB имеет значение “0”) и соответствующий бит в регистре PORTB тоже имеет значение “0”, ножка будет высокоимпедансным входом (Z-состояние, вход с очень высоким входным сопротивлением более 10 Мом). А если же бит в регистре PORTB установлен в “1”, то включается «подтяжка» (pull-up) высокоимпедансного входа к плюсу питания МК через встроенный резистор примерно 40 КОм, т.е. ножку как бы соединяют таким резистором с питанием МК [2], [3], [5]. Бит_1 в регистре DDRB управляет переключателем - на рисунке 4.2.3 переключатель показан в положении бит_1 равен «0». Диод на схеме идеальный - значит, если бит_1 в PORTB будет тоже равен «0», то вывод PB1 будет высокоомным входом. А если бит_1 в PORTB сделать «1», то вывод PB1 через диод и резистор 40 КОм подключится к питанию МК - т.е. станет входом с подтяжкой. Если бит_1 в регистре DDRB сделать «1», переключатель изменит состояние, и значение бит_1 в PORTB будет выводиться прямо на PB1 - теперь это будет просто выход [2]. Таблица - Логика работы с портами Значение бита_x Биты только для чтения PINB.x 1 0 определяется реальным напряжением на ножке МК Программа управляет этими битами DDRB.x PORTB.x 1 1 0 0 1 0 0 Состояние вывода МК PBx Высокий лог. уровень Низкий лог. уровень Подтяжка - pull-up Вывод подсоединен к питанию МК через резистор внутренний резистор 40 КОм Z-состояние. Высокоомный вход 4. Обоснование и описание функциональной электрической схемы контроллера Рассмотрим функциональную электрическую схему контроллера (см. ФВС КП 4.468004.043 Э2). Составные части контроллера измерителя расстояния согласно схеме (см. ФВС КП 4.468004.043 Э2) : микроконтроллер AT Tiny2313 кварцевый резонатор на 10Мгц светодиоды нефиксируемые переключатели резисторы конденсаторы светодиод инфракрасного диапазона фотодиод инфракрасного диапазона жидкокристаллический дисплей со встроенным контроллером батарея питания Для проектирования контроллера были использованы доступные и распространенные электронные компоненты. Основным элементом устройства является 8-разрядный микроконтроллер ATtiny2313 фирмы Atmel. Для работы микроконтроллера необходим источник динамического питания - кварцевый резонатор, который подключен к выходам XTAL1 и XTAL2 [2]. При этом ножки XTAL1 и XTAL2 заземляют конденсаторами емкостью 22 пФ на GND (см. ФВС КП 4.468004.043 Э2). Кварц имеет частоту 10 МГц (диапазон частот тактового генератора ATtiny2313: 0-20 МГц), данная частота обеспечивает измерение расстояния с высокой степенью точности. Устройство питается от батареи на 5В. За подачу на устройство питания от батареи отвечает фиксируемый переключатель SA1: в положении «ВКЛ» положительный выход батареи соединен с соответствующим входом контроллера, дисплея и переключателями. Переключение устройства в режим измерения происходит при нажатии на одну из кнопок SB1, SB2 (выводы PD2,PD3). При нажатии кнопки замыкают соответствующий вывод контроллера на землю «GND», что соответствует логическому нулю. При отпущенной кнопке на входе контроллера находится логическая единица. Сброс результатов измерений осуществляется нажатием на кнопку SB3 (вывод PD4), при нажатии вход контроллера замыкается на землю. Светодиод VD1, подключенный к выводу PD0, сигнализирует о наличии питания. В качестве источника зондирующего (измерительного) излучения использован светодиод инфракрасного диапазона (длина волны 940нм) VD2, подключен к выводу PD1. Светодиоды имеют инверсное подключение, т.е. их свечение обеспечивается уровнем логического нуля на выводе контроллера. В качестве фотоприемника используется фотодиод инфракрасного диапазона (940нм) VD, подключен к выводу PD5. В не засвеченном состоянии на выводе контроллера находится логическая единица. При попадании на фотодиод света нужной длины волны сопротивление его обратно-смещенного перехода резко падает практически до 0 и замыкает вывод контроллера на землю. Таким образом, фотоприемник имеет также инверсное подключение. Также на данной схеме имеется подтягивающий резистор 10 кОм от ножки RESET . 5. Алгоритм функционирования .1 Исходные представления к алгоритму Работу устройства можно разделить на 2 действия ожидание нажатия на кнопки обработка нажатий После подачи питания контроллер проходит процедуру инициализации, среди которой присутсвуют действия настройки портов и процедура инициализации дисплея. После инициализации контроллер входит в режим ожидания, в этом режиме он ждет нажатия на одну из кнопок. При нажатии на кнопку SB1, SB2, SB3 соответствующий вывод контроллера соединяется с землей, и контроллер начинает обрабатывать нажатие. Если произошло нажатие на кнопку SB1 или SB2 контроллер начинает измерение расстояния до объекта. По окончании измерения результат выдается на дисплей. Если произошло нажатие на кнопку SB3 результаты измерений должны быть очищены, также как и дисплей. 5.2 Схема алгоритма Подача питания ; настройка портов ; инициализация дисплея Инициализация нет Кнопка нажата? нет нет ; ожидание прерывания вызванного нажатием на одну из кнопок да Нажата кнопка 1? Нажата кнопка 2? да Начать измерение 1 да ; начинаем измерение расстояния Нажата кнопка 3? да Начать измерение 2 Очистить результаты измерений ; обнуляем результаты Вывод результатов на дисплей ; выводим результаты на дисплей Рисунок - Блок-схема работы контроллера 6. Программное обеспечение контроллера .1 Исходные предположения Алгоритм работы устройства может быть реализован на различных языках программирования (C/C++, Assembler). Размер программируемой памяти программы 2 КБ. Для хранения и передачи данных в программе должны использоваться регистры контроллера R0…R31, а также область памяти программ для хранения констант и данных для хранения некоторых переменных. .2 Характеристика состава и объектов программного продукта контроллера Программу состоит из следующих блоков: начальная инициализация контроллера процедура инициализации дисплея пустой бесконечный цикл обработчик прерывания по изменению состояний на входах кнопок процедура умножения для расчета расстояния процедура перевода числа из двоичного в двоично-десятичный формат процедура вывода на дисплей процедуры задержки Начальная инициализация контроллера состоит в настройке портов контроллера (выводы 0-5 порта B на выход для вывода на LCD, выводы 0,1 порта D на выход - светодиод питания и фотопередатчик, выводы 2-5 порта D на вход - кнопки и фотоприемник). А также происходит запись строк-заготовок для вывода на дисплей формата «1: $», где $ - знак конца строки, будет использован в процедуре вывода. Процедура инициализации дисплея состоит из настройки дисплея, которая осуществляется путем посылки на него служебных сообщений, устанавливающих разрядность, настройки курсора и вывода. Служебные сообщения отсылаются процедурой WriteCmd (Входные данные: R16(Temp) адрес DDRAM + 0x80.). После инициализации контроллер входит в режим ожидания. Этот режим реализован как бесконечный цикл (метка main). В режиме ожидания контроллер ждет возникновения прерывания. Прерывания возникнут при изменении состояния на любом из входов порта D, заданными маской в регистре PCMSK0. После возникновения прерывания контроллер уходит на его обработку. В теле прерывания контроллер определяет вход, который вызвал прерывание, сравнивая предыдущее состояние входов (хранится в регистре flag) с текущим. Затем происходит переход по соответствующей метке (but0, but1, but2 - для кнопок; foto - для фотоприемника). При обработке нажатий на кнопки 1 и 2 происходит изменение маски для прерывания PCMSK0, посылка зондирующего импульса и включение счетного таймера. При обработке нажатия на клавишу 3 происходит очистка результатов измерения. Для результатов измерения и последующего вывода на дисплей отведены 34 байта в ОЗУ (izm1: .byte 17). значения по адресам (izm+3) -( izm+7) очищаются записью нулей. При обработке прерывания от фотоприемника происходит остановка таймера и расчет расстояния. Расчет расстояния ведется при помощи умножения числа из счетчика (tcnt1h, tcnt1l) на константу, полученную в результате отношения скорости света к удвоенной тактовой частоте генератора. После умножения число переводится в двоично-десятичное процедурой bin2BCD16. Затем результаты измерения в подготовленном формате записываются в ОЗУ. После подсчета расстояния и перевода его в нужную форму происходит вывод на индикатор. Вывод осуществляется подпрограммой display, которая в свою очередь указывает начальный адрес строки в ОЗУ (ldi ZL,Low(izm1) и вызовает подпрограмму вывода строки. Подпрограмма вывода строки действует следующим образом: в качестве адреса начала строки она извлекает число из регистра Z. Побайтно считывая данные из ОЗУ подпрограмма отправляет их на дисплей, до тех пор пока следующим символом для отправки не будет «$». После вывода маска прерываний вновь устанавливается на срабатывание от кнопок и контроллер переходит в режим ожидания. Во время инициализации дисплея и вывода используются процедуры задержки Delay40mks и Delay1500mks, для задержки на 40 и 1500мкс соответсвенно. .3 Программа "Монитор" контроллера Исходный текст программы контроллера представлен в приложении А данной пояснительной записки. .4 Комментарий к общесистемному программному обеспечению контроллера Используемый в данном курсовом проекте микроконтроллер имеет 2 КБ программируемой в системе Flash память программы, 128 байтную EEPROM память данных, 128 байтное SRAM (статическое ОЗУ), 32 рабочих регистра общего назначения, последовательный программируемый USART. 7. Оценка объемов ОЗУ, ПЗУ. Распределение адресного пространства контроллера Микроконтроллер имеет 2 КБ программируемой в системе Flash память программы, 128 байтная EEPROM память данных, 128 байтное SRAM (статическое ОЗУ). Исходный код программы (прошивка) генерируется в шестнадцатеричном формате *.hex, как для загрузки во Flash-память микроконтроллера (память программ), так и в EEPROM (электрически перепрограммируемая постоянная память). Две начальные и одна конечная строка прошивки (файл с расширением *.hex) представлены в таблице: Таблица - Фрагмент прошивки :02 :10 ... :00 0000 0000 …. 0000 02 00 .. 01 0000 00C0 …. FF FC 0FEF …. 07BB …. 0FE3 …. 01BB …. 969A …. 00C0 …. 8699 …. B3 .. Каждая строка начинается двоеточием. Каждая последующая пара символов представляет собой один байт в шестнадцатеричном коде. Четыре байта в начале и один байт в конце строки являются служебными, находящиеся между ними байты - информационные - загружаются в память. В служебных строках информационные байты отсутствуют. Первый байт - число информационных байт в строке. Для первой строки это 02, т.е. информационных байт (02H=2); для второй это 10H=16; в последней строке их 00H. Следующие два байта - адрес ячейки памяти, по которому записывается первый информационный байт строки (остальные информационные байты строки записываются в последующие ячейки памяти), третий байт отличается от нуля только в служебных строках. Он равен единице в последней строке, являющейся, очевидно, признаком конца файла. Далее идут пары информационных байт, каждая пара составляет ассемблерную команду или часть команды микроконтроллера AVR. . Краткая характеристика технических средств и технологии отладки аппаратной и программной сред контроллера Программу для МК удобно создавать в специальных программах компиляторах. ATtiny2313 средствами интегрированными и компиляторы C, поддерживается макроассемблеры, различными средствами разработки, программные программными такими как отладчики/симуляторы, внутрисхемные эмуляторы и ознакомительные наборы (CodeVisionAVR, C Compiler, AVR Studio, WinAVR).Studio 4 представляет собой набор инструментальных средств для работы с микроконтроллерами семейства AVR фирмы ATMEL. Работать с AVR Studio очень просто. Первоначально создается файл с расширением .asm, содержащий исходный текст программы. Далее необходимо загрузить в редактор исходный текст программы (в нашем случае программа написана на Assembler), в меню выбрать Build -> Build (F7). При этом в случае отсутствия ошибок в набранном исходном коде выполнится компиляция исходного кода программы. В случае отсутствия ошибок исходный код преобразуется в специальный файл, который можно записывать во flash память микроконтроллера AVR. При этом в окне "Build" появится сообщение о результате компиляции (рисунок): Рисунок - Сообщение о компиляции Если в результате компиляции не было сообщения об ошибках - Error, то в папке с проектом появятся следующие файлы (рисунок): Рисунок 9.2 - Файлы проекта Файл с расширением .hex - файл для прошивки в микроконтроллер AVR. В нем хранится шестнадцатеричный код для загрузки в память программ микроконтроллера. После этого, используя все ту же AVR Studio 4, можно осуществлять загрузку откомпилированного файла посредством SPI интерфейса с помощью программатора в память программ микроконтроллера. Заключение В ходе работы над данным курсовым проектом был спроектирован контроллер измерителя расстояний, который удовлетворяет требованиям технического задания. Преимущество разработанной системы измерения является в использовании инфракрасного излучения, что представляет неплохую точность, а также удешевляет себестоимость устройства. При выполнении работы были разработаны функциональная электрическая схема, алгоритм работы программы, листинг управляющей программы. Список использованных источников 1. В.Б. Бродин, А.В. Калинин «Системы на микроконтроллерах и БИС программируемой логики» - Санкт-Петербург, ЭКОМ, 2002 - 400с. 2. ОС ТУСУР 6.1-99. Работы студенческие учебные и выпускные квалификационные. Общие требования и правила оформления. 3. Торгонский Л.А., Проектирование микроконтроллеров: / Методические указания по курсовому проектированию дисциплины “Проектирование центральных и периферийных устройств ЭВС-2”,-Томск:-Изд. ТУСУР, 2005 г.12 с. Приложение .include "C:\Program Files\Atmel\AVR\Tools\AvrAssembler\Appnotes\2313def.inc" .def temp= R22 .def step= R23 .def flag= R24 .def temp2= R25 .org 0 .cseg ;область программы начиная с 0 адрессаRESET ; Reset Handler //векторы аппаратных прерыванийPC_INT0 ; прерывание по изменению на входах порта D ;*************************************************************** ******* ; данные для инициализации ;*************************************************************** *******_INIT_DATA: .db 0b00000011,0b00000011 ; 30h Установка разрядности .db 0b00000011,0b00000010 ; 20h Установка разрядности .db 0b00000010,0b00001000 ; 28h Установка разрядности .db 0b00000000,0b00001000 ; 0Ch Выглючение дисплея .db 0b00000000,0b00000110 ; 06h Установка направления и разрешения сдвига .db 0b00000000,0b00001111 ; 0Fh Включить индикатор и мигающий курсор .db 0b00001000,0b00000000 ; Курсор домой .db 0b00000000,0b00000001 ; 01h Очистка, курсор домой ;*************************************************************** ******* ;инициализация (настройка портов, инициализация дисплея) ;*************************************************************** ******* :temp, LOW(RAMEND) out spl, temp ;установка указателя стека на дно ОПtemp,0b00111111 ;разряды 0-5 порта D на выход (LCD) out DDRD,temptemp,0b11111111portD,temp temp,0b01000011 ;0-2 разряды порта В - входы - кнопки out DDRB,temp ;разряд 3-выход ШИМ-3 temp,0b00111101;зажигаем индикатор «питание», фотопередатчик в 0 out portB,temp ldi temp,0b01100011 ;разряды 0,1,5 порта D на выход, 2-4 на вход out DDRD,temptemp,0b11111111 out portD,tempzh,high(izm1) ;записываем в ОЗУ начало первой строки (1:) ldi zl,low(izm1)temp,0x31z+1,temptemp,0x3a std z+2,temptemp,'$' ;символ $ используется как знак конца строкиz+16,tempzh,high(izm2) ;записываем в ОЗУ начало второй строки (1:) ldi zl,low(izm2)temp,0x33z+1,temptemp,0x3a std z+2,temptemp,'$' ;символ $ используется как знак конца строки std z+16,temptemp,(1<<pcie0) sts PCICR,temp ;разрешение прерываний при изменении состояния на входах порта Dtemp,0b00011100 ;задание масок для активации прерыванийPCMSK0,temp ;прерывания разрешены при изменении состояния на входах 2-4 порта D ldi temp,(1<<toie1)timsk1,temptemp,(1<<cs11)tccr1b,temp rcall Init_LCD16s2d ; Инициализация дисплея ;разрешаем прерывания ;*************************************************************** ******* ; основной цикл ;*************************************************************** *******:main ;бесконечный цикл ожидание нажатия на кнопку или прихода импульса ;*************************************************************** ************ ; процедура умножения ;*************************************************************** ************ .def mc16uL =r16 ;младший байт множителя .def mc16uH =r17 ;старший байт множителя .def mp16uL =r18 ;младший байт множимого .def mp16uH =r19 ;старший байт множижимого .def m16u0 =r12 ;1-й байт результата .def m16u1 =r13 ;2-й байт результата .def m16u2 =r20 ;3-й байт результата .def m16u3 =r21 ;4-й байт результата .def mcnt16u =r22 ;счетчик повторений m16u3 m16u2 ;***** Code mpy16u: clr mcnt16u,16 mp16uH mp16uL u_1: brcc noad8 m16u2,mc16uL m16u3,mc16uH: ror m16u2 mcnt16u m16u1 m16u0 m16u3 brne m16u_1 ;*************************************************************** ******* ; процедура перевода в десятичный формат ;*************************************************************** ******* .equ AtBCD0 =10 .equ AtBCD2 =11 .def tBCD0 =r10 ;двоично-десятичное число цифры 0 и 1 .def tBCD1 =r11 ;двоично-десятичное число цифры 2 и 3 .def fbinL =r12 ;младший байт двоичного числа .def fbinH =r13 ;старший байт двоичного числа .def cnt16a =r16 ;счетчик .def tmp16a =r25 ;переменнаяBCD16: tBCD0 ZH_1:lsl bBCDx_2_2:ldi tBCD1 tBCD1 cnt16a tmp16a,Z tmp16a,-$30 r30,AtBCD2+1_3: tmp16a,-Z tmp16a,-$03 tmp16a,7 fbinL fbinH tBCD0 cnt16a,16 Z,tmp16a tmp16a,3 Z,tmp16a ZL,AtBCD0 bBCDx_3 rjmp bBCDx_1 ;*************************************************************** ******* ; работа с дисплеем ;*************************************************************** *******:Delay40mks ; включениемTemp,0b10000000WriteCmd ldi ZL,Low(izm1)ZH,High(izm1)WriteLn Пауза перед ; Установка курсора ; Вывод 1-й строкиTemp,0b11000000WriteCmd ; Установка курсораZL,Low(izm2)ZH,High(izm2)WriteLn ; Вывод 2-й строки ;*************************************************************** ******* ; Инициализация LCD ;*************************************************************** *******_LCD16S2D:R16,0portC,R16Delay40mksb1,16ZL,Low(LCD_INIT_DATA *2)ZH,High(LCD_INIT_DATA*2)_next0:portC,r0 ;TempZL,1 ;AddImmedaiate to Word. Инкрементится слово. ;Не менее 40нсportC,4 ;Не менее 230нс nopportC,4Delay40mksb1Init_next0Delay1500mks ;*************************************************************** ******* ; Пауза 40 мксек ;*************************************************************** *******mks:TempTemp,0:TempLoopTemp ;*************************************************************** ******* ; Пауза 1500 мксек ;*************************************************************** *******mks:Tempb1Temp,0b1,20:TempLoop3b1Loop3b1Temp ret ;*************************************************************** ******* ; Установка адреса для последующих операции и ; выбор оласти DDRAM. ; Входные данные: R16(Temp) - адрес DDRAM + 0x80. ; Изменяется регистр R16(Temp). ;*************************************************************** *******: push TempTempTemp,0b00001111portC,Temp nopportC,4 ;Не менее 40нс ;Не менее 230нс nopportC,4 nop ;Не менее 270нс nopTempTemp,0b00001111portC,Temp nop ;Не менее 40нсportC,4 ;Не менее 230нс nopportC,4 rcall Delay40mks ;*************************************************************** ******* ; Вывод текстовой строки на дисплей. ; Входные данные: регистр Z - адрес строки в ; программной памяти. '$' - конец строки. ; Изменяется регистр R16(Temp), Z. ;*************************************************************** *******: ; lpmtemp,zTemp,'$'WriteLnEndZL,1TempTempTemp,0b00001111Temp,0b001 00000portC,Temp ;Не менее 40нс nopportC,4 ;Не менее 230нс nopportC,4 nop ;Не менее 270нс nopTempTemp,0b00001111Temp,0b00100000portC,Temp;Не менее 40нс nopportC,4 ;Не менее 230нс nopportC,4Delay40mksWriteLn: ret ;*************************************************************** ******* ; обработчик прерывания от переключателей ;*************************************************************** *******_INT0:temp2 temp,pinb нажатаtemp,0b00111100 ;узнаем какая ;сравнивая из кнопок текущее была положение переклббчателей с предыдущим (flag) andi flag,0b00111100flag,temp ;в зависимости от нажатой кнопки переходим к обработчику sbrc flag,2but0flag,3but1flag,4but2flag,5foto_int0: in flag,pinb ;заносим в флаг текущее состояние кнопок ;********: ;если ;обработчик нажатия на кнопку 1pind,2 кнопка была прерыванияexit_int0temp2,0x01 отпущена выходим из ;нажата 1-я кнопкаPCICR,temp ;разрешение прерываний при изменении состояния на входах порта Dtemp,0b00100000 ;задание маски для активации прерыванийPCMSK0,temp ;прерывания разрешены при изменении состояния на входе 5 порта D sbi portD,1 ;включаем передатчикtimer_clear_start ;обнуляем таймер и запускаемportD,0 передатчикexit_int0: 2pinD,3 ;вылючаем ;обработчик ;если кнопка прерыванияexit_int0temp2,0x02 была нажатия отпущена на кнопку выходим из ;нажата 2-я кнопкаPCICR,temp ;разрешение прерываний при изменении состояния на входе 5 порта Dtemp,0b00100000 ;задание маски для активации прерыванийPCMSK0,temp ;прерывания разрешены при изменении состояния на входе 5 порта D sbi portD,1 ;включаем передатчикtimer_clear_start ;обнуляем таймер и запускаем sbi portD,0 ;вылючаем передатчикexit_int0: ;обработчик нажатия на кнопку 3pinD,4 отпущена выходим из прерыванияexit_int0 ;если кнопка была ;обнуляем результаты измерения в ОЗУ для 2-х строк ldi temp,0x30zh,high(izm1+3)zl,low(izm1+3)zerowrtemp,0x30zh,high(izm2+3)zl,low(iz m2+3)zerowr rcall display ;выводим на дисплей нулиexit_int0: ;обработчик прерывания импульсаtemp,(1<<cs11) по ;останавливаем приходу отраженного таймерtccr1b,tempmc16uL,tcnt1l ;записываем содержимое таймера в множительmc16uh,tcnt1hmp16uL,0x07 ;записываем константу расстоянияmp16uh,0x00mpy16u умноженияbin2BCD16 ;вызоваем двоично-десячичное числоtemp,0 в множитель для ;вызоваем процедуру рассчета процедуру перевода ;в зависимости от выбранной строчки перходим по метку rjmp foto1temp,1foto2 rjmp exit_int0:ZL,Low(izm1) ;устанавливам на изменение 1-й строчку ldi ZH,High(izm1)digitwr rjmp exit_int0 :ZL,Low(izm2) ;устанавливам на изменение 2-ю строчку ldi ZH,High(izm2)digitwrexit_int0 ;******* _clear_start: в ;очистка таймера и старт temptcnt1h,temptcnt1l,temptemp,(1<<cs11)tccr1b,temp :temp,r11digitwr2temp,r10digitwr2:temp2,0x30temptemptemp,0x0ftemp,temp 2z+,temptemptemp,0x0ftemp,temp2z+,temp ret: z+,temp ;запись в ОЗУ по адрессу Z переменной temp st z+,temp z+,temp st z+,temp ;*************************************************************** ************ ; выделение памяти в озу для результатов измерения ;*************************************************************** ************ .dseg: .byte 17 ;резервируем 17 байт: .byte 17