Микропроцессорная система управления, предназначенная для использования на лесопильном заводе
p align="left">LD C, (D_NUM) ; считать D_NUMLD 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, находим объем V. Для вычисления диаметра все значения, прежде считанные в массив напряжений с АЦП, усредняются: суммируются и делятся на количество (D_NUM). При суммировании может произойти переполнение суммы (а она двухбайтная), чтобы этого не было, массив разбивается на группы по 16 измерений в каждой. Если осталась остаточная группа с числом меньше 16, то она отбрасывается. В каждой из них подсчитывается среднее, затем рассчитывается искомое как среднее средних. Из среднего напряжения находится угол =. Затем находим диаметр d=0,625 - 0,5cos =00,A0H - 00,80Hcos . Занести его в ячейку DIAM (2 байта в памяти). Сравнить диаметр с допустимыми пределами [0,2..0,5]=[0,33H..0,8H]. Если он выходит за эти пределы, то выдать на отбраковку (порт 02H) единицу. Объем Vi находится как Vi=(/4)d2T1/T2=0,C9Hd2T1/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=среднее всего массива напряжений датчика ; следующий шаг - нахождение угла , cos , 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= CALL COS ; HL=cos LD D, 0 ; LD E, #80 ; CALL MUL ; HL=0,5cos LD D, 0 ; LD E, #A0 ; EX HL, DE ; CALL MINUS ; HL=0,625-0,5cos =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, V 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=T1d/T2 POP DE ; CALL MUL ; HL=T1d2/T2 LD D, 0 ; LD E, #C9 ; CALL MUL ; HL=(/4)T1d2/T2=Vi EX HL, DE ; LD L, (V_SUM) ; LD H, (V_SUM+1) ; CALL PLUS ; HL=V LD (V_SUM), HL ; занести суммарный объем в память IR1_OUT POP HL ; POP DE ; POP BC ; POP AF ; RETI ; Основная исполняемая часть программы Эту часть, которая, собственно, и является управляющей программой, микропроцессор выполняет большую часть своего времени, изредка отвлекаясь от нее на обработку прерываний. Ее функции: прочесть V из ячейки 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А Кафедра АУТС | | Н.Контр. | Калинин Н.С | | | | | | Утв. | | | | | | | |
Страницы: 1, 2, 3, 4
|