МЕТОДИЧЕСКОЕ ПОСОБИЕ К СДАЧЕ КУРСОВЫХ ПРОЕКТОВ ПО ДИСЦИПЛИНЕ “МИКРОПРОЦЕССОРЫ И ЦИФРОВЫЕ УСТРОЙСТВА”
Описание работы схем для “чайников”.
Данная работа посвещена разрешению самых острых вопросов, которые ставит перед студентами РТФа 4 курса жизнь, а точнее, небезизвестные преподаватели курса МПиЦУ.
Поскольку вопросы эти, в основном, одни и те же, то, дабы не мозолить язык одними и теми же рассказами, со стороны дипломников 6-го курса, оказывающих моральную поддержку автору, и появилась идея написания этой методички, которая и была реализована.
Необходимо отметить, что большинство затруднений в понимании принципов работы проектируемых устройств решаются очень просто: необходимо просто сесть и на свежую голову ( если такова имеется) прочитать пояснительную записку, а так же посмотреть на схему трезвыми и умытыми глазами ( или хотя бы одним глазом).
Поэтому целью этой работы является не пересказ уже изложенного в пояснительных записках, а дополненительные пояснения для особо продвинутых студентов.
Итак, первым делом при включении питания генератор тактовых импульсов (обычно это DD1) формирует сигнал RESET на микропроцессор, который переходит в некое исходное состояние: в регистр, определяющий начало кодового сегмента CS во все разряды записываются единички, в указатель IP, определяющий смещение текущей команды относительно начала кодового сегмента записываются все нули, попутно сбрасывается регистр флагов, но для нас это уже не столь важно.
Таким образом, адрес первой команды, который выставиться на шину, будет:
CS+IP==FFFF0h
Просьба обратить внимание на то, что содержимое указателя IP смещено относительно содержимого СS вправо на один шестнадцатиричный разряд.
Адрес FFFF0h выставляется на шину при запуске микропроцессора ВМ86 (88) всегда, вне зависимости от того, какое устройство разрабатывается: дверной звонок, генератор или устройство обработки показаний пациентов.
Но, поскольку ни один из разработанных курсовых проектов не использует всю 20-ти разрядную шину адреса, в пояснительной записке начальный исполняемый адрес записывается обычно более скромно, например, 3F0h, если используется 10 разрядов шины адреса (11.1111.0000b). При этом для проектируемого устройства, а тем паче для нас не важно, какой код будет висеть на старших адресных линиях, все равно по плате эти линии разводиться не будут, а для ВМ88 к соответствующим ногам микропроцессора вообще можно ничего не припаивать.
Итак, приняв сигнал RESET (сброс), микропроцессор выставляет на шину адрес FFFF0h, а на ногу STB активный управляющий сигнал, после чего вся комбинация нулей и единичек (адрес) защёлкивается в буферном регистре ИР82. (Слово защёлкивается обозначает не что иное, как то, что указанная информация будет присутствовать на выходе регистра в течение всего времени, пока идёт обращение к памяти или внешнему устройству).
Необходимо отметить, что в устройствах, выполненных на ВМ86, адрес защёлкивается в двух регистрах ИР82, а в устройствах на ВМ88 – в одном, связано это с тем, что ВМ88 обрабатывает 8-разрядные, а ВМ86 – 16-разрядные данные, которые передаются в микропроцессор или от него по тем же самым ногам, на которые в начале выставляется адрес устройства, к которому идёт обращение.
После того, как адрес защёлкивается в регистрах, ноги микропроцессора освобождаются, после чего по ним идёт уже передача данных (через шинные формирователи).
Адресные линии через логику или дешифратор подаются на входы CS (выбор кристалла) микросхем или на другие управляющие входы аналоговых и цифровых устройств, поэтому после того, как адрес защёлкнулся в регистрах, одно из устройств включится (или переключится), одним словом, сработает, как и было нами задумано.
В частности, когда на шину выставляется адрес FFFF0h, (см. выше), то включается ПЗУ, в котором у нас записано не что иное, как программа, и оттудова считывается первая команда (как правило, это команда CLC), которая с успехом и выполняется.
Затем считывается следующая команда и т.д.
Далее по сценарию выполняются команды, которые последовательно программируют внешние устройства (это могут быть всевозможные контроллеры и почти всенепременно таймер).
Что значит программируются устройства? Это значит, что в специальный регистр (регистры) этих устройств записывается некий код, который настраивает данное устройство на работу в определённом режиме, который нам нужен.
В частности, почти во всех вариантах курсовых один из каналов таймера используется как делитель частоты, следовательно, после того, как в регистр управляющего слова этого канала мы запишем соответствующий код, а в регистр константы пересчёта некое число N, таймер начнёт поступающую на вход CLK частоту FCLK делить на N, т.е. на выходе OUT будет формироваться импульсная последовательность с частотой FCLK/N. При этом необходимо, чтобы на входе GATA (G) сего канала присутствовала “1”, которая является сигналом разрешения для работы ( в большинстве курсовых вход GATA просто повешен на питание через резистор 1 кОм, т.е. работа разрешена всегда).
Больным вопросом является использование стека, точнее, его неиспользование.
Под стеком понимается некая область памяти, которую использует для своих нужд микропроцессор и в которую при желании может запустить лапу и пользователь.
Не останавливаясь подробно на особенностях работы стека, заметим, что поскольку выполняемые в проектируемых устройствах программы просты, стек при работе этих программ не используется и всё было бы замечательно, если бы не одна маленькая гадость: дело в том, что при поступлении на вход INT сигнала “запрос прерывания” микропроцессор АВТОМАТИЧЕСКИ записывает в этот самый стек адрес точки возврата и регистр флагов. Начальный адрес, начиная с которого эта информация начинает было записываться, определяется регистром SS и указателем SP, аналогично CS и IP для кодового сегмента.
Но вся самая суть-соль в том, что эта информация нам лично абсолютно не нужна, т.к. подпрограмма обработки прерывания у нас всего одна, и после ее выполнения микропроцессор, как правило, просто ждёт, пока поступит ещё один сигнал “запрос прерывания”, чтобы снова выполнить ту же самую подпрограмму, т.е. никуда возвращаться ему не нужно!!!
В большинстве курсовых ОЗУ не используется, а специально ставить микросхему под стек, который все равно нафиг не нужен не имеет смысла, поэтому вершина стека SS и указатель SP инициализируются на какой-нибудь левый адрес, в цикле обработки прерывания микропроцессор выставляет этот адрес на шину, после чего по шине данных добросовестно выдаёт все что ему положено в никуда.
Можно было бы вообще ничего не записывать в SS и SP, что в более поздних версиях курсовых успешно практикуется, но в некоторых вариантах схема содержит ОЗУ, и чем чёрт не шутит, вдруг микропроцессор из вредности запишет свою левую информацию в это самое ОЗУ и испортит нам какие-нибудь данные, поэтому нелишне все-таки предохранится от такой неожиданности.
В деле грызения гранита науки МпиЦУ очень важно разгрызть, как же все-таки микропроцессор обрабатывает эти самые прерывания.
Итак, АЦП, таймер или ещё какая-нибудь штуковина формируют сигнал запрос прерывания на микропроцессор (вход INT). Микропроцессор бросает все свои дела, а занимается он преимущественно тем, что ничего не делает и приступает к обработке этого самого набившего всем оскомину прерывания.
Для этого он переводит управляющие выводы в третье состояние, кроме INTA, на котором формируется активный сигнал нулевого уровня.
После этого микропроцессор считывает один байт по шине данных. Способы возникновения этого байта разные: в некоторых курсовых он считывается из специально предусмотренного регистра, который включается вышеупомянутым сигналом INTA, но на сегодняшний день это решение морально устарело, хотя тут тоже ещё можно поспорить.
В более продвинутых версиях курсовых линии шины данных подключены через резисторы 1 кОм на питание, так что на них “по умолчанию” выставлены единички.
Поскольку микропроцессор работает с ТТЛ-устройствами, нормальной передаче данных эти единички не мешают, т.к. при передаче “0” соответствующая линия ШД замыкается на землю и земля в соревновании потенциалов неизменно побеждает.
Но вот в цикле обработки прерывания, когда микропроцессор осуществляет чтение вышеупомянутого байта с шины, т.к. все микросхемы в этом цикле выключены, результатом чтения и будут эти единички (код FFh).
К слову говоря, этот байт называется номером вектора прерывания.
Далее микпропроцессор домножает сей байт на 4 (это действие никак не прописано в программе, а описываемый алгоритм обработки прошит непосредственно в структуре микропроцессора) и получает некое число (если номер вектора прерывания – FFh, то результат умножения – 3FCh). Полученное число есть не что иное, как адрес, который выставляется на шину. Этот адрес открывает ПЗУ, в котором, начиная с сего адреса записаны 4 байта, определяющие адрес подпрограммы обработки прерывания, при этом в некоторых вариантах под хранение этих 4-х байт выделено специальное ПЗУ, а в некоторых указанная информация хранится в том же ПЗУ, что и программа.
После того, как микропроцессор считал 4 байта, определяющие адрес подпрограммы обработки прерывания, он заменяет CS и IP новыми (считанными из ПЗУ) значениями и начинает выполнять уже непосредственно саму подпрограмму.
Вот и все ответы на наиболее часто задаваемые вопросы автору сих строк.
2.02.2001 г.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.