ПРИМЕРЫ ПРОГРАММИРОВАНИЯ ВНЕШНИХ УСТРОЙСТВ
ЗАДАЧА 1
РЕШЕНИЕ
a) Для ответа на первый вопрос неплохо бы иметь карту памяти с символическим именем одной из ячеек - cb. Так как этого нет, то исследуем первые две команды фрагмента программы. Содержимое cb загружается в аккумулятор AL и затем выводится командой OUT в порт с двоичным адресом xxxxxx11 (b - указывает на двоичную запись, 6 бит нам пока не известны). На рисунке присутствует только одно ВУ, а именно PPI. Два младших бита шины адреса (ША) равные A1,A0 = 11 попадают на входы PPI A1,A0 - это свидетельствует, что содержимое AL будет "истолковано" PPI, как управляющий байт. Не путайте входы PPI A1,A0 и биты ША A1,A0. В некоторых задачах входы A1,A0 микросхем могут соединяться с другими линиями ША. Для режима 0 управляющий байт PPI имеет следующий формат:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | PA | PCст |
0 | PB | PCмл |
Значения битов PA, PB, PCст, PCмл определяются требуемым направлением передачи информации через один из указанных портов (половины порта PC могут настраиваться на ввод или вывод раздельно). Из рисунка следует, что порт PA предназначен для ввода кода ключа, следовательно бит PA=1. Из младшей половины порта PC задействована только линия PC3 (по ней передается сигнал от датчика "дверь открыта"), поэтому бит PCмл = 1. Анализ линий портов PB,PCст показывает, что они задействованы на вывод, то есть биты PB и PCст равны 0. Поэтому ответом на первый вопрос будет код 91(HEX) = 10010001.
б) Адрес порта PB найдем из условия, что при выполнении команд IN или OUT обращенных к PPI, сигнал на входе ~CS должен быть активным, т.е. равным 0, т.к. вход ~CS инверсный. Сигнал на этом входе задан в виде уравнения неполного дешифратора, связывающего отдельные биты шины адреса (ША) по ИЛИ. Результат ИЛИ равен нулю, если ВСЕ входные сигналы ИЛИ также равны нулю. Часть битов ША использована в уравнении в инверсном виде, поэтому значения этих битов д.б. равны 1. Кроме того для порта PB биты A1,A0 = 01.
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
X | 1 | 1 | 0 | X |
1 | 0 | 1 |
Незадействованные (don't care) биты заполняем любыми значениями, например нулями и находим один из вариантов ответа на второй вопрос (адрес порта PB = 01100101 = 65(HEX).
в) Какие действия выполняет PPI, узнаем анализируя остальной код фрагмента программы. Команда IN AL,PA что-то вводит в аккумулятор из порта с символическим именем PA. Нетрудно догадаться, что это имя относится к одноименному порту, и следовательно вводится набранный код ключа. В следующей команде введенный код вычитается или сравнивается (что одно и тоже) с каким-то числом. Не нужно быть Ш.Холмсом, чтобы догадаться, что это число - истинное значение кода ключа (в нашем случае оно совпадает с введенным).
В этот момент для варианта, когда коды совпадают - ответ ясен, однако рассмотрим решение подробно, т.к. в случае несовпадения кодов существует несколько альтернатив. Итак, обходим команду JNZ M2, как не соответствующую нашему случаю. Следующие две команды выводят код 10(HEX) = 00010000(BIN) в порт XX. Из восьми битов этого кода какое-то действие произведет, скорее всего, бит D4=1. Из приведенных на рисунке портов этот бит D4 может попасть только на линию PA4 (где ему делать нечего, т.к. порт PA настроен на ввод кода ключа) и на линию PC4 которая передает сигнал для открывания замка. Третьим ответом будет: 2.
ЗАДАЧА 2
РЕШЕНИЕ
а) Ответ на первый вопрос нетрудно найти зная, что адрес XX появится на шине адреса (ША) во время выполнения команды OUT. По условию задачи этот адрес должен относиться к ВУ4 и следовательно на 4-м выходе дешифратора должен появиться активный сигнал ( в нашем случае - нулевой т.к. выходы дешифратора инверсные). В соответствии с определением дешифратора на информационных входах DC должен быть подан двоичный код активного выхода т.е. a2,a1,a0 = 100(BIN) = 4. При этом на разрешающие входы должны быть активизированы e2 * e1 * e0 = 1. Входы e1 и e0 - инверсные, поэтому сигналы на них д.б. равны 0 (~e1=~e0=0). Сигнал e2=1. Подставляя найденные значения в соответствующие биты ША и заполняя незадействованные биты чем угодно, например нулями, найдем адрес = 0A(HEX).
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
X | 0 | X | 0 | 1 |
0 | 1 | 0 |
б) Для ответа на второй вопрос рассмотрим фрагмент программы. Команда SUB BH,BH обнуляет старшую половину регистра BX, а следующая команда заносит в его младшую половину 0. Следовательно после выполнения первых двух команд содержимое BX равно 0. Инструкция MOV AX,[SRC+BX] пересылает два байта в регистр AX из двух последовательно расположенных ячеек памяти с адресами SRC+BX и SRC+BX+1. Содержимое BX уже известно, осталось найти значение константы с именем SRC. Директива EQU присваивает SRC значение двух числовых констант, об'единенных операцией XOR (исключающее ИЛИ). Результат XOR (как и любой другой двухоперандной логической команды) легче всего найти записав константы в двоичном виде друг под другом и произведя побитовые операции по правилу - результат XOR равен 1, если равен 1 только один аргумент.
ab19 = 1010 1011 0001 1001 9770 = 1001 0111 0111 0000 __________________________ 0011 1100 0110 1001 = 3c69 результат
Отсюда следует, что SRC+BX = 3c69+0=3c69 и по команде MOV AX,[SRC+BX] в двухбайтовый регистр AX пересылаются подряд два байта из двух ячеек памяти с адресами 3c69 и 3с6a, то есть байты 20 и 5e. Причем действует правило - байт по старшему адресу (5e) помещается в старшую половину регистра AX (AH), а байт по младшему адресу (20) - в регистр AL. Инструкция XCHG AH,AL меняет местами содержимое AH и AL, а команда OUT XX,AL выводит в ВУ4 байт 5e.
ЗАДАЧА 3
РЕШЕНИЕ
a) Ответы на 2,3 и 4 вопросы можно найти определив управляющий байт PIT. Команда OUT xxxxxx11B,AL выводит управляющий байт в PIT, о чем свидетельствуют два младших бита адреса A1,A0=11. Определим содержимое аккумулятора на момент выполнения этой команды, для чего необходимо выполнить три логические команды (OR)ИЛИ, (AND)И и снова ИЛИ.
81h = 1000 0001 (al) 04h = 0000 0100 (bl) _______________ OR 85h = 1000 0101 (al) новое значение 85h = 1000 0101 (al) FEh = 1111 1110 (cl) _______________ AND 84h = 1000 0100 (al) новое значение 84h = 1000 0100 (al) 10h = 0001 0000 _______________ OR 95h = 1001 0100 (al) новое значение (управляющий байт)
Отсюда находим ответ на второй вопрос: номер счетчика D7,D6=10(bin) = 2.
Так как биты D3,D2,D1=010, то счетчик работает во втором режиме (генератор периодической последовательности со скважностью Q>2) и ответом на 4-ый вопрос будет 15 ( номер временной диаграммы для этого режима).
Для второго режима выходная и входная частоты связаны соотношением Fout = Fclk/N. Коэффициент деления N в программе записывается в счетчик (во второй) в последних двух командах, причем записывается одним младшим байтом, так как биты D5,D4=01. 14 можно истолковать как 14 в двоично-десятичном коде или как 1*161 + 4*160 = 20 в 16-ном. PIT "истолкует" это число как двоичное, так как бит D0 управляющего байта = 0. Следовательно коэффициент деления N=20(DEC) и частота на выходе второго счетчика Fout2 = 1000Гц/20 = 50Гц. Это ответ на второй вопрос.
Как и в задаче 1адрес порта можно найти анализируя уравнение на входе ~CS. Биты адреса A4=A3=1, бит A7=0, для второго счетчика биты A1,A0=10(BIN)=2, остальные биты заполняем чем угодно (например нулями) и получаем один из возможных адресов второго счетчика: 1A(HEX).
ЗАДАЧА 4
РЕШЕНИЕ
a) Определяем, что устройство #/^ - есть цифро-аналоговый преобразователь, у которого Uвых = (-Uo*D)/2n, где n - число разрядов ЦАП (n=4,Uo=-48v), D- десятичный эквивалент двоичного кода на входах ЦАП. Поэтому Uвых = (3*D) вольт. Первые три команды дадут (SI)=0FE9-3=0FE6 и после инверсии (SI)=F019. Четвертая команда засылает в регистр DL значение FB(HEX)=1111 1011(BIN).
Далее отмечаем, что циклическое выполнение команд
outp: mov al,[si] ..... shr dl,1 jc outp
выполняется пока команда SHR DL,1 "выталкивает" во флаг переноса CF единицу и закончится , когда очередной сдвиг вправо содержимого DL "вытолкнет" во флаг переноса 0 и команда JC "перейти если есть перенос" не будет выполнена. Так как в коде 11111011-->CF ноль попадет в CF только при третьем проходе, то и весь цикл будет выполняться 3 раза.
Команды
outp: mov al,[si] inc si out PRT,al
выведут в порт с адресом PRT содержимое трех последовательных ячеек памяти, начиная с адреса F019, то есть 13,e7,18 (HEX). Как видно из рисунка, на входы четырехразрядного ЦАП попадут только четыре младших бита (3,7,8) через линии PX0..PX3.
Отсюда следует, что в цикле команд, начиная с метки outp, инструкцией OUT PRT,AL на выходе ЦАП будут сформированы три значения напряжения: 3*3=9 вольт при первом проходе и 3*7=21 и 3*=24 вольт при остальных проходах.
б) Адрес порта вывода известен из директивы PRT EQU 85h (1000 0101) в котором биты ША A2,A1=10(BIN). Эти биты попадают на входы A1,A0 PPI (не путать линии ША A2,A1 и входы A1,A0). Когда код на входах A1,A0=10, то активизируется порт PC и вывод идет через него.
ЗАДАЧА 5
РЕШЕНИЕ
a) Найдем сначала байт управления. Цифроаналоговый преобразователь принимает код через порт PA, котороый поэтому должен быть настроен на вывод. Следовательно бит PA = 0. Дисплей отображает код, выводимый через порт PB, который также настраивается на вывод. Поэтому бит PB = 0. Слева к ППИ подключен некий прибор, который повидимому измеряет напряжение ( о чем свидетельствует "Uвх o-->"). Скорее всего порт "ДАННЫЕ" предназначен для считывания кода Uвх. Тогда младшая половина порта PC3..0 должна быть настроена на ввод и бит PCмл = 1. Относительно вывода "ПУСК" можно допустить, что прибор либо что-то через ППИ запускает в микропроцессоре, либо микропроцессор сам запускает прибор на измерение. Вторая версия явно предпочтительнее, так как опирается на конкретную схему, а не на догадки. Поэтому старшая половина порта PC должна быть настроена на вывод (бит PCст = 0) и управляющий байт = 1000 0001 = 81(HEX).
б) Анализ операнда F3(1111 0011) команды OUT показывает, что 2 младших бита адреса A1,A0 = 11, поэтому содержимое аккумулятора является для ППИ управляющим байтом. Инструкция MOV AL,[BX] извлекает его из ячейки памяти с адресом находящимся в регистре BX. Остается найти содержимое этого регистра, принимая во внимание, что BX состоит из двух половин BH,BL.
BX |
|
BH | BL |
Содержимое BH на момент выполнения MOV AL,[BX] равно B6, cодержимое BL = 9C (нахождение (BH) и (BL) производится аналогичным третьей задаче способом, с учетом того, что вместо AND здесь операция XOR и порядок команд другой). Следовательно адрес =B69C.
ЗАДАЧА 6
РЕШЕНИЕ
На рисунке приведена схема подключения УСАПП. Находим, что [BX] = 1770 на момент третьей команды управления, поэтому из ячейки памяти с этим адресом будет извлечен код 0100 0000 (бит D6=1), что свидетельствует о программном сбросе УСАПП. Команда ADD BX,DX складывает 1770(HEX) + 1604(HEX), на рисунке приведены начальные значения половин регистра DX (16 и 04). Результат сложения (2D74) является адресом инструкции режима (01X1XX11), о чем свидетельствует комментарий к второй команде MOV AL,[BX].
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 1 | X | 1 | X |
X | 1 | 1 |
а) Найдем код символа. Число информационных битов указывается в битах D3,D2, но они как назло в инструкции не указаны (D3,D2=XX). Поэтому их число найдем косвенным способом. Бит D4=1, поэтому независимо от бита D5, известно, что контроль присутствует. Биты D7,D6=01 свидетельствуют, что количество стоп-битов = 1. Мысленно отбрасывая служебные биты (один крайний левый - стартовый и два крайних правых - бит контроля и стоп-бит) оставляем 6 средних информационных бит (011011). Так как на временной диаграмме они следуют "ногами вперед" слева младший, а справа старший разряд, развернем их в нормальной для текстовой записи последовательности (слева старший разряд, справа - младший). Полученный код 11 0110(BIN) = 36(HEX), является ответом на второй вопрос.
б) Далее, команда XCHG SI,DX обменивает содержимое регистров SI и DX. Начальное значение SI в задаче не приводится, но как следует из последних двух команд оно и не нужно. В момент выполнения предпоследней команды MOV AL,[SI] новое значение [SI] равно старому значению [DX], которое было равно 1604(HEX). Из ячейки памяти с этим адресом будет извлечена команда управления (000X0100). Бит D2=1 свидетельствует, что УСАПП работает в качестве приемника. Это является ответом на первый вопрос.
в) Для нахождения возможного адреса порта (данных или байта управления в задаче не уточняется), как обычно необходимо проанализировать схему дешифратора ( в данной схеме неполного и выполненного на элементе ИЛИ).
ЗАДАЧА 7
РЕШЕНИЕ
Из рисунка видно, что нажата клавиша в верхнем левом углу матрицы 4*4. В этом случае схема зафиксировала 0 в верхней строке и левом столбце матрицы. Эти нули соответственно располагаются на линиях портов PB1 и PC2. В приведенном фрагменте программы оформленном в виде подпрограммы содержатся два "бесконечных" цикла, из которых предусмотрены выходы "по условиям".
В первом цикле от метки SHIFTB: ... до комады JMP SHIFTB содержимое регистра BL проверяется командой TEST (логическое поразрядное И) с помощью маски 01(HEX)=0000 0001(BIN). При ненулевом результате выполняются остальные команды этого цикла, при нулевом (когда маска и содержимое регистра BL совпадают) инструкция JZ SHIFTC осуществляет выход из указанного цикла. Отсюда видно, что цикл будет выполняться до тех пока 0 в регистре BL не окажется в позиции занятой единицей маски (то есть один раз).
00000001 маска 11111101 (BL) до сдвига вправо -------- test 00000001 - результат не нулевой
00000001 01111110 после сдвига вправо shr -------- test 00000000 - результат нулевой
Таким образом, при однократном проходе первого цикла (однократное выполнение команды ADD DL,4) в регистре DL будет храниться 4.
Второй цикл SHIFTC: ... JMP SHIFTC аналогичен первому, но выполняться будет два раза.
00000001 маска 11111011 (CL) до сдвига вправо -------- test 00000001 - результат не нулевой
00000001 00111110 после двух сдвигов вправо shr -------- test 00000000 - результат нулевой
Таким образом, при двукратном проходе второго цикла (двукратное выполнение команды INC DL) в регистре DL будет храниться значение 4 + 2 = 6, которое и будет ответом на задачу.
ЗАДАЧА 8
РЕШЕНИЕ
а) Вычислим значение байта xx..x1. Из комментария следует, что это управляющий байт счетчика CT0. Для каждого счетчика два старших бита определяют его номер. Для CT0 биты D7,D6 = 00. Временная диаграмма на выходе OUT0 счетчика CT0 соответствует режиму 3 (генератор периодической последовательности со скважностью равной двум, то есть длительность импульса и паузы равны). Поэтому биты D3,D2,D1 для третьего режима = x11 (011 или 111). Бит D0=1 по условию (xxxxxxx1), то есть коэффициент деления N0 записывается в счетчик двоично-десятичным кодом. Загрузка коэффициента деления N0 производится, как видно из программы, одним байтом, но каким ? Если загрузка N0 производится старшим байтом, то коэффициент деления = 4000(DEC), если младшим, то = 0040(DEC). Ответ на этот вопрос получим проанализировав общий коэффициент деления N двух последовательно включенных счетчиков CT0 и CT2. N = N0*N1 = T1/(T0) = T1/(1/F0) = 0.25/(1/1280) = 320(DEC) , что значительно меньше, чем 4000. И следовательно запись N0 в CT0 должна производиться только одним младшим байтом равным 40(DEC). Поэтому биты D5,D4 управляющего байта равны 01(BIN).
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 1 | X |
1 | 1 | 1 |
Окончательно, находим управляющий байт: 0001 0111 = 17(HEX) или 0001 1111 = 1F(HEX).
б) YY, как следует из комментария, является коэффициентом деления N1, так как N = 320(DEC) и N0 = 40(DEC), то из N = N0*N1 находим ответ YY = N1 = 8.
в) Значение P1 в команде OUT P1,AL является адресом первого счетчика и появляется на ША в момент выполнения этой команды. Причем, естественно, на входе ~CS должен быть 0 (сигнал на линии ША A7=0), а на входах PIT A1,A0 должна быть комбинация соответствующая номеру этого счетчика, то есть 01(BIN). Следовательно биты ША A6,A5 также должны быть равны 01. Остальные незадействованные биты ША, как обычно заменяем чем угодно, например нулями.
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 1 | X | X |
X | X | X |
Тогда одним из возможных ответов будет P1 = 80(HEX)
г) Осталось найти на сколько градусов повернется призма. Для этого необходимо вычислить число импульсов прошедших через схему И, выполненную на логическом элементе ИЛИ.
Длительность T1=0.25 сек по условию. Длительность T0 на выходе OUT0 найдем зная F0 = Fвх/N0 = 1280Гц/40 = 32Гц. То есть T0 = 1/F0 = 1/32 сек. Число импульсов на выходе ИЛИ равно T1/T0 = 0.25/(1/32) = 8 импульсов. Призма поворачивается на 0.5 градуса за один импульс, следовательно за 8 импульсов она повернется на 4 градуса.
ЗАДАЧА 9
РЕШЕНИЕ
Рассмотрим первые две команды. Адрес 16(HEX) = 0001 0110(BIN) появится на ША в момент выполнения второй команды.
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 |
Так как бит A2=1, а A5=0, то будет активизирован вход ~CS программируемого интервального таймера PIT. Причем биты A4,A1 ША поступая соответственно на входы PIT A0,A1 свидетельствуют, что по команде OUT 16H,AL в ПИТ записывается управляющий байт 9E(HEX) = 1001 1110(BIN).
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 |
Расшифровка управляющего байта дает следующую информацию: D7,D6 = 10(BIN) = 2, значит для управления динамиком задействован второй счетчик (ответ на третий вопрос), запись N2 производится одним младшим байтом (D5,D4 = 01), используется третий режим (генерация периодической последовательности - D3,D2,D1 = 111) и N2 представлен двоичным кодом ( D0 = 0).
Вторые две команды выводят по адресу 61H = 0110 0001(BIN)
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 1 | 1 | 0 | 0 |
0 | 0 | 1 |
байт 91H = 1001 0001(BIN).
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
режим 0 | PA | PCст | режим 0 | PB | PCмл | ||
1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 |
Бит A2 шины адреса равен нулю, а бит A6 = 1, поэтому активизирован будет программируемый периферийный интерфейс - PPI (~CS=0). Бит PCмл управляющего байта показывает, что как и требуется в задаче линия PC2 настроена на ввод сигнала от фотоприемника.
Далее рассмотрим работу фрагмента программы:
W: IN AL,0BH; AND AL,04; JNZ W;
По-видимому этот цикл должен опрашивать состояние линии PC2 (если PC2 = 1, то луч не прерван, PC2=0 - свидетельствует о пересечении луча). Другой подходящей версии о назачении этого фрагмента придумать трудно. Тогда команда IN AL,0BH должна считывать код из порта PC (линия PC2). Рассмотрим адрес 0B(HEX) = 0000 1011(BIN).
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 1 |
бит A2=0, что активизирует ППИ для обращения к ней микропроцессора, но биты ША A6,A0 = 01, что соответствует чтению из порта PB, а не PC. Кроме того, бит A5 также равен 0, поэтому одновременно будет активизирован и PIT. Следовательно адрес 0B является ошибочным. Для чтения из порта PC биты ША A6,A0 должны быть равны 10(BIN). Поэтому возможным адресом порта PC вместо 0B явится адрес с битами A6=1,A5=1,A0=0,A2=0, например 60(HEX). Это первое исправление и первый ответ.
В команде AND AL,04H с помощью маски 0000 0100 проверяется бит D2, который соответствует биту PC2, то есть ошибки здесь нет. Команда JNZ W(ait) производит переход на метку W "по не нулю", то есть этот цикл повторяется до тех пор пока на линии PC2 не появится ноль, соответствующий пересечению луча. Здесь тоже нет ошибки.
Осталось рассмотреть последние две команды:
MOV AL,46H OUT 06,AL
Переход к эти командам произойдет только если луч прервется и возникнет необходимость в подаче сигнала тревоги. Адрес 06(HEX) в команде OUT
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 0 |
активизирует PIT, так как A5 = ~CSPIT = 0. Бит A2 = ~CSPPI = 1, то есть PPI пассивен. Биты ША A1,A4 равны битам PPI A1,A0 и равны 10(BIN) = 2 (это есть ответ на третий вопрос). Следовательно код 46(HEX) = 4*16 + 6 = 70(DEC) записывается в счетчик CT2. Так как последние две команды выполняются, как уже говорилось, только при необходимости подачи сигнала, то ничего другого как запуск второго счетчика на генерацию сигнала не придумать. Как известно в третьем режиме генерация начинается после записи коэффициента деления N2 в счетчик ( при очевидном значении сигнала GATE = 1, на рисунке поэтому даже не показанным). Следовательно N2 = 46(HEX) = 70(DEC) и есть коэффициент деления. Тогда частота сигнала на выходе динамика будет равна 200Гц/70 = 2.85Гц и услышана никем не будет. Это и есть вторая ошибка. Для ее исправления во втором ответе нобходимо привети такое значение N2, чтобы частота на выходе CT2 находилась в пределах 20Гц <= Fout2 <= 16000Гц. Например: N2 = 5 (что и является одним из возможных ответов по иправлению второй ошибки).
ЗАДАЧА 10
РЕШЕНИЕ
В задаче нужно привести 6 ответов.
а) Найдем сначала XX. В команде OUT x1000x11b,AL два младших бита адреса A1,A0=11, поэтому XX является управляющим байтом. Из рисунка и справки следует, что порты PA и PB должны быть настроены на вывод,
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
режим 0 | PA | PCст | режим 0 | PB | PCмл | ||
1 | 0 | 0 | 0 | X |
0 | 0 | 1 |
а порт младшая половина порта PC - на ввод. Одно из двух возможных решений (бит X=0) будет XX = 81(HEX).
Далее рассмотрим схему подключения светодиодов. Для свечения диода в строке (линейке) с номером "i" и в столбце с номером "j" необходимо на анод подать высокий потенциал, а на катод - низкий. Выходы порта PB подключены к анодам через инверторы, а выходы порта PA - к катодам через повторители, поэтомы на выходе PBj должен быть 0, а на выходе PAi также 0.
Следующие 4 команды выводят через порт PB инверсный код символа и через порт PA - логический ноль на третью линейку (на остальные линейки - единицы). Порядок вывода ( при оценке ответа ) не играет роли, поэтому примем, что команды с операндами YY,ZZ выводят код символа в порт PB, а команды с операндами VV,WW в порт PA.
б) Найдем код YY, выводимый через порт PB. ASCII код буквы Q равен 51(HEX) = 0101 0001(BIN). Как уже говорилось, перед выводом его необходимо проинвертировать - 1010 1110. Однако этого мало, так как из схемы видно, что старший бит кода PB7 выводится на крайний правый светодиод линейки, а младший PB0 - на крайний левый. Обычно (за некоторыми региональными исключениями) считываем мы код с линейки (также, как читаем) слева - направо. Поэтому в приведенной схеме в коде при выводе в линейку необходимо еще и переставить биты (зеркально отобразить). Тогда окончательно YY = 0111 0101 = 75(HEX).
в) Раз мы начали вывод с порта PC, то ZZ является его адресом. Для PB на входах A1,A0 должна быть комбинация 01, и следовательно, в момент выполнения команды OUT ZZh,AL код на линиях ША A1,A0 также равен 01. ZZ = xxxxxx01. Где взять старшие 6 битов адреса? Из второй команды фрагмента программы - OUT x1000x01,AL (два младших бита уже соответствуют порту PB). Но два бита A7,A2 по-прежнему не определены. Обращаем внимание на схему дешифратора, в которой линия A7 подключена к прямому входу разрешения OE и следовательно A7=1, а линия A2 подключена к инверсному входу разрешения OE и следовательно A2=0.
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
1 | 1 | 0 | 0 | 0 |
0 | 0 | 1 |
Тогда ответом будет ZZ = C1(HEX).
г) Код VV мы решили выводить через PA, поэтому на 3-ю линию этого порта необходимо вывести 0, а на остальные - 1.
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 1 | 1 | 1 | 0 |
1 | 1 | 1 |
Поэтому VV = F7(HEX).
д) Адрес WW - это адрес порта PA и он отличается от адреса PB, который уже найден только двумя младшими битами A1,A0 = 00. WW = C0(HEX).
е) Осталось найти номер выхода дешифратора. Для этого определим значения на линиях ША подключенных к 4-м информационным (адресным) входам дешифратора и просуммируем весовые коэффициенты соответствующих входов.
A5 | A3 | A6 | A4 |
8 | 4 | 2 | 1 |
0 | 0 | 1 | 0 |
По определению работы дешифратора номером активизированного выхода будет десятичный эквивалент двоичного кода на его адресных входах, т.е. двойка.
ЗАДАЧА 11
РЕШЕНИЕ
На рисунке приведен программируемый контроллер прерываний (PIC) к которому подключены 4 источника прерываний. Как известно в ассемблере МП 580-й серии код операции CD(HEX) соответствует команде CALL. Тогда CDXXCD расшифровывается , как CALL CDXX (вызов подпрограммы с адресом CDXX - не забываем, что байты адреса в коде и в исходном тексте переставляются ). Для того, чтобы " окончательно подзапутать" решающего эту задачу старший байт адреса A15..A8 = CD(HEX) совпадает с кодом операции CD, а адреса обработчиков прерываний также имеют совпадающие байты. Ниже приведена таблица формирования контроллером младшего байта адреса XX(HEX) A7..A0 вызываемой подпрограммы. Для адресного интервала в 8 байтов между последовательно располагающимися адресами подпрограмм CALL YYXX, три старших бита команды инициализации контроллера прерываний ICW1 частично совпадают с номером ВУ подавшего запрос на прерывание.
вход запроса | Адресный интервал 4 байта | Адресный интервал 8 байт | ||||||||||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | |
3 старших бита ICW1 | номер ВУ | 3 старших бита ICW1 | ||||||||||||||
IR7 | A7 | A6 | A5 | 1 | 1 | 1 | 0 | 0 | A7 | A6 | 1 | 1 | 1 | 0 | 0 | 0 |
IRi | 1 | 0 | x | 0 | x | 0 | 0 | 0 | 1 | 0 | x | 0 | x | 0 | 0 | 0 |
.... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... |
IR0 | A7 | A6 | A5 | 0 | 0 | 0 | 0 | 0 | A7 | A6 | 0 | 0 | 0 | 0 | 0 | 0 |
номер ВУ |
а) Для определения адреса подпрограммы источника прерывания (3DC3, 333C, 3C33 или C33D - приведенны на рисунке) необходимо найти номер ВУ (3,7,6,4) подавшего запрос и из соответствующей этому ВУ команды JMP ZZWW извлечь адрес перехода ZZWW, который и будет ответом на первый вопрос. Адресный интервал пока не известен, поэтому попробуем расшифровать номер ВУi (i=0x0) для 4-х байтового интервала и (i=x0x) для 8-ми байтового. Комбинация битов 0x0 дает два номера 000=0 и 010=2, но ВУ с такими номерами в схеме отсутствуют. Комбинация битов x0x для 8-ми байтового интервала дает четыре номера 000=0, 001=1, 100=4 и 101=5. Только ВУ4 присутствует в схеме. Команда C3C33D перехода к обработчику прерывания (C3 - код команды JMP) или JMP 3DC3 (байты адреса переставлены) дает ответ на первый вопрос: адрес обработчика = 3DC3.
б) Формат команды ICW1 приведен ниже: биты A7,A6,A5 - три старших бита младшего байта адреса обработчика (уже найдены), F - определяет, какой интервал ипользуется 8-ми байтовый (F=0) или 4-х байтовый (F=1).
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
A7 | A6 | A5 | 1 | 0 | F | S | 0 |
Из решения на первый вопрос уже известно, что номер ВУ 4 для заданных начальных условий (x0x=4), может располагаться только во второй половине таблицы с адресным интервалом 8 байтов. Поэтому бит F=0. Бит S=1 свидетельствует, что используется один PIC, а S=0 - показывает, что контроллеров несколько. Из рисунка видно, что сигнал ~SP=1, следовательно PIC в схеме один и бит S=1. Тогда код ICW1 = 101 10 0 1 0 = B2(HEX).