Реферат: Микропроцессорная система управления, предназначенная для использования на лесопильном заводе

Министерство образованияРоссийской Федерации

Уральскийгосударственный технический университет

КафедраАвтоматика и управление в технических системах

Зав. каф. В.Г. Лисиенко

_____________________

Оценка проекта

Микропроцессорная система управления,предназначенная для использования на лесопильном заводе

 

Курсовойпроект

Пояснительнаязаписка

1909 420 000030 ПЗ

Руководитель                                                                МокрецовВ.П.

Студент                                                                         ДаниловД.

Р-311а                                                                           МолоковТ.

Екатеринбург2006


Содержание

 

Постановка задачи

Описание принципа действия системы

Аппаратная часть микропроцессорнойсистемы

Программная часть микропроцессорнойсистемы

Заключение


Постановказадачи

Требуется разработатьмикропроцессорную систему управления, предназначенную для использования налесопильном заводе. Лесопильная установка имеет конвейер, который доставляетбревна к распилочным механизмам. Бревна лежат на ленте конвейера вдоль нее поодному на ширину ленты.

Искомая микропроцессорнаясистема (в дальнейшем просто МП система) должна нести следующие функции и иметьсвойства:

- Измерить диаметркаждого бревна, проходящего по конвейеру, и, если он не укладывается в рамки[20…50]см, то считать бревно бракованным и не подавать его на распилку;

- Измерить длину lбр каждого бревна и вычислить его объемVi; суммируя объемы неотбракованныхбревен, подсчитывать общий объем распиленной древесины VS;

- По включениипитания МП система должна проводить самотестирование (POST – power on self test) и самоинициализацию;

- Система должнавключать ОЗУ, ПЗУ, часы реального времени;

- Информация должнаотображаться на восьми буквенно-цифровых индикаторах.

Цель курсовой работы –спроектировать аппаратную и программную части МП системы. Аппаратную основусистемы составляет микропроцессор Z80 фирмы Zilog. В задачукурсовой работы не входит подробное проектирование приводов и другихмеханизмов, однако их рассмотрение потребуется для написания управляющейпрограммы.


Описание принципа действия системы

 Общая структура

На рис. 1 изображенасхема “вход-выход” МП системы.

/> 

Рис. 1 Структура“вход-выход” МП системы

Цифровые сигналы сдатчиков диаметра и длины бревна поступают в систему, формируется сигналотбраковки. Затем система, имитируя калькулятор, рассчитывает Vi и обновляет сумму VS, храня эти величины в памяти. Взависимости от двух кнопок управления индикацией (одна из них, будучи нажатой,переводит в отжатое положение другую) на индикаторах отображается VS или текущее время. Для начальнойустановки часов есть 2 кнопки управления таймером, увеличивающие на единицучасы и минуты. Имеется кнопка включения/выключения питания “Вкл”.


Обзордатчиков и способа отбраковки

Чтобывычислить объем бревна Vi, МП система должна “знать” формулудля вычисления. Формула для расчета Vi (в предположении, что бревно –круглый цилиндр):

/>.                                                                               (1)

/>   

Рис. 2 Конструкциядатчиков и механизма отбраковки

Чтобы найти диаметр d и длину lбр, надо знать конструкцию датчиков(рис. 2).

Датчик диаметра устроенследующим образом: бревно, двигаясь по конвейеру, отклоняет пластину , вращающуюся на горизонтальной оси,на угол a. Этот угол через редуктор ‚ подается на ось переменногорезистора. Переменный резистор Rd включен в потенциометрический датчик (рис.3). Напряжение Ud с этого датчика подается в МП систему,где оцифровывается с помощью АЦП.


/>

Рис. 3 ПотенциометрическийдатчикРасчет диаметра идет поформуле:  d= hlпл cos a, т.е. надо знать угол a.                                (2)Микропроцессор же имеетлишь напряжение Ud.По нему надо рассчитать текущее сопротивление переменного резистора Rd (см. формулу на рис.3), из негонайти угол поворота оси резистора, которому соответствует это текущеесопротивление, из него, зная передаточное отношение редуктора, определить a.Примем следующиедопущения:- номинал Rдоб=1 КОм; номинал Rd (переменное)=5,1 КОм; напряжениепитания датчика U=12 В.Примечание: при этом диапазон Ud составляет [0; 10]В.- особенностиконструкции – а именно крепления переменного резистора и передаточногоотношения редуктора – таковы, что если a=0 (пластина вертикальна), то текущееRd =0;если a=90° (пластина горизонтальна), то Rd<sub/>=Rdmax<sub/>=5,1 КОм (максимально).

Примечание: данноетребование однозначно определяет передаточное отношение редуктора – оно будетравно i1-2=90°/amax, где amax – угловой диапазон поворота осирезистора в градусах (т.к. при повороте пластины на 90° ось резистора поворачивается на amax)

Это допущение означает,что угол a может бытьвычислен из максимального значения переменного резистора как

/>.

- последнеедопущение: пусть h=62,5см=0,625м;lпл=50см=0,5м.

Получается формула перехода от Ud к a:

/>                                          (3)

/>

Напряжение с датчика Udв системе измеряется с помощью 10-разрядного АЦП, рассчитанного на максимальноевходное напряжение 10,5 В. Микропроцессор читает с АЦП не напряжение в вольтах,а его код – число в диапазоне [0..3FFH]=[0..102310]. Поэтому формулу (3) надо изменить,преобразовав напряжение 12 вольт в такой же код, исходя из интервала дискретностиАЦП. Он равен д=10,5/1023=1,026×10-2 В. Отсюда 12 вольт будет изображатьсявеличиной 12/ д »1169единиц.Итоговая формула перехода от Ud к a:/> [рад]          (4)Подставим числа в формулу длядиаметра (2):

 

d= 0,625 – 0,5cos a                                                     (5)

Сделаем вывод. Микропроцессор дляизмерения диаметра делает такие шаги. Зная Ud в виде кода, находит угол a в радианах – формула (4). Зная a, находит диаметр d – формула (5).

Датчик длины бревна основан на двух фотоэлементахФэл1 и Фэл2 (ƒ нарис.2), поставленных вдоль конвейера на расстоянии l=1м друг от друга и двух таймерах внутримикропроцессорной системы. Фотоэлементы регистрируют смену освещенности“свет–темнота” и “темнота–свет”. Принципиально замер длины основан напредположении, что скорость ленты конвейера v постоянна.

Таймеры замеряют два интервалавремени:

T1 – период времени, в течениекоторого передний край бревна проползет от Фэл1 к Фэл2;

Т2 – период времени, втечение которого бревно полностью проползет Фэл1.

/>   => />                                                 (6)

Фотоэлемент устроенследующим образом (рис. 4):

/>Рис.4Принципиальная схема фотоэлемента

Лампа HL1 – обычная лампа накаливания, еесвет сфокусирован отражателем на “своем” светоприемнике. Если свет доходит досветоприемника (бревно не загораживает) то транзистор открыт, на выходефотоэлемента низкий уровень (0), иначе (в темноте) на выходе высокий уровень(1). Выходы Фэл1 и Фэл2 являются входами МП системы.

Алгоритм измерения длиныбревна будет таким. Последовательно:

если на Фэл1 перепад 0-1(“свет–темнота”), то старт таймеров Т1, Т2;

если на Фэл2 перепад 0-1стоп таймера Т1;

по перепаду Фэл1 1-0(“темнота–свет ”) стоп таймера Т2;

рассчитать длину поформуле (6).

Отметим: если во времяработы, когда бревно проходит мимо и загораживает один из фотоэлементов,конвейер остановится, то будет замерена неверная неправдоподобно большая длина,возможно, будет переполнение таймеров. Аналогично, если в момент включенияпитания МП системы бревно уже лежит на конвейере, то его длина не может бытьизмерена. Во избежание этих ситуаций надо: сделать невозможной остановкуконвейера при включенной МП системе; в алгоритм самотестирования (POST) добавить проверку фотоэлементов наготовность (удостовериться, что их светоприемные части освещены).

Механизмотбраковки рассмотрим менее подробно. МП система должна лишь выдать сигналлогической “1” для бракованного бревна и “0” для нормального. Сигнал выдается вмомент, когда задняя кромка бревна минует Фэл2 (по перепаду Фэл2 1-0). Далее онусиливается и подается на привод отбраковки. Привод (не вдаваясь в подробности)при наличии “1” на его входе поднимает вверх постоянно движущийся поперечныйконвейер („ на рис. 2), и он сбрасывает бревно сосновного конвейера.

 

Аппаратная часть микропроцессорной системы

Общиехарактеристики

Общая направленностьпредлагаемой конструкции системы характеризуется тем, что система ориентированана работу с памятью, портами ввода-вывода и прерываниями. Подсистема прямогодоступа у памяти вообще не используется, т.к. в ее использовании не возниклосерьезной необходимости: при работе управляющей программы нет такого внешнегоустройства, которое бы вело интенсивный обмен данными с памятью.

Структура системыприведена на рис. 5.

/>Рис.5 Структура микропроцессорнойсистемы

Ниже следуют пояснения покаждому блоку рис.5.

Блок центральногопроцессора, память и шины системы

“Сердцем” всей МП системыявляется микропроцессор (МП) Z80 (или его отечественный аналог – КР1856ВМ1).

Вкратце опишемиспользуемые в МП системе выводы микропроцессора.

Сигналы, которые активныв нуле, будем отмечать суффиксом “#”.

- CLK – входтактовой частоты 4 МГц;

- RESET# – входсброса (активен в нуле);

- MREQ# – выходзапроса памяти. Нулевое состояние свидетельствует, что микропроцессоробращается к памяти для чтения или записи;

- IORQ# – выходзапроса портов ввода/вывода. Нулевое состояние означает, что идет обращение кпортам;

- RD# – чтение.Активен, когда микропроцессор инициирует операцию чтения из памяти или изустройства ввода/вывода;

- WR# – запись. Тоже, что и RD#, но для операции записи;

- A0-A15 – шинаадреса. Имеет 16 линий и используется для адресации к максимум 65535 ячейкампамяти и устройствам ввода-вывода;

- D0-D7 – шинаданных. Восемь двунаправленных линий, используемых, для ввода/вывода данныхмикропроцессора, памяти и периферийных устройств.

- INT# – входпрерывания. Нуль на этом входе означает наличие запроса на прерывание отвнешнего устройства.

- M1# – выход первого машинного цикла.Нуль на этом выходе показывает, что микропроцессор производит выборку кодаоперации. В нашей системе этот выход совместно с IORQ# служит для подтверждения прерывания.

Тактовым генераторомслужит мультивибратор, собранный на двух инверторах. Времязадающими цепямиявляются конденсатор, сопротивления и резонатор. Частота генератора 16 МГц (каки резонатора Z1). Затем эта частота двумя триггерами делится на 4, получаетсятактовая частота 4 МГц, которая и подается на вход CLK. Деление частоты нужно длябольшей ее точности.

Кнопка “RESET” в нажатомсостоянии подает на соответствующий вход микропроцессора сигнал сброса. Дляустранения эффекта “дребезга контактов” сигнал RESET# подается через D-триггер,записываясь в него по фронту первого же тактового импульса с линии CLK.

Для организации шинадреса (ША), данных (ШД), управления (ШУ) микропроцессорной системы ксоответствующим выходам микропроцессора подключены буферные элементы. Ихнагрузочная способность гораздо больше нагрузочной способности выводов микропроцессора.Они являются повторителями и “цифровыми усилителями” сигналов микропроцессора.Для ША это два 8-разрядных регистра ИР82. Для ШД – специальная микросхема –8-разрядный двунаправленный шинный формирователь с возможным Z-состояниемвыводов.

Четыре сигнала управления(WR#, RD#, MREQ#, IORQ#) сначала подвергаются дешифрации. Объединенные по схемеИЛИ сигналы RD# и MREQ# дают в результате сигнал MEMRD# чтения памяти.Аналогично получены сигналы чтения порта IORD# и записи в порт IOWR#. Ещеполучен сигнал WR#/RD, который равен 0, когда активен сигнал WR# и равен 1,когда активен RD#. Пять сигналов (MEMRD#, MREQ#, WR#/RD, IORD#, IOWR#) понадобятся при организации обращения к памяти ипортам. Все они объединены в 5-разрядную шину управления (ШУ), которая такжеимеет шинный формирователь.

Рассмотрим подключениемикросхем памяти. Всего подключено 2К ПЗУ на одной микросхеме К541РЕ1 (адресноепространство 0000H – 07FFH) и 4К ОЗУ на двух микросхемахК537РУ8 (адреса 0800H – 17FFH). Принцип работымикропроцессора с памятью следующий. В первом такте машинного цикла обращения кпамяти (чтения или записи) процессор выдает на ША адрес запрашиваемой ячейки.Этот адрес дешифруется так, что вход CS (выбор кристалла) соответствующейадресу микросхемы становится активным (нулем), сигнализируя, что эта микросхемавыбрана для операции. Во втором такте МП формирует на шине управления сигналыуправления. Сигнал MEMRD# подается на вход разрешения операции микросхемы ПЗУ.Сигнал WR#/RD подается на одноименные входы микросхем ОЗУ, а сигнал MREQ# – на вход разрешения операциимикросхем ОЗУ. Итак, чтение/запись микросхемы памяти происходит, еслиодновременно выполнены два условия: микросхема выбрана адресом и ей разрешенаоперация сигналами управления.

Порты ввода-вывода

Всего МП система имеет 14байт портов ввода и вывода. На рис. 5 можно видеть их адреса в пространствеввода-вывода.

Механизм действия портованалогичен действию микросхем памяти. Адрес порта на ША дешифруется вдвенадцать сигналов выбора кристалла CS0#–CS13#, а каждый порт имеетвозможность управляемого чтения/записи. Для порта ввода (порт диаметра)одновременно активные CSi# и IORD# стробируют выдачу одного байта нашину данных. Для порта вывода одновременно активные CSi# и IOWR#стробируют запись байта с шины данных в регистр порта.

Адреса портовввода-вывода дешифруются отдельным дешифратором ИД3 с четырьмя входами и 16-ювыходами (первые 14 из которых – CS0#–CS13#). На входы подается младшая тетрадашины адреса – номер адресуемого порта, на всех выходах дешифратора образуютсяединицы, кроме одного нулевого выхода, имеющего этот номер.

Два адресам контроллерапрерываний (0C-0D) дешифруются в один сигнал выборки кристалла, при этомконтроллер принимает бит A0адреса и самостоятельно разбирается, к какому из двух адресов идет обращение.

Порт ввода диаметра.Двухбайтный порт, выбирается адресами 00 и 01 (сигналами CS0# и CS1#). Датчик диаметра бревна является аналоговым. Чтобы ввестичисловое значение диаметра в МП и использовать его в вычислениях, надопреобразовать напряжение с датчика в цифровой код. Этим занимается АЦП наспециальной микросхеме К1113ПВ1А. Это 10-разрядный АЦП с выходными цифровымиуровнями ТТЛ с возможностью преобразования однополярного аналогового сигнала вдиапазоне [0..10,5]В или биполярного сигнала в диапазоне [-5,5..5,5]В. Мыиспользуем АЦП в однополярном режиме, поэтому вход 15 (Z1) присоединен к массе. Преобразуемое аналоговое напряжениеподается на вход 13 (вход A). По заднему фронту (спаду) импульса на входе 11 (RES) АЦП сбрасывается и начинаетпреобразование. Преобразование занимает некоторое время (около 30 мкс). Поокончании микросхема АЦП на выходах D0–D9 выводит итоговый цифровой код, а навыходе готовности данных 17 (RDY) выставляет логический 0, сигнализирующий“преобразование окончено”. На этом работа АЦП заканчивается.

Далее в МП системе сигналс выхода АЦП RDY несет две функции: стробирует запись кода диаметра с АЦП в двабуферных регистра ИР82 и посылает сигнал запроса прерывания на вход IR2контроллера прерываний.На вход RES АЦП мы подаем импульсы частотой ЅГц, соответственно, раз в две секунды возникает прерывание IRQ2. Обработчикэтого прерывания, при условии, что бревно сейчас под пластиной датчика (этаинформацию можно прочесть из порта статуса фотоэлементов, описанного ниже) будетчитать регистры диаметра в некий массив диаметров в ОЗУ. По прохождении бревна,когда запускается вычисление объема бревна, все введенные диаметры усредняютсяи в вычислениях используется среднее значение всех мгновенных диаметров.

Порт вывода сигналаотбраковки (адрес 02). Представляет собой обычный D-триггер. По одновременнымсигналам CS2# и IOWR# в триггер записывается младший бит D0 шины адреса.Программа устанавливает D0=1, если бревно бракованное, иначе D0=0.

Порт вывода на индикаторы(8 байт). В эти ячейки программа заносит семисегментный код, выводимый наиндикаторы. Сигналы выборки кристаллов индикаторов в схеме – CS3# (самый левыйиндикатор)…CS10# (самый правый).

Есть одна особенностьиндикации. На индикаторы возможен вывод объема VS или текущего времени – должнозависеть от кнопок управления индикацией на панели оператора. Пусть этивеличины в семисегментном коде хранятся в разных ячейках памяти (каждая по 8байт). Процессор, выполняя управляющую программу, то и дело копирует ихсодержимое в порт. Ячейку VS – в порт (03..0A), а ячейку времени – в порт (13..1A).Как говорилось ранее, приобращении к портам дешифруются лишь младшие 4 бита с шины адреса. Поэтому и втом, и в другом случае обращение идет к одним и тем же физическим индикаторам.Дополнительной дешифрации, зависимой от кнопок управления индикации,подвергается бит A4 адреса. Если A4=1, значит, процессор пытается индицировать время, приэтом нажатая кнопка “время” разрешает прохождение сигналов выборки кристалла.А в отжатом положении сигналы выборки не пройдут, и индикация не состоится.Аналогично нажатая кнопка “VS” разрешает адресацию к индикаторам при A4=0.Этот вариант “двойнойадресации” свою относительную сложность искупает экономией лишних 8-мирегистров, которые понадобились бы, если делать отдельные порты вывода для VS и для времени.

Порт ввода статусафотоэлементов. Этот порт (адрес 0B)необходим для использования при первоначальном тестировании, когда системапроверяет готовность фотоэлементов (контролирует выходы Фэл1 и Фэл2 на ноль).Во время работы содержимое порта несет смысл статуса обработки и помогаетразобраться, на какой стадии своего движения находится бревно.

В порте действительнонесут информацию только 2 бита: D0 – осостоянии Фэл1 (ноль на выходе Фэл1 или единица), D1 – о статусе Фэл2. Ноль свидетельствует об успешномпрохождении света от лампы к светоприемнику фотоэлемента, единица – о том, чтосвет не проходит.

Порт контроллерапрерываний (адреса 0C и 0D). Используется для адресациирегистров контроллера: сигналы CS12#и CS13#, объединенные по ИЛИ, подаются наего вход выбора кристалла.


Подсистемапрерываний

МП система должнапериодически опрашивать датчики и оперативно реагировать на изменение ихсостояния. Один из вариантов опроса – МП в цикле управляющей программыопрашивает все датчики, анализирует их состояние; инициатива при вводе-выводеинформации принадлежит микропроцессору. Второй вариант – опрос по прерываниям:само внешнее устройство, приготовив данные, подает к МП сигнал прерывания и тотсчитывает эти данные, выполняя процедуру обработки прерывания. Очевидно, чтодля нашей системы второй вариант преимуществен: медленно меняющийся диаметрлучше считывать по внешней периодической синхронизации (например, Ѕ Гц), чем вкаждом цикле управляющей программы. Сигналы с фотоэлементов (точнее, ихперепады, после которых надо производить старт/стоп таймеров), которые похожина “исключительные ситуации”, также логичнее обрабатывать по прерываниям.Наконец, прерывания помогают организовать программно часы реального времени итаймеры T1 и T2, экономя на микросхемах. Недостаток только один: приходитсяусложнять систему, вводя программируемый контроллер прерываний (ПКП).

Опишем прерывания в МПсистеме.

1)  IRQ0. Прерывание возникает поперепаду 0-1 на выходе фотоэлемента Фэл1. Обработчик должен сбросить изапустить таймеры T1 и T2.

2)  IRQ1. Возникает по перепаду 1-0 наФэл2 и означает, что измерения закончены, бревно полностью вышло из областидействия датчиков. Обработчик должен рассчитать объем бревна Vi,суммарный объем VS и сформировать сигнал отбраковки.

3)  IRQ2. Появляется по сигналуготовности данных на АЦП. Обработчик вводит 2 байта диаметра.

4)  IRQ3. Источником служит генератор на16 Гц. Обработчик делает инкремент часов реального времени и условный инкременттаймеров (анализируя информацию статуса):

Если слово статуса ФЭЛ равно: Инкремент T1 xxxxxx01 Инкремент T2 xxxxxx01 или xxxxxx11 Нет инкремента иначе (xxxxxx00 или xxxxxx10)

5)  IRQ4 и 6) IRQ5. Сигналы приходят откнопок “+Час” и “+Мин” на панели оператора. Обработчик незамедлительноинкрементирует часы (минуты) реального времени.

6)  Казалось бы, перепады на выходахфотоэлементов равноценны, и перепады сигналов 1-0 на Фэл1 и 0-1 на Фэл2 стоилобы тоже обрабатывать по прерываниям. Но это не нужно. Обработчики этихпрерываний несли бы одну функцию: стоп того или другого таймера. А попрерыванию IRQ3 делается условный инкременттаймеров, т.е. таймер не надо останавливать, он остановится сам собой, когдасигналы с фотоэлементов придут в определенное сочетание (см. таблицу).

Сигналы запросов IRQi приходят на входы IR0–IR5 программируемого контроллера прерываний (запросыпринимаются по переходу 0®1).Используется режим работы ПКП с фиксированными приоритетами прерываний.Максимальный приоритет имеет запрос IR0, минимальный – запрос IR5.На этом распределении приоритетов, кстати, основан выбор номеров для прерываний:чтобы прерывания, функционально более важные (от фотоэлементов и АЦП) имелибольший приоритет, чем прерывания, несущие декоративный смысл (от часов икнопок управления часами).

По выходу INT контроллер передает процессору запросна прерывание. Процессор формирует сигналы подтверждения прерывания, приходящиена вход INTA контроллера.

Рассмотрим подключениеостальных выводов. Контроллер будет работать в одиночном (не каскадном) режиме– это контролирует вывод SP=0микросхемы.

На вход выбора кристалла CS подается дешифрованный адрес. Навход A0 подается нулевой разряд адреса.Выводы каскадирования CAS0–CAS2 остаются неподключенными. Выводы D0–D7 подключены к шине данных.

Перед работой ПКП нужноинициализировать. Управляющая программа делает это во время самотестированиясистемы. При инициализации нужно сообщить контроллеру адреса процедур обработкипрерываний.

 

Программная часть микропроцессорной системы

Тестирующиепрограммы

Тестовые программызапускаются сразу по включении питания микропроцессорной системы перед началомработы. Это тест ОЗУ, ПЗУ, тест фотоэлементов, инициализация программируемогоконтроллера прерываний, инициализация переменных системы.

ТестОЗУ

Тест ОЗУ состоит впроверке всех ячеек ОЗУ на запись и верное считывание байтов 00Н иFFН. Если для какой-то ячейки совпадение записанного и прочитанногозначений не состоялось, происходит переход на подпрограмму E_RAM, в регистровойпаре HL при этом адрес неисправной ячейки.

Листинг 1: тест ОЗУ

; – – – тест ОЗУ (адреса0800…17FF)

                   TST_RAM LD     HL,0800   ; HL¬начало областиОЗУ

                   TST_RAM1         XOR A               ;A=0

                   LD     (HL), A                ;записать 0 в ячейку памяти

                   LD     A, (HL)                ;прочитать эту ячейку

                   OR    A                ;

                   JP      NZ, E_RAM        ;если в ячейке не ноль, то выход

                   CPL                     ;инвертировать A (A=FF)

                   LD     (HL), A                ;записать FF в ячейку памяти

                   LD     A, (HL)                ;прочитать эту ячейку

                   INC   A               ;если прочитано A=FF, то A=FF+1=0

                   JP      NZ, E_RAM        ;иначе выход

                   INC   HL             ;к следующему адресу

                   LD     A, H           ;проверить на достижение конца ОЗУ

                   CP     #18             ;

                   JR     NZ,TST_RAM1 ; конец цикла

                   …                        ;тест ОЗУ успешен, продолжение тестов

Подпрограмма E_RAM – этобесконечный цикл вывода на индикаторы признака ошибки ОЗУ (строки “Е1”) иадреса неисправной ячейки (например, “Е1 12AF”). Естественно, при этомдальнейшее выполнение управляющей программы и функционирование системыотменяется (поэтому переход на E_RAM выполняется командой JP, а не CALL). Поадресу можно определить, какая именно (из двух) микросхема памяти подлежит замене.

Независимый от кнопокуправления индикацией вывод на индикаторы семисегментным кодом производитсячерез 8-байтный порт вывода 03..0A и через порт 13..1A одновременно (см.п.3.3). Адрес 0A (он же 1A) соответствует самому левому индикатору, адрес 03(он же 13) – самому правому.

Декодирование издвоичного в семисегментный код делается с помощью массива перекодировки длиной16 байт, расположенного в ПЗУ по начальному адресу 0700Н:

0700           3F06 5B 4F 66 6D 7D 07     ; “0”–“7”

0708           7F6F 77 7C 39 5E 79 71       ; “8”–“F”

Для декодированияшестнадцатиричной цифры в семисегментный код достаточно извлечь из массиваэлемент с индексом, равным этой цифре.

Важно то, что процедура E_RAM необращается к памяти ни напрямую, ни через стек – она хранит все свои данные врегистрах и записывает только в порты индикаторов.

 

Листинг 2: процедура E_RAM, вызываемая послеошибки ОЗУ

; – – – обработка ошибкиОЗУ (код “E1”)

E_RAM      EX    DE, HL      ;адрес-операнд из HL перенести в DE

LD     H, #07       ; H¬старший байт адреса таблицы кодов

LD     A, E            ;

AND #0F            ;выделяем младшую тетраду в E

LD     L, A           ;извлекаем элемент с этим номером из массива

LD     C, (HL)      ; врегистр C

                            ;теперь C=код, посылаемый на 8-й индикатор

LD     A, D            ;

AND #0F            ;выделяем младшую тетраду в D

LD     L, A            ;

LD     B, (HL)      ;теперь B=код, выводимый на 6-й индикатор

SRL   D               ;четырежды сдвигаем D вправо (0®D®CY)

SRL   D               ;заполняя старшие биты нулями

SRL   D                ;

SRL   D                ;

SRL   E                ;четырежды сдвигаем E вправо (0®D®CY)

SRL   E                ;заполняя старшие биты нулями

SRL   E                 ;

SRL   E                 ;

LD     L, E            ;теперь необходимости в наложении маски нет

LD     E, (HL)      ;E=код, выводимый на 7-й индикатор

LD     L, D            ;

          LD     D, (HL)      ;D=код, выводимый на 5-й индикатор

                                      ; цикл вывода на индикаторы

E_RAM1    LD     A, #79;A¬семисегментный код символа “E”

          OUT  (#0A), A    ;в 1-й слева индикатор

          OUT  (#1A), A     ;

LD     A, #06                 ;A¬“1”

OUT  (#09), A               ;во 2-й индикатор

OUT  (#19), A                ;

          XOR A               ;A¬“ ” (пусто)

          OUT  (#08),A     ; в 3-й

          OUT  (#18),A      ;

          OUT  (#07),A     ; в 4-й

          OUT  (#17),A      ;

          LD     A, D           ; выводим DBECна индикаторы 5678

          OUT  (#06), A      ;

          OUT  (#16),A     ;

          LD     A,B            ;

          OUT  (#05),A      ;

          OUT  (#15),A     ;

          LD     A,E            ;

          OUT  (#04),A      ;

          OUT  (#14),A     ;

          LD     A,C            ;

          OUT  (#03), A      ;

          OUT  (#13), A     ;

          JR     E_RAM1   ;переход на начало цикла


Тест ПЗУ

Тест ПЗУ состоит ввычислении контрольной суммы ПЗУ, т.е. суммы всех байтов в ПЗУ без учетапереполнения суммы, и сравнении полученной суммы с известным эталоннымзначением. Несовпадение свидетельствует о явной неисправности ПЗУ, совпадениене обязательно говорит об его исправности (могут быть, хотя маловероятно, двекомпенсирующие друг друга ошибки).

Для этого теста (чтобызнать эталон, с которым сравнивать) надо иметь все подпрограммы ПЗУ. Однакосейчас мы только на стадии заполнения постоянной памяти. Предлагается следующийпуть: в составленной ниже программе теста ПЗУ вычисляем контрольную сумму исравниваем ее с нулем. А после того, как запрограммируем ПЗУ полностью,последнюю ячейку ПЗУ (17FFН) оставим свободной и занесем в неечисло, дополняющее сумму всего ПЗУ без последней ячейки до нуля.

Получив в сумме всехячеек ПЗУ не ноль, программа тестирования вызывает зацикленную подпрограммуE_ROM, имея в регистре E число 2, характеризующее код ошибки.

 

Листинг 3: Тест ПЗУ

         ; – – –вычисление контрольной суммы ПЗУ

TST_ROM XOR A               ;A=0

          LD     H,A            ;

          LD     L,A           ; HL=0

TST_ROM1         ADD A,(HL)      ; A¬A+(HL)

          INC   HL             ; увеличитьадрес ПЗУ на 1

          LD     B, A           ;сохранить сумму A на время

          LD     A, H           ;и проверить, достигли ли конца ПЗУ

          CP     #08              ;

          LD     A, B           ;восстановить сумму A

          JR     NZ, TST_ROM1;

          OR    A               ;если конец ПЗУ, проверить A на ноль

          LD     E, 2             ;

          JP      NZ,E_ROM        ; если не ноль, то ошибка ПЗУ

          …                        ;иначе тест ПЗУ успешен, продолжаем тесты

Подпрограмма E_ROM выводит на двасамых левых индикатора условный код ошибки ПЗУ (“E2”), а остальные индикаторыгасит. Индикация такой ошибки говорит о необходимости проверки иперепрограммирования микросхемы ПЗУ.

Листинг 4: процедура E_ROM, вызываемая послеошибки ПЗУ

                  ; – –– обработка ошибки ПЗУ (код “E2”)

                   E_ROM                LD     A,#79                 ; A¬“E”

                   OUT  (#0A),A     ;

                   LD     A,E           ; A¬код ошибки (2)

                   OUT  (#09),A                ;

                   XOR A               ;A¬“0”

                   LD     C,#08                  ;

                   LD     D, #18                  ;

                   LD     B,6            ; счетчик

                   E_ROM1    OUT  (C),A                  ; последние шесть индикаторов гасим

                   OUT  (D), A                   ;

                   DEC  C                 ;

                   DEC  D                ;

                   DJNZ          E_ROM1    ;

                   JR     E_ROM                ;


Тест фотоэлементов

Перед началом работынужно проверить прохождение света от ламп к фотоэлементам. Если один изфотоприемников не чувствует света, это значит, что или перегорела лампафотоэлемента, или в момент пуска бревно уже лежит между фотоэлементами и егодлина не может быть измерена, или повредился канал от фотоэлемента кпроцессору. В обоих случаях микропроцессорная система не начнет свою работу(т.к. нет возможности отличить второй случай от остальных). При обнаружениитакой ошибки на индикаторы выводится признак ошибки фотоэлемента в видеусловного кода “E3”.

В программе этого тестачитается порт ввода статуса фотоэлементов (адрес 0B) и проверяются на ноль дваего младших бита. Если хотя бы один не равен нулю, то происходит переход на обработчикошибки. Причем для обработки ошибки можно использовать ту же процедуру E_ROM,перед вызовом загрузив в регистр E код ошибки 3 (экономия памяти).

 

Листинг 5: тест фотоэлементов

; – – – проверка двухмладших битов порта ФЭЛ на 0

TST_FEL   IN      A,(#0B)    ; прочесть слово статуса ФЭЛ

AND 3                                     ;наложить на него маску 000000112

LD     E, 3                                 ;

JP      NZ, E_ROM                  ;если не ноль, то ошибка

…                                            ; иначе продолжаем тесты

 

Инициализацияпрограммируемого контроллера прерываний

Для инициализацииконтроллера надо переслать ему два управляющих слова ICW1 и ICW2, первое поадресу 0CН (A0=0), второе – по адресу 0DН (A0=1).

Пересылаются следующиеуправляющие слова:

/>

Рис. 6 Применяемыеуправляющие слова инициализации ПКП

Слово ICW1 установитодиночный (без каскадного соединения) режим работы ПКП (бит 1), 4-хбайтныйинтервал для начальных адресов обработчиков прерываний (бит 2).

Биты 5–7 слова ICW1вместе со всем словом ICW2 сообщат контроллеру, что первый обработчик (запросаIR0) начинается с адреса 0020Н.

Контроллер накладываетопределенные ограничения на расположение обработчиков в памяти. Первое из них втом, подпрограммы обработки прерываний должны располагаться по порядку, начинаяс адреса обработчика запроса IR0, и с постоянным интервалом, т.е. образовыватьв памяти таблицу. Интервал расположения может составлять 4 байта (если бит 2ICW1 равен единице, как в нашем случае), или 8 байт (если бит 2 равен нулю).При постоянном интервале адреса всех обработчиков определятся расположениемпервого (IR0).

Адрес первого обработчикасоставляется из полного слова ICW2 (старший байт) и битов 7,6,5 слова ICW1(старшие три бита младшего байта адреса).

В нашем случае старшийбайт равен 00Н, младший байт равен 0010 0000 = 20Н.Обработчики имеют начальные адреса: 0020H, 0024H, 0028H,002CH, 0030H, 0034H (6 обработчиков).

Процедура INI_PICинициализирует контроллер.

Листинг 6: инициализация программируемогоконтроллера прерываний

; – – – переслать 38Hв порт 0CH и 0 в порт 0DH

INI_PIC      LD     A,#38                  ;

                   OUT  (#0C),A               ;

                   XOR A                ;

                   OUT  (#0D), A     ;

Инициализацияпеременных системы

В системе за некоторымиячейками памяти закреплена функция хранения переменных. Например, подсчитанныйсуммарный объем древесины VS в двоичном формате хранится в отдельных двух байтахпамяти с адресами V_SUM, V_SUM+1.

Требуют инициализациитолько две переменные (инициализируются нулем):

VS (2 байта) – начальный адрес V_SUM;

Время (4 байта) – начальный адрес TIME.

Ясно, что эти имена(V_SUM и TIME) лишь условные обозначения (также, как, например, имена меток влистингах программ). При переводе в машинный код эти имена транслируются вдвухбайтный адрес.

Листинг 7: инициализация ячеек суммарногообъема и времени

; – – – начальноеобнуление объема и времени

INI_VAR    XOR A                ;

LD     (V_SUM),A        ;

LD     (V_SUM+1),A    ;

LD     (V_SUM+2),A    ;

LD     (TIME),A   ;

LD     (TIME+1),A        ;

LD     (TIME+2),A        ;

LD     (TIME+3), A        ;

…                        ;следует продолжение переходит к основному циклу работы (описание см. в п.4.4).


Арифметическиеподпрограммы

Микропроцессорной системенеобходимо “уметь” выполнять арифметические операции: сложение, вычитание,умножение, деление и косинус. В этом же разделе приведем и неарифметическиепроцедуры для осуществления индикации: преобразования данных вдвоично-десятичный код и в семисегментный.

Основным форматом чисел вМП системе является двухбайтный формат с фиксированной точкой вида 1байт, 1байт. Форматбеззнаковый, предполагается, что числа положительны. Одно число умещается водной регистровой паре. Минимальное представимое число – 0,01H=1/256=3,9×10-3, максимальное – FF,FFН=256,996.

Общие правила для всехвычислительных процедур:

- программиствызывающей программы сам следит, чтобы операнды и результат не выходили запределы представления и чтобы при вычитании не образовалось отрицательныхвеличин;

- операнды присложении, вычитании, умножении, делении хранятся в регистровых парах HL и DE,результат в HL. Процедура косинуса получает операнд и выводит результат в пареHL.

Сложение

В микропроцессоре Z80есть команда сложения регистровых пар ADD HL, DE. Однако, чтобы сохранитьединообразие, оформим ее все же как подпрограмму.

Листинг 8: подпрограмма PLUS

; – – – подпрограммасложения

; HL+DE®HL

; сохраняет A, BC, DE

PLUS                   ADD HL,DE                 ;

                   RET                     ;

Вычитание

В Z80 есть командавычитания регистровых пар с учетом переноса SBC HL, DE. Используем ее вподпрограмме вычитания, обнулив прежде флаг CY.

Листинг 9: подпрограмма MINUS

; – – – подпрограммасложения

; HL–DE®HL

; сохраняет A, BC, DE

MINUS                OR    A               ;A не меняется, но флаг CY=0

SBC  HL, DE                 ;

RET                     ;

Умножение

При умножении первыймножитель хранится в паре BC (скопируем его туда из HL в начале), второймножитель хранится в DE. Результат первоначально получается в четырехбайтномвиде HL.DE, затем “обрезается” до H.L.

Результат произведения накапливаетсяв HLDE. В течение 16 циклов сдвигов HLDE второй множитель DE постепенновыдвигаясь, уходит вправо и на его место приходит из HL готовые битыпроизведения. Они получаются при суммировании первого множителя (BC) и левойполовины накопленной суммы HLDE (HL). Суммирование делается в случае, еслиперед этим при сдвиге HLDE вправо из DE был выдвинут единичный бит.

Листинг 10: подпрограмма MUL

; – – – подпрограммаумножения

; HL´DE®HL

; все регистры меняются

MUL           LD     B, H           ;BC=1-й множитель

LD     C, L            ;

LD     HL, 0         ;HL=0

LD     A, 16         ;счетчик цикла

MUL2                  SRL   H               ;сдвиг 0®HLDE®CY

RR    L                 ;

RR    D                ;

RR    E                 ;

JR     NC, MUL1; есливыдвинут 0, то на конец цикла

ADD HL, BC                ;если выдвинута 1, то сложить

MUL1                  DEC  A                ;

JR     NZ,MUL2  ;

LD     H, L           ;получено произведение HL.DE

LD     L, D           ;которое “обрезаем” до L.D и переносим в H.L

RET

Деление

При делении делимоехранится в HL, делитель в DE. Результат получается в виде трех байт [стек.L](где “стек” – содержимое вершины стека), в конце программы младший байт стекапереносится в H и окончательный результат имеет формат H.L. Регистровая пара BCв начале обнуляется.

Деление производится втечение 24-х циклов. В каждом цикле делается сдвиг BC¬HL¬0, т.е. делимое HL выдвигается влево в пару BC. Затем BCсравнивается с DE (путем вычитания BC–DE и проверки флага переноса). ЕслиBC>DE, то младший разряд HL устанавливается единицей, в противном случае оностается нулем. Это один из разрядов частного.

После 16 сдвигов вделимое HL полностью сдвинется влево и на его место придет частноецелочисленного деления, в BC будет остаток деления, DE сохранит делитель. На этомэтапе целая часть частного в HL заносится в стек, а HL обнуляется. В оставшихся8-ми сдвигах BC¬HLв BC будут сдвигаться только нули. После всех 24-х циклов в регистре L будетдробная часть частного, а в стеке целая часть.

Листинг 11: подпрограмма DIV

; – – – подпрограммаделения

; HL/DE®HL

; сохраняет DE,использует стек (2 байта)

DIV            LD     BC, 0          ;

LD     A, 24         ; А– счетчик циклов

DIV4          PUSH         AF             ;сохранить счетчик А в стеке

          ADD HL, HL                ;BC¬HL¬0

                   RL     C                 ;

                   RL     B                 ;

/>


                   LD     A,C            ;

                   SUB  E                 ;

                   LD     C,A            ;

                   LD     A,B            ;

                   SBC  D                ;

                   LD     B,A            ;

                   JR     NC,DIV1  ; если BC>DE, то переход

/>                   LD     A, C            ;

                   ADD E                 ;

                   LD     C,A            ;

                   LD     A,B            ;

                   ADC D                ;

                   LD     B,A            ;

                   JR     DIV2          ;

DIV1          INC   HL             ;если BC>DE: установить последний бит

                                               ;частного в 1

DIV2          POP  AF             ;извлечь счетчик А из стека

                   CP     #09            ;проверить, 16-й цикл идет или нет

                   JR     NZ, DIV3   ;

                   PUSH         HL             ;если 16-й цикл, то в HL целая часть частного,

                                               ;сохранить ее в стеке, чтобы извлечь

                                               ;в конце программы

                   LD     HL,0         ;

DIV3          DEC  A                ;

                   JR     NZ,DIV4  ; конец цикла

                   POP  BC             ;извлекаем из стека целую часть частного

                   LD     H,C           ; получаем частное в H.L

                   RET                     ;

Косинус

Чтобы вычислить косинус,используется ограниченный четырьмя членами ряд Тейлора:

/>, угол a изменяется от 0 до p/2.                            (6)

Эта формула дает косинусс максимальной погрешностью 8,9×10-4, это меньше, чем ошибка разрядностииспользуемого формата [1].[1] дробных чисел.

/>                                                              (7)

Представление (7) формулы(6) гораздо удобнее для вычисления косинуса программно. Достаточно сделатьпроцедуру для вычисления />, где n– целое число, b– дробное число. Перед обращением к этой процедуре (названной COS_A) операндысодержатся:

HL = a2;

DE = b;

BC = n в формате n.0(B=n, C=0).

Результат – в HL

Эта подпрограммаиспользует предыдущие арифметические программы.

 

Листинг 12: подпрограмма COS_A

; – – – вспомогательнаяподпрограмма для косинуса

; операнды: HL, DE, BC

; изменяются все регистры

COS_A                PUSH         BC             ;сохранить в стеке n перед вызовом MUL

CALL         MUL          ;HL=HL´DE

POP  DE             ;DE=n

CALL         DIV           ;HL=HL/DE

LD     D, 1           ;DE=1.0

LD     E, 0             ;

EX    HL, DE                 ;

CALL         MINUS               ;HL=HL-DE

RET                     ;

Подпрограмма косинусавычисляет косинус угла в паре HL.

Листинг 13: подпрограмма COS

; – – –подпрограммакосинуса

; операнд и результат вHL

; изменяются все регистры

COS            LD     D,H            ;

                   LD     E, L             ;

                   CALL         MUL          ;HL=a2

                   PUSH         HL             ;a2 в стеке

                   LD     D,1           ; DE=1.0

                   LD     E,0             ;

                   LD     B,#1E                 ; BC=1E.0H=30

                   LD     C,0             ;

                   CALL         COS_A               ;HL=1-a2/30

                   EX    HL,DE                 ;

                   POP  HL             ;HL=a2

                   PUSH         HL             ;a2 в стеке

                   LD     B,#0C                 ; BC=C.0H=12

                   LD     C,0             ;

                   CALL         COS_A               ;HL=1-a2/12(1-a2/30)

                   EX    HL,DE                 ;

                   POP  HL             ;HL=a2

                   LD     B,#02                 ; BC=2.0

                   LD     C,0             ;

                   CALL         COS_A               ;HL=1-a2/2[1-a2/12(1-a2/30)]

                   RET                     ;


Преобразованиедвоичный®двоично-десятичный код

В управляющей программенадо переводить двухбайтные числа формата [12].[34] в двоично-десятичный кодвида [123.45] размером в пять тетрад для последующего перевода в семисегментныйкод и индикации.

Для этого нужны двеотдельных подпрограммы: одна (по имени B2D) для перевода целой части числа [12]и вторая (имя B2D_F) для перевода дробной части числа [34].

Подпрограмма B2Dпереводит целое двоичное число в регистре C (0..FFH) в 2-10 код,расположенный в регистровой паре HL. Перевод производится в соответствии сформулой:

HL=(…((c7)×2+c6)×2+…+c1)×2+c0,

в которой ci– разряды числа в регистре C, а удвоение и сложение с битамиciпроисходит по правилам десятичной арифметики (с командой DAA после операции).

Листинг 14: подпрограмма B2D

; – – – перевод байта(целого) в 2-10 код

; операнд C – переводимоечисло, результат в HL

; сохраняет DE

B2D            LD     B,8             ;

B2D1                   SLA  C                ;CY¬C (получаем последний бит операнда)

LD     A, L           ;удвоение HL с учетом переноса CY

ADC L                ;по правилам десятичной арифметики

DAA                    ;

LD     L, A            ;

LD     A, H            ;

ADC H                ;

DAA                    ;

LD     H, A            ;

DJNZ          B2D1                  ;конец цикла

RET                     ;

Подпрограмма B2D_Fпереводит дробное число в формате 0.L в 2-10 код из трех тетрад в формате 0.ABC(учитываются три цифры после запятой). Регистры A, B, C содержат в конце каждыйпо одной десятичной цифре. Перевод происходит так. Число 0.L умножается на 10,результат в паре H.L. Его целая часть (H) и будет первой цифрой A результата.Затем H обнуляется, полученная дробь 0.L снова умножается на 10 и т.д.

Для быстрого умножения на10 сделана отдельная подпрограмма MUL10, умножающая пару HL (где H=0) иполучающая результат в той же HL. Она использует равенство:

10×HL=2×HL+8×HL, а умножения на 2 и на 8 делаютсяс помощью команды ADD HL, HL.

Листинг 15: подпрограммы B2D_F и MUL10

; – – – перевод байта(дробного) в 2-10 код

; операнд C – число сфиксированной перед старшим разрядом точкой, результат в ABC

; изменяются все регистры

B2D_F        LD     H, 0            ;

CALL         MUL10               ;получить в H первую цифру

LD     A, H           ;скопировать ее в A

LD     H, 0           ;и обнулить H

CALL         MUL10                ;

LD     B, H           ;вторую цифру – в регистр B

LD     H, 0            ;

CALL         MUL10               ;третью – в C

LD     C, H            ;

RET

; – – – умножение на 10

; операнд в HL (имеетзначение только L) и результат в HL

; сохраняет A, BC

MUL10                ADD HL,HL                ; HL×10=HL×2+HL×8

LD     D, H            ;

LD     E, L             ;

ADD HL, HL       ;

ADD HL, HL       ;

ADD HL, DE       ;

RET                     ;

Преобразованиедвоичный®семисегментныйкод

Это преобразование спомощью таблицы перекодировки уже встречалось в тестовой программе ОЗУ. Сейчасоформим ее как отдельную подпрограмму (в тесте ОЗУ нельзя вызыватьподпрограммы, т.к. команда вызова CALL использует стек). Операнд подпрограммы –двоично-десятичная цифра в регистре A (0..9, старшая тетрада нулевая).

 

Листинг 16: подпрограмма D27

; – – – перевод байта всемисегментный код

; операнд (0..9) и результатв A

; сохраняет BC, DE

D27            LD     H, #07                  ;

LD     L, A            ;

LD     A, (HL)                 ;

RET                     ;


Обработчики прерываний

Всего их шесть – по числупрерываний. Обработчик обязательно должен сохранить в стеке все изменяемые имрегистры и в конце восстановить их. Выход из обработчика выполняется нестандартным RET, а командой RETI.

Обработчик IRQ0(начало измерений)

Функция обработчика –обнулить таймеры T1 и T2, а также специальную ячейку памяти D_NUM (2 байта).Эта ячейка инкрементируется всякий раз после чтения напряжения Udс датчика диаметра. По приходу запроса IRQ0, когда приходит новое бревно, онадолжна быть обнулена.

Листинг 17: обработчик запроса IRQ0

         ; – – – обнулить T1, T2, D_NUM

          IR0_H                  PUSH         BC              ;

                                      PUSH         AF              ;

                                      LD     BC,0          ;

                                      LD     (T1),BC    ; обнулить T1

                                      LD     (T2),BC    ; обнулить T2

                                      LD     (D_NUM),BC    ; обнулить D_NUM

                                      POP  AF              ;

                                      POP  BC              ;

                                      RETI                    ;

Обработчик IRQ2(информация с АЦП готова)

Функция обработчика –если бревно сейчас под пластиной датчика (можно судить, прочтя портфотоэлементов с адресом 0B), считать два байта напряжения из портов 00(младший) и 01 (старший). Записать их в массив напряжений, под который отведенаобласть памяти начиная с адреса 0100Н до конца ОЗУ (всего 2К). Передзаписью проверить, не заполнен ли этот массив. Инкрементировать ячейку D_NUM,содержащую число элементов этого массива.

Листинг 18: обработчик запроса IRQ2

; – – – считать иобработать байт с АЦП

IR2_H                  PUSH         BC              ;

PUSH         HL              ;

PUSH         AF              ;

IN      A,(#0B)     ;

AND #02            ;наложить маску 000000010

JR     Z, IR2_H1 ; есливторой бит нулевой, то выход

LD     HL, #1000 ;рассчитать адрес очередного элемента массива

LD     C, (D_NUM)       ;считать D_NUM

LD     B, (D_NUM+1)    ;

SLA  C                ;умножить его на 2

RL     B                 ;

ADD HL, BC      ; теперьадрес в HL

LD     A, H            ;

CP     #18             ;

JR     NC, IR2_H1        ;если вышли за пределы массива, то выход

IN      A, (#00)     ;считать первый байт с АЦП

LD     (HL), A      ; иотправить его в память

INC   HL              ;

IN      A, (#01)     ;считать второй

LD     (HL), A      ;отправить

INC   BC             ;увеличить переменную D_NUM на единицу

LD     (D_NUM),BC     ;

IR2_H1       POP  AF     ;

POP  HL              ;

POP  BC              ;

RETI                    ;

Обработчик IRQ3 (отгенератора 16 Гц)

Функция обработчика –произвести инкремент часов реального времени и условный инкремент таймеров.Часы реального времени – это 4 байта в памяти:

TIME                   1/16секунды (0..15);

TIME+1      секунды(0..59);

TIME+2      минуты(0..59);

TIME+3      часы (0..23);

Все величины хранятся вдвоичном формате.

Таймерам T1 и T2 отведенопо 2 байта с начальными адресами T1 и T2. Условия, при которых ониинкрементируются, были приведены в п. 3.4.

Листинг 19: обработчик запроса IRQ3

; – – – инкремент часовреального времени и условный инкремент таймеров

IR3_H         PUSH         BC              ;

                   PUSH         HL              ;

                   PUSH         AF              ;

                  ; часыреального времени

                   LD     HL,TIME   ;

                   INC   (HL)           ;инкремент 1/16 секунд

                   LD     A, (HL)                 ;

                   CP     16              ;проверить на достижение максимума                       JR          C, IR3_H1 ;условный выход из подпрограммы

                   LD     (HL),0                ; иначе обнулить 1/16 секунды и продолжить

                   INC   HL              ;

                   LD     B,2            ; инкремент секунд и минут делается в цикле

                   IR3_H2                INC   (HL)            ;

                   LD     A,(HL)                 ;

                   CP     60               ;

                   JR     C,IR3_H1  ;

                   LD     (HL),0                 ;

                   INC   HL              ;

                   DJNZ          IR3_H2               ;конец цикла

                   INC   (HL)           ;инкремент часов

                   LD     A,(HL)                 ;

                   CP     24               ;

                   JR     C, IR3_H1  ;

                   XOR A               ;если счетчик часов=24

                   LD     (HL),A                ; то обнулить все 4 байта часов реального времени

                   DEC  HL              ;

                   LD     (HL),A                 ;

                   DEC  HL              ;

                   LD     (HL),A                 ;

                   DEC  HL              ;

                   LD     (HL),A                 ;

                  ; таймеры

                   IR3_H1                IN      A,(#0B)              ; загрузить слово статуса фотоэлементов

                   AND 1                 ;

                   JR     Z,IR3_H3 ; если не установлен 1-й бит, то выход

                   LD     HL,T2                ; иначе инкремент Т2

                   INC   (HL)            ;

                   JR     NZ,IR3_H4        ; если инкремент не обнулил

                  ;первый байт Т2, то идем дальше

                   INC   HL             ;иначе увеличить на 1 и второй байт

                   INC   (HL)            ;

                   IR3_H4                IN      A,(#0B)               ;

                   AND 2                ; проверить 2-йбит статуса ФЭЛ

                   JR     Z,IR3_H3 ; если он не установлен, то выход

                   LD     HL,T1                ; иначе инкремент Т1

                   INC   (HL)            ;

                   JR     NZ,IR3_H3         ;

                   INC   HL              ;

                   INC   (HL)            ;

                   IR3_H3       POP  AF              ;

                                      POP  HL              ;

                                      POP  BC              ;

                                      RETI                    ;

Обработчик IRQ4 (откнопки “+Час”)

Функция обработчика –увеличить на единицу часы реального времени (ячейка TIME+3).

 

Листинг 20: обработчик запроса IRQ4

                  ; – –– инкремент часов

                   IR4_H         PUSH         HL              ;

                                      PUSH         AF              ;

                                      LD     HL,TIME+3;

                                      INC   (HL)           ;инкремент часов

                                      LD     A,(HL)       ;

                                      CP     24               ;

                                      JR     C, IR4_H1  ;

                             XOR A               ;если счетчик часов=24

                             LD     (HL),A                ; то обнулить часы и минуты

                             DEC  HL              ;

                             LD     (HL),A                 ;

                   IR4_H1                POP  AF     ;

                                      POP  HL              ;

                                      RETI

Обработчик IRQ5 (откнопки “+Мин”)

Функция обработчика –увеличить на единицу минуты реального времени (ячейка TIME+2).

Листинг 21: обработчик запроса IRQ5

                  ; – –– инкремент минут

                   IR5_H         PUSH         HL              ;

                   PUSH         AF              ;

                   LD     HL,TIME+2;

                   INC   (HL)           ;инкремент минут

                   LD     A,(HL)       ;

                   CP     60               ;

                   JR     C, IR5_H1  ;

                   XOR A               ;если счетчик минут=60

                   LD     (HL),A                ; то обнуление минут

                   INC   HL             ;и инкремент часов

                   INC   (HL)            ;

                   LD     A,(HL)      ; с проверкой часов на 24

                   CP     24               ;

                   JR     C, IR5_H1  ;

                   XOR A               ;если счетчик часов=24

                   LD     (HL),A      ; то обнулить и часы

                   IR4_H1                POP  AF     ;

                   POP  HL              ;

                   RETI

Обработчик IRQ1 (отфотоэлемента Фэл2)

Обработчик IRQ1 выполняетсамую важную функцию. Его задача – вычислить объем бревна. Последовательностьследующая: вычисляем диаметр бревна, длину, вычисляем объем Vi,находим объем VS.

Для вычисления диаметравсе значения, прежде считанные в массив напряжений с АЦП, усредняются:суммируются и делятся на количество (D_NUM). При суммировании может произойтипереполнение суммы (а она двухбайтная), чтобы этого не было, массив разбиваетсяна группы по 16 измерений в каждой. Если осталась остаточная группа с числомменьше 16, то она отбрасывается. В каждой из них подсчитывается среднее, затемрассчитывается искомое как среднее средних.

Из среднего напряжениянаходится угол

a=/>.

Затем находим диаметр d=0,625– 0,5cos a=00,A0H– 00,80Hcos a.Занести его в ячейку DIAM (2 байта в памяти). Сравнить диаметр с допустимыми пределами[0,2..0,5]=[0,33H..0,8H]. Если он выходит за эти пределы,то выдать на отбраковку (порт 02H) единицу.

Объем Viнаходится как Vi=(p/4)d2×T1/T2=0,C9H×d2×T1/T2.

 

Листинг 22: обработчик запроса IRQ1

; – – – найти объембревна и суммарный объем

; усреднение всехнапряжений с датчика диаметра в массиве по адресу 1000H

IR1_H         PUSH         AF     ;

                   PUSH         BC    ;

                   PUSH         DE    ;

                   PUSH         HL     ;

                   LD     L,(D_NUM)        ;

                   LD     H,(D_NUM+1)    ;

                   LD     B,4            ; делим D_NUM на 16

IR1_H1                SRL   H       ;

                   RR    L                 ;

                   DJNZ          IR1_H1       ;

                   LD     C,L  ; в результате C=число групп по 16

                   PUSH         BC             ;сохранить С в стеке

                   LD     HL,#1000  ;

                   LD     DE,0         ; DE – начальная сумма групп

          PUSH         DE             ;отправить ее в стек, C станет второй в стеке

          PUSH         DE             ;DE – начальная сумма отдельной группы,

                                     ;отправить®в стек, суммагрупп вторая в стеке

                                     ;C – третья в стеке

IR1_H4                LD     B, 16           ;

IR1_H2                LD     E,(HL)      ; читаем в DE элемент массива

          INC   HL              ;

          LD     D,(HL)       ;

          INC   HL              ;

          EX    (SP), HL    ; текущую сумма вHL, текущий адрес в стеке

          ADD HL, DE       ;

          EX    (SP), HL    ;новая сумма в стеке, текущий адрес в HL

          DJNZ          IR1_H2       ;

         ; в итоге суммаодной группы по 16 – в стеке

         ; начальныйадрес следующей группы – в HL

          POP  DE              ;

          LD     B, 4            ;находим среднее одной группы,

          IR1_H3       SRL   D      ;деля сумму в DE на 16

          RR    E                 ;

          DJNZ          IR1_H3                ;

          POP  HL             ; берем из стекасумму групп

          ADD HL, DE                 ;

          PUSH         HL             ;снова отправляем в стек: сначала сумму групп

          PUSH         DE             ;затем сумму одной группы

          DEC  C                ;С – счетчик групп

          JR     NZ,IR1_H4        ; следующая группа…

          POP  HL              ;

          POP  HL             ;извлечь найденную сумму групп

          POP  BC             ;извлечь счетчик групп C

          LD     D, C           ;DE=C.0

          LD     E,0             ;

          CALL         DIV           ; делимсумму групп на число групп

         ; теперь HL=Ud=среднеевсего массива напряжений датчика

         ; следующий шаг– нахождение угла a,cos a, d

          LD     D, 4           ; DE=491H

          LD     E, #91                  ;

          LD     B, H           ;сохранить Ud в BC

          LD     C, L            ;

          EX    DE, HL                 ;

          CALL         MINUS               ;HL=491H-Ud

          EX    HL,DE                 ;

          LD     H,B            ;

          LD     L,C            ;

          CALL         DIV           ;HL= Ud/(491H-Ud)

          LD     D,0            ;

          LD     E,#4F                  ;

          CALL         MUL          ;HL=a

          CALL         COS           ;HL=cos a

          LD     D,0            ;

          LD     E,#80                  ;

          CALL         MUL          ;HL=0,5cos a

          LD     D,0            ;

          LD     E,#A0                  ;

          EX    HL,DE                 ;

          CALL         MINUS               ;HL=0,625-0,5cos a=d

          LD     (DIAM), HL        ;занести диаметр в память

         ; формируемсигнал отбраковки

          LD     A, L            ;

          CP     #33             ;

          JR     NC,IR1_H5        ; если d>20, то идем дальше

          LD     A, 1           ;иначе в порт отбраковки записать 1

          OUT  (#02), A                ;

          JR     IR1_OUT  ;и выход, не считая объем

          IR1_H5                LD     A, L            ;

          CP     #80             ;

          JR     C,IR1_H6 ; если d<50, то идем дальше

          LD     A, 1           ;иначе в порт отбраковки записать 1

          OUT  (#02), A                ;

         ; дальшенаходим Vi, VS

          IR1_H6                LD     L,(T1)        ;

          LD     H,(T1+1)   ;

          LD     E,(T2)                  ;

          LD     D,(T2+1)   ;

          CALL         DIV           ;HL=T1/T2

          LD     E,(DIAM)  ;

          LD     D,(DIAM+1)       ;

          PUSH         DE              ;

          CALL         MUL          ;HL=T1×d/T2

          POP  DE              ;

          CALL         MUL          ;HL=T1×d2/T2

          LD     D,0            ;

          LD     E,#C9                  ;

          CALL         MUL          ;HL=(p/4)T1×d2/T2=Vi

          EX    HL,DE                 ;

          LD     L,(V_SUM)         ;

          LD     H,(V_SUM+1)    ;

          CALL         PLUS                  ;HL=VS

          LD     (V_SUM), HL     ; занестисуммарный объем в память

          IR1_OUT   POP  HL     ;

          POP  DE              ;

          POP  BC              ;

          POP  AF              ;

          RETI                    ;

Основнаяисполняемая часть программы

Эту часть, которая,собственно, и является управляющей программой, микропроцессор выполняет большуючасть своего времени, изредка отвлекаясь от нее на обработку прерываний.

Ее функции:

прочесть VS из ячейки V_SUM, перевести его в2-10 код (подпрограммы B2D, B2D_F), перевести каждую цифру в семисегментный код(подпрограмма D27) и вывести в порт индикаторов (03-0A), присоединив десятичнуюзапятую в индикаторе 06Н;

прочесть время изячейки TIME (TIME+1–секунды, TIME+2–минуты, TIME+3–часы), перевести его в 2-10код, перевести каждую цифру в семисегментный код и вывести в порт индикаторов(13-1A), присоединив десятичную запятую в индикаторах 13Н, 15Н,17Н.

/>

Рис. 7 Расположениеобъема и времени на индикаторах

 

Листинг 23: основная часть

         ; – – – вывестина индикаторы объем и время

         ; вывод объема

          MAIN                   LD     E,(V_SUM)         ;

          LD     D,(V_SUM+1)   ; D.E – суммарный объем

                                     ;выводим целую часть D

          LD     C, D            ;

          CALL         B2D ;HL=2-10 код D

          LD     A,H            ;

          CALL         D27  ; в семисегментныйкод

          OUT  (#08), A     ;вывести в порт

          LD     A, H            ;

          AND #0F             ;

          CALL         D27   ;

          OR    #80            ;примешать десятичную запятую

          OUT  (#06), A     ;вывести в порт

          LD     A, H            ;

          RR    A               ;четырежды сдвигаем вправо

          RR    A                ;

          RR    A                ;

          RR    A                ;

          AND #0F             ;

          CALL         D27   ;

          OUT  (#07), A     ;вывести в порт

                                     ;выводим дробную часть E

          LD     L, E             ;

          CALL         B2D_F       ;ABC=три цифры 2-10 кода числа 0.L

          CALL         D27            ;

          OUT  (#05),A               ; вывести в порт

          LD     A,B            ;

          CALL         D27            ;

          OUT  (#04),A               ; вывести в порт

          LD     A,C            ;

          CALL         D27            ;

          OUT  (#03), A               ;вывести в порт

         ; выводтекущего времени

          LD     HL,(TIME+1)     ; HL=адрес секунд

          LD     B, #13                 ;самый правый индикатор

          MAIN1       PUSH         HL     ;

          LD     A,(HL)                 ;

          LD     C, A            ;

          CALL         B2D           ;HL=2-10 код секунд/минут/часов (причем Н=0)

          LD     A, L            ;

          AND #0F             ;

          CALL         D27   ;

          OR    #80            ;примешать запятую

          OUT  (B), A                  ;вывести в порт

          INC   B                ;следующий индикатор

          LD     A, L            ;

          RR    A               ;четырежды сдвигаем А вправо

          RR    A                ;

          RR    A                ;

          RR    A                ;

          AND #0F             ;

          CALL         D27            ;

          OUT  (B), A                  ;вывести в порт

          INC   B                ;следующий индикатор

          POP  HL              ;

          INC   HL             ;перейти к следующей ячейке (TIME+2, TIME+3)

          LD     A, B            ;

          CP     #08            ;проверка конца цикла

          JR     NZ, MAIN1          ;

          JP      MAIN                  ;начинаем все сначала

 

Общая структура ПЗУмикропроцессорной системы

Наконец,приведем карты ПЗУ и ОЗУ микропроцессорной системы.ПЗУ0000 DI 0001

Начало тестов

TST_RAM

JR 0038

0020

Распределитель обработчиков прерываний

0020 JP IR_H0

0024 JP IR_H1

0028 JP IR_H2

002C JP IR_H3

0030 JP IR_H4

0034 JP IR_H5

0038

Продолжение теста ОЗУ (TST_RAM)

TST_ROM

TST_FEL

INI_PIC

INI_VAR

EI LD SP, #0FFF

Главный цикл программы

MAIN

Подпрограммы

E_RAM

E_ROM

PLUS

MINUS

MUL

DIV

COS_A

COS

B2D

B2D_F

MUL10

D27

Обработчики

IR_H0

IR_H1

IR_H2

IR_H3

IR_H4

IR_H5

Область нулей 00000000 0700 Таблица перекодировки 070F 00000000 07FF Последний байт (дополнение контрольной суммы до нуля)

Общая структура ОЗУмикропроцессорной системы. ОЗУ

0800 V_SUM 0802 DIAM 0804 TIME 0808 T1 080A T2 080C D_NUM 080D 0FFF ­ ОБЛАСТЬ СТЕКА ­ 1000

Массив напряжений

с датчика диаметра

(2К)

1FFF Конец ОЗУ

Заключение

В результате проделаннойработы мы получили систему, отбраковывающие бревна, не годные для распиливания ипоэтому отбрасывающиеся в сторону. Если бревно нам подходит, то идет подсчетего объема и подсчет всех бревен, прошедших распил. Также считается времянаработки.


ПЕРЕЧЕНЬЭЛЕМЕНТОВ

Поз. обозн. Наименование Кол. Примечание DD1 Микросхема Z-80 1 DD2, DD4 Микросхема К155ИР13 2 DD3, DD5 Микросхема К537РУ8 2 DD6 Микросхема К1118ПВ1 1 DD7 Микросхема К546ИР5 1 DD8 Микросхема К155ИД3 1 DD9 Микросхема К541РЕ1 1 DD10 Микросхема К580ВН59А 1 DD11 Микросхема К155ЛД7 1

Rd

Резистор МЛТ-5.1К 1 R1, R3 Резистор МЛТ-10К 4

R 2, Rдоб

Резистор МЛТ-1К 3 R9, R10

Резистор МЛТ-1-13 кОм А

ТУ ОЖО 467 003

2 R11, R12

Резистор МЛТ-1-510 кОм А

ТУ ОЖО 467 003

2

R8,

R13 – R16

Резистор МЛТ-0.5-1 кОм А

ТУ ОЖО 467 003

C1, C8, C9

Конденсатор МБМ – 16 В – 0,47 мкФ

ТУ УБО 462 014

7 C6

Конденсатор МБМ – 16 В – 0,1 мкФ

ТУ УБО 462 014

1 C7

Конденсатор МБМ – 16 В – 0,15 мкФ

ТУ УБО 462 014

1 1

 

 

 

 

 

2101 420 000 019 ПЭ

 

 

 

 

 

Изм

Лист

№ докум.

Подп.

Дата

Разраб.

Молоков Т

 

 

Микропроцессорная система управления, предназначенная для использования на лесопильном заводе

 

Перечень элементов

Лит.

Лист.

Листов

 

Данилов Д.

 

 

 

 

 

Пров.

Мокрецов В.

 

 

УГТУ – УПИ

РТФ гр. Р–311А

Кафедра АУТС

Н.Контр.

Калинин Н.С

 

 

Утв.

 

 

 

еще рефераты
Еще работы по коммуникациям и связям