Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП устройства СУ / Методичка на КП 220400.doc
Скачиваний:
29
Добавлен:
19.03.2015
Размер:
285.7 Кб
Скачать

Рекомендации по выполнению заданий по вариантам

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

Рекомендации к заданию 1. Для подсчета количества единиц необходимо установить факт наличия единицы в каждом разряде. Для этого достаточно сдвинуть байт влево или вправо и проверить значение флага переноса. При наличии единицы в младшем или старшем бите, в зависимости от направления сдвига, она зафиксируется во флаге переноса. Сдвинув байт 8 раз можно, таким образом, проверить на наличие единиц все 8 разрядов байта. Подсчитать количество единиц можно путем инкремента счетчика с его начального нулевого значения при каждом сдвиге, если единица была зафиксирована во флаге переноса. Иначе инкремент счетчика единиц пропускается. В качестве счетчика единиц можно использовать любой регистр общего назначения. Очевидно, что сдвиг байта лучше организовать в цикле из 8 шагов, используя для этого стандартные методы программирования циклических структур на языке Ассемблера. Поскольку подсчитывать количество единиц нужно в шестнадцатиразрядном слове, то необходимо будет поочередно подсчитать количество единиц одного байта, а затем второго с накоплением их суммы в одном и том же регистре – счетчике единиц.

Для индикации результата подсчета на двухразрядном десятичном семисегментном индикаторе необходимо сформировать 16 семисегментных кодов. Поскольку необходимо отображать только две десятичные цифры (максимальное количество единиц может быть 16), а для управления одного семисегментного индикатора требуется 7 разрядов по количеству его сегментов, то индикаторы единиц и десятков можно подключить параллельно к одному порту вывода, в котором старший восьмой разряд может использоваться как бит выбора индикатора единиц или десятков. Этим разрядом можно управлять ключами, которые будут коммутировать к питанию или к земле либо индикатор единиц, либо индикатор десятков. Если вход одного ключа подключить напрямую к этому биту, то вход другого ключа нужно будет подключить через инвертор. Таким образом, будет реализован принцип динамической индикации, когда будут поочередно высвечиваться значения единиц и десятков. Сформировав, таким образом, 16 кодов индикатора, их последовательность можно разместить в соседних ячейках ПЗУ как константы. В первой ячейке этой области будет храниться семисегментный код числа 00, во второй – 01 и т.д. Если теперь к адресу первой ячейки (базовому адресу) области памяти с этими кодами прибавить двоичный код суммы единиц (смещение относительно базового адреса), то получится адрес ячейки памяти, в которой хранится нужный семисегментный код. Достаточно извлечь из памяти с полученным адресом ее содержимое и вывести его в порт вывода, куда подключен семисегментный индикатор.

По заданию требуется выводить показания и удерживать их в течении 1 секунды. Для этого можно в систему включить таймер, который необходимо запрограммировать на генерацию последовательности импульсов с периодом 1 секунда, и подключить его выход по каналу прерывания. По окончании вывода текущего показания на индикатор, МП будет вводиться в состояние ожидания командой HLT, из которого будет выводиться прерыванием от таймера. Подпрограмма обслуживания прерывания в данном случае будет содержать только команду возврата из подпрограммы. Таким образом, таймер будет задавать только временные интервалы и синхронизировать работу программы. Однако данный способ требует дополнительных аппаратных затрат. В данном случае задержку между двумя соседними выводами можно организовать программно. Т.е. необходимо загрузить микропроцессор какими-либо действиями, не важно какими, а важно только время, в течении которого они будут выполняться. Это время и должно составить 1 секунду. Оптимальнее всего микропроцессор загрузить прокруткой пустого цикла. Поскольку требования к периодичности не высокие, можно учитывать только то время, в течении которого выполняется цикл без учета однократно выполняемых команд. Следует обратить внимание на то, что скорее всего восьмиразрядный формат регистра, который будет использоваться в качестве счетчика цикла и который позволит организовать не более 255 шагов цикла, не позволит организовать временную задержку необходимой продолжительности. Поэтому необходимо будет организовывать вложенные циклы или в качестве счетчика использовать шестнадцатиразрядные регистровые пары. При реализации проекта на микроконтроллере задержку удобно организовывать на таймере, поскольку он входит в состав почти все микроконтроллеров.

Рекомендации к заданию 2. Для установления факта наличия нуля или единицы в разряде можно воспользоваться методом, предложенным в рекомендации к заданию 1. Т.е. путем сдвига байта и проверки при сдвиге флага переноса. Если при сдвиге флаг переноса установлен в 1, то в данном младшем (старшем) бите была 1 и при этом необходимо сформировать маску с единичной старшей тетрадой (111100002), как это требуется по заданию. В противном случае в качестве маски формируется нулевой байт. Далее нужно сформировать номер датчика, который будет накладываться на полученную маску. Поскольку сдвиг будет производиться в цикле, то достаточно просто организовать счетчик цикла, который будет инкрементироваться на каждом шаге цикла, начиная с нулевого значения, и он же будет носителем номера датчика. Очевидно, поскольку количество сдвигов будет равно количеству разрядов в байте, то номер датчика не превысит значения 8, т.е. будет занимать формат младшей тетрады в байте. Для наложение маски на номер датчика необходимо подобрать подходящую логическую операцию и полученное значение вывести в порт вывода.

По заданию требуется выводить показания и удерживать их в течении 2-3 секунд. Для этого можно воспользоваться рекомендациями к заданию 1. Поскольку требования к периодичности не высокие и лежат в допуске одной секунды, то можно взять среднее значение периода, т.е. 2,5 секунды, и в течение этого времени прокручивать пустой цикл.

Рекомендации к заданию 3. Суть задания сводится к нахождению среднего арифметического 64 значений. Поскольку формат входных данных однобайтовый, а нахождение среднего значения подразумевает суммирование этих 64 значений, то достаточно высока вероятность, что в процессе вычисления суммы возникнет переполнение. Т.е. сумма должна формироваться двухбайтовая. Очевидно, что опросы необходимо реализовывать в цикле из 64 шагов. Формирование младшего байта суммы не представляет трудностей. Для этого достаточно взять регистр с нулевым начальным значением и на каждом шаге цикла прибавлять к его значению значение текущего опроса. Таким образом в регистре будет накапливаться младшей байт всей суммы. Старший байт можно формировать путем инкремента изначально обнуленного второго регистра на каждом шаге цикла, если при выполнении суммирования на текущем шаге цикла возникал перенос в 9-й разряд. Если такого переноса не было, инкремент будет пропускаться. Для нахождения среднего значения необходимо полученную сумму разделить на 64. Деление двоичного кода на 2 равноценно его сдвигу вправо на 1 разряд. Необходимо при написании программы определить, на сколько разрядов необходимо сдвинуть код, чтобы разделить его на 64. Следует учесть, что полученная сумма является двухбайтовой, а не во всех восьмиразрядных микропроцессорах есть возможность сдвига регистровых пар. Поэтому сдвигать придется побайтно и таким образом, что если возникает перенос единицы из старшего байта в младший, его нужно передавать при сдвиге в младший байт. А на месте сдвинутых вправо разрядов старшего байта должны формироваться нули.

Поскольку в задании требуется реализовать опрос по прерыванию, то необходимо это учесть и ввод выполнять в обслуживающей прерывание подпрограмме. Для этого необходимо определить указатель стека начальным значением, и в нужном месте разрешить прерывание и вписать команду останова. Сам процесс поиска среднего арифметического должен реализовываться в основной программе.

Рекомендации к заданию 4. Задание сводится к программированию протокола обмена данными с проверкой ошибок по контролю на четность. Некоторые трудности возникают из-за того, что передаваемые данные имеют 12-разрядный формат, т.е. формат двухбайтового числа. Не во всех восьмиразрядных микропроцессорах есть возможность воздействовать на флаг четности двухбайтовым числом. Поэтому определять четность всего 12-разрядного кода придется побайтно. Вначале необходимо опросить порты ввода и значения сохранить для последующего их вывода. Далее нужно проверить четность первого байта и если он содержит четное количество единиц, зафиксировать признак четности как 0 в каком-либо регистре общего назначения. Если же первый байт содержит нечетное количество единиц, то в регистре необходимо зафиксировать 1. Тоже самое следует повторить со вторым опрошенным значением. Общий признак четности будет формироваться, если оба байта содержат четное или нечетное количество единиц, т.е. комбинации 0 и 0 или 1 и 1 введенных признаков четности. В случае четного и нечетного количества единиц в обоих байтах общее количество единиц будет нечетное. А это есть комбинация 0 и 1 или 1 и 0 введенных признаков четности. Т.е. чтобы определить общую четность/нечетность единиц эти два признака необходимо объединить операцией «исключающее ИЛИ», после чего проверить флаг нуля. В случае четного количества единиц, результат операции будет нулевой (,), а в случае нечетного – единичный (,). Иначе проверить четность единиц двухбайтового кода можно просто просуммировав эти единицы, как это предлагалось сделать в рекомендациях к заданию 1. А четность этого количества достаточно определить по младшему разряду полученной суммы как четность десятичного эквивалента двоичного кода. В случае, если в младшем разряде суммы будет ноль, то количество единиц четное. В противном случае оно будет нечетное. Выделить младший разряд суммы единиц можно путем его маскирования. Студент может выбрать любой из методов определения четности количества единиц двухбайтового числа или предложить свой.

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

Далее необходимо смоделировать передачу двухбайтового слова с портов вывода на порты ввода той же микропроцессорной системы. Для этого необходимо выходы портов вывода в принципиальной схеме замкнуть на входы других портов ввода, по которым будет вводиться уже преобразованный код с четным количеством единиц. По заданию подразумевается возможность ошибки при приеме этого кода. Поэтому требуется не более десяти раз выполнять процедуру передачи-приема до тех пор, пока он не передастся и примется без ошибки. Очевидно, что необходимо организовать процедуру передачи-приема преобразованного кода в цикле из десяти шагов. Но при успешной передаче-приеме, когда количество единиц окажется четным, из цикла необходимо выйти досрочно. Для формирования признака четности принимаемого модифицированного кода можно воспользоваться той же процедурой, что и при проверке его четности при начальном опросе с цифрового прибора. Т.е. в программе эту процедуру определения четности можно оформить в виде подпрограммы. В этом случае необходимо не забыть об организации стека и об определении начального значения в указатель стека. Если же принимаемый преобразованный код и после 10 опросов будет содержать нечетное количество единиц, то необходимо в порт вывода вывести 1, а в принципиальной схеме к младшему разряду этого порта подключить светодиод как индикатор ошибочной передачи.

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

Рекомендации к заданию 5. По заданию требуется определить среднее значение двух знакозависимых двоичных кодов. АЦП по заданию готовит прямой одиннадцатиразрядный код как положительного, так и отрицательного входного напряжения с двенадцатым знаковым битом. При разработке принципиальной схемы не обязательно подбирать АЦП с такими характеристиками, а можно ограничиться УГО гипотетического АЦП. Для того, чтобы можно было учесть знак при выполнении арифметических операций, прямой код преобразуют в дополнительный. Согласно этому коду самый старший разряд формата разрядной сетки цифрового устройства отвечает за знак. Положительному значению в этом разряде соответствует ноль, а отрицательному – единица. Все весовые разряды прямого кода положительного числа остаются без изменений. Для отрицательного числа весовые разряды инвертируются и к полученному инверсному коду арифметически прибавляется единица. Поскольку АЦП готовит двенадцатиразрядный код и по условию выходной код должен быть шестнадцатиразрядный с шестнадцатым знаковым битом, то в качестве формата разрядной сетки необходимо выбрать шестнадцатиразрядный формат, т.е. двухбайтовый. Для этого АЦП подключается в систему через два восьмиразрядных порта ввода, через которые он и опрашивается после завершения АЦП цикла преобразования. Опрошенные байты сохраняются в регистрах МП. Далее необходимо проверить значение четвертого разряда старшего байта (двенадцатого разряда АЦП). Это можно сделать, выделив его по маске. В случае, если в этом разряде ноль, то входное напряжение положительно и полученный код с АЦП уже готов для последующей обработки. В случае, если в этом разряде единица, необходимо преобразовать код с АЦП в дополнительный. При этом знаковый двенадцатый разряд выходного кода АЦП должен оказаться на месте самого старшего шестнадцатого бита дополнительного кода. Сделать это можно следующим образом. Младший байт сохраненного значения с АЦП достаточно просто проинвертировать, а в старшем байте обнулить пять старших левых битов по маске, после чего его также проинвертировать. Затем применить двухбайтовое сложение с единицей к содержимому регистров, хранящих инверсные коды. По правилу формирования дополнительного кода отрицательного числа еще необходимо записать единицу в самый старший бит. Но в нашем случае этого можно не делать, поскольку единица образуется автоматически путем инверсии записанных по маске нулей в старшие пять разрядов старшего байта. Таким образом, дополнительный код отрицательного значения также готов для последующей обработки.

После необходимо второй раз опросить АЦП и выполнить те же преобразования, что и для первого опроса. Для компактности программы процедуру преобразования в дополнительный код можно оформить в программе как подпрограмму. В этом случае необходимо не забыть об организации стека и об определении начального значения в указатель стека.

Далее для нахождения среднего значения необходимо просуммировать дополнительные двухбайтовые коды двух опросов с использованием команд двухбайтового сложения. Знак суммы определится флагом знака S. Если этот флаг установится в ноль, то полученная сумма окажется положительной и представленной в прямом коде. Если же флаг знака установится в единицу, то полученная сумма окажется отрицательной и представленной в дополнительном коде. Для нахождения среднего значения полученную двухбайтовую сумму необходимо поделить на 2, т.е. сдвинуть этот код вправо на один разряд. При этом следует учесть, что при сдвиге однобайтовых регистров необходимо передать перенос из младшего бита старшего байта в старший бит младшего байта. Также необходимо, чтобы самый старший восьмой разряд старшего байта результата заполнился нулем. Это можно реализовать путем обнуления флага переноса перед применением команды разомкнутого сдвига для старшего байта. Далее результат деления на 2 необходимо преобразовать в прямой код, если при нахождении суммы флаг знака S установился в единицу. Алгоритм перевода дополнительного кода в прямой такой же, как и алгоритм перевода прямого кода в дополнительный. Таким образом, сформируется требуемый по заданию шестнадцатиразрядный прямой код со знаковым шестнадцатым битом.

Рекомендации к заданию 6. Суть задания сводится к программированию на языке Ассемблера алгоритма поиска максимума и минимума. Данные для поиска поступают с АЦП, на который в свою очередь они поступают в виде аналоговых напряжений через восьмиканальный коммутатор с цифровым управлением. Поэтому для опроса текущего канала необходимо задать адресный код на вход управления коммутатора через один из портов вывода, а также запрограммировать протокол обмена с АЦП. АЦП студент должен выбрать самостоятельно. Необходимо уделить внимание к подключению АЦП к микропроцессорной системе. Управляющие сигналы на АЦП, такие как «старт» и «конец преобразования», могут заводиться через порты ввода-вывода. Сигнал «конец преобразования» также может заводиться аппаратно непосредственно на вход «готовности» микропроцессора, при этом не нарушая логики работы по сигналу готовности от других устройств и не конфликтуя с другими устройствами, если такие имеются. Полезно также на эту тему прочитать рекомендации к заданию 7 по подключению АЦП.

Сам алгоритм поиска минимума и максимума заключается в циклическом сравнении текущего опроса с минимумом и максимумом, найденными на предыдущих шагах цикла. Изначально минимуму и максимуму присваивается обычно значение самого первого опроса. Если текущий опрос оказывается больше прежнего максимума, то значение этого опроса присваивается максимуму как новое значение. В противном случае максимум остается прежним. И, аналогично, если значение текущего опроса оказывается меньше прежнего минимума, то значение этого опроса присваивается минимуму как новое значение. В противном случае минимум остается прежним. В результате циклической проверки всех значений будут выявлены максимальные и минимальные значения всей последовательности опросов. Проверку на «больше», «меньше» необходимо производить командой сравнения и проверкой соответствующего флага. Следует обратить внимание на то, какой именно флаг в случае использования по заданию униполярного АЦП следует использовать. Подразумевается, что АЦП готовит двоичные восьмиразрядные коды только положительных значений, где восьмой разряд будет иметь не смысл знака, а смысл веса числа. Т.е. в результате заложенной в сравнение операции вычитания в старшем восьмом разряде может получиться единица, которая зафиксируется во флаге знака, что не обязательно будет являться признаком отрицательной разницы.

Рекомендации к заданию 7. По заданию требуется опросить три аналоговых сигнала либо через три независимых АЦП, либо через один АЦП, вход которого подключен к аналоговому коммутатору с цифровым управлением. Способы такого подключения были описаны в рекомендациях к заданию 6. Если же студент выберет способ с тремя АЦП, то для каждого из них нужно выделить порт ввода для ввода оцифрованных данных с выхода АЦП, а так же порт ввода для подключения сигналов «конец преобразования» каждого из них. Эти сигналы можно подключить к различным разрядам порта ввода и в дальнейшем выделять каждый разряд методом маскирования, дожидаясь программно конца преобразования необходимого АЦП. Также сигналы «конец преобразования» можно завести через вентиль с необходимой логической функцией на вход «готовности» микропроцессора, благодаря чему фиксация конца преобразования будет реализовываться аппаратно.

Программу следует начать с опроса каналов уставок Uвх1 и Uвх2. Из условия следует, что необязательно Uвх1 < Uвх2. Поэтому следующим этапом является сортировка оцифрованных значений уставок на максимальное Uвх.max и минимальное Uвх.min значение. Делается это с помощью команды сравнения и проверки соответствующего флага. Так же как и в предыдущем варианте, в данном задании известно, что АЦП однополярные. Следовательно, они готовят прямой восьмиразрядный код положительных значений с 8-м весовым разрядом, а не разрядом знака. Поэтому необходимо правильно выбрать флаг, отвечающий в данном случае за положительный или отрицательный результат разницы операции сравнения (см. рекомендации к заданию 6).

Для проверки принадлежности опрошенного значения верхней и нижней границе нужно также использовать команду сравнения и дальнейшую проверку флага, учитывая, что все значения положительные и представлены восьмиразрядными прямыми кодами. Сначала необходимо проверить на принадлежность одной границе, например, верхней. И если текущее значение строго превысит (Uвх > Uвх.max) верхнюю границу, можно переходить к следующему опросу. Если же текущее значение окажется меньше или равно верхней границе (Uвх Uвх.max), т.е. будет принадлежать верхнему интервалу, то его необходимо проверить на принадлежность нижней границе. Если оно окажется строго меньше нижней границы Uвх < Uвх.min, то также можно переходить к следующему опросу. Если оно окажется больше и равно нижней границы Uвх Uвх.min, то значит, что оно принадлежит обеим интервалом и его необходимо вывести в порт вывода. После чего можно переходить к следующему опросу. Выполнять это нужно в цикле из 100 шагов, после чего перейти к новой серии проверки, т.е. ввести новые границы и т.д. Иными словами, необходимо выполнить безусловный переход на начало программы.

Рекомендации к заданию 8. В задании сказано, что амплитуды аналоговых сигналов нормированы к входному напряжению АЦП. Это означает, что на канал измерения напряжения и тока поступают напряжения уже после соответствующих нормирующих преобразователей и измерение происходит согласно метрологическому требованию во второй трети шкалы. Поскольку мощность есть произведение тока на напряжение, то задание сводится к программированию операции произведения. Причем сделать это нужно согласно задания через сдвиги и сложение даже в том случае, если выбранный микропроцессор или микроконтроллер будут иметь команду умножения. Сама задача эта не сложна и может быть проиллюстрирована простым примером:

Т.е. достаточно переменной (регистру), в которой будет формироваться частичное произведение и все произведение по завершению умножения, присвоить начальное нулевое значение. В дальнейшем пошагово в цикле, состоящем из количества шагов, равного количеству разрядов множимого и множителя, необходимо проверять значение очередного разряда множителя. Делать это можно путем маскирования интересующего разряда множителя или проверкой флага переноса при его сдвиге. Если этот разряд равен 1, то к переменной с частичным произведением прибавляется значение множимого, но сдвинутого на один разряд влево. Если же он равен 0, то суммирование пропускается а выполняется только сдвиг влево множителя. Некоторая сложность возникает в том, что исходные данные восьмиразрядные и произведение должно получиться двухбайтовое. Т.е. при реализации умножения придется оперировать сдвигами и сложением двухбайтовых чисел. Способы этого были описаны в рекомендациях к заданиям 3 и 5.

Рекомендации к заданию 9. Рекомендации по выполнению этого задания аналогичны рекомендация к заданию 3 с той лишь разницей, что исходные данные двенадцатиразрядные. Т.е. при нахождении среднего арифметического придется применять методы сложения двухбайтовых чисел при накоплении суммы 16 опросов. Сделать это можно путем побайтного сложения, используя команду сложения без учета флага переноса при сложении младших байтов и команду сложения с учетом флага переноса при сложении старших байтов.

Рекомендации к заданию 10. Рекомендации к данному заданию аналогичны рекомендациям к заданию 7. Для проверки условий «меньше», «больше» необходимо использовать операции сравнения и проверки соответствующего флага. При этом необходимо учесть, что данные представлены восьмиразрядными прямыми кодами, что влечет за собой требования к выбору флага, отражающего знак разницы прямых положительных кодов. Формулировка «считать, что аналоговые сигналы нормированы к входному напряжению АЦП» свидетельствует о том, что соответствует полной шкале восьмиразрядного АЦП. Методы по организации задержки были описаны в рекомендациях к заданиям 1 и 2.

Рекомендуемая литература:

1. Электронная версия конспекта «Микропроцессоры и ЭВМ в приборостроении» каф.ИСИТ.

2. В.И. Калашников, С.В. Нефедов, А.Б. Путилин и др. Информационно-измерительная техника и технологии. М.: «Высшая школа». 2002г.

3. А.В. Нефедов. Интегральные микросхемы и их зарубежные аналоги. Справочник. Том 6. М.: Издательское предприятие РадиоСофт, 2007г.

4. Бирюков С.А. Применение цифровых микросхем серий ТТЛ и КМОП. Справочник. Изд-во «ДМК», 2000.

Приложение 1

Московский Государственный Открытый Университет

Факультет__________________ Кафедра______________________

Специальность_____________________________________________

Задание

На курсовую работу_____________________________________