Асинхронные последовательные порты
Рассмотренные синхронные последовательные порты позволяют достигнуть больших скоростей передачи данных, но провод, по которому ведётся передача синхросигнала, практически не несёт информации. Такой сигнал можно было бы сформировать и на приёмном конце линии передачи, если заранее договориться о скорости передачи. Единственная проблема - это то, что невозможно построить два абсолютно одинаковых генератора. Генераторы необходимо синхронизировать. Для синхронизации внутренних генераторов используется особое условие начала асинхронной передачи: старт. Всё время, пока не ведётся передача информации, на линии присутствует стоп-сигнал единичного уровня. Перед началом передачи каждого байта передаётся старт-бит, сигнализирующий приемнику о начале посылки данных, за которым следуют информационные биты. Стартовый бит всегда передаётся нулевым уровнем с длительностью, равной длительности информационных бит. В некоторых случаях после передачи информационных бит может передаваться, бит паритета (четности). Завершается передача данных стоп-сигналом. Минимальная длительность стопового сигнала должна быть 1,5 длительности информационных бит, но обычно используют паузу между соседними пакетами данных две длительности информационного бита. Временная диаграмма передаваемых сигналов при асинхронной передаче приведена на рисунке 6.
Рисунок 6. Временная диаграмма передаваемых сигналов при асинхронной передаче.
Продолжительность стопового бита не ограничена. Это позволяет регулировать скорость передачи в зависимости от скорости поступления информации.
Асинхронные последовательные порты широко используются в современной вычислительной технике. Для получения дополнительной информации можно обратиться к дополнительной литературе или к файлу
[ ]
Блок микропрограммного управления
Блок микропрограммного управления предназначен для формирования последовательности микрокоманд блока обработки сигналов. В простейшем случае его можно построить на счетчике с возможностью предзаписи и ПЗУ. Схема такого блока приведена на рисунке 3.
Рисунок 3. Блок микропрограммного управления.
В этой схеме адрес очередной микрокоманды формирует двоичный счётчик. Если требуется осуществить безусловный или условный переход, то новый адрес записывается из ПЗУ в этот счётчик как в обычный параллельный регистр по сигналу параллельной записи V. Переход к следующему адресу микрокоманды производится по сигналу общей синхронизации CLK.
Рисунок 4. Формат процессора.
[ ]
Блок обработки сигналов микропроцессора
Основным принципом работы любого цифрового устройства с памятью, в том числе и микропроцессора, является наличие цепи синхронизации. Этот сигнал, как и цепь питания, подводится к любому регистру цифрового устройства.
Блок обработки сигналов предназначен для считывания из системной памяти и выполнения считанных команд. Эти действия он осуществляет под управлением , который формирует последовательность микрокоманд, необходимую для выполнения команды. Схема одного из вариантов построения блока обработки сигналов приведена на рисунке 1.
Рисунок 1. Блок обработки сигналов.
В этой схеме явно просматривается, что отдельные биты микрокоманды (показанной внизу схемы) управляют различными блоками БОС, поэтому их можно рассматривать независимо друг от друга. Такие группы бит называются полями микрокоманды и составляют формат этой микрокоманды. Кроме бит, управляющих блоком обработки сигналов есть биты, управляющие блоком микропрограммного управления. Формат микрокоманды рассматриваемого процессора приведён на рисунке 3. Результат выполнения микрокоманды записывается по сигналу общей синхронизации CLK.
Для хранения и декодирования выполняемой команды выделим восьмиразрядный регистр, который назовём RI.
Для реализации более простой системы команд выберем аккумуляторный процессор. Соответственно необходимо один из регистров выделить в качестве аккумулятора ACC.
Так как мы выбрали для примера восьмиразрядный микропроцессор, то и все регистры в этом процессоре восьмиразрядные. Максимальное число, которое можно записать в такой регистр - 255, но для большинства программ такого объёма памяти недостаточно. В приведённой на рисунке 1 схеме для того, чтобы получить 16-ти разрядный адрес используется два 8-ми разрядных регистра адреса. Теперь максимальное число, которое можно записать в этих двух регистрах будет 65535, что вполне достаточно для записи программ и обрабатываемых ими данных. Для того, чтобы различать регистр старшего и младшего байта адреса обозначим их как PCH - старший байт и PCL- младший байт.
Это позволяет при помощи восьмиразрядного АЛУ формировать 16-ти разрядный адрес.
Программный счётчик хранит текущее значение ячейки памяти из которой считывается команда, но процессор может обращаться и к данным, поэтому для формирования адреса выделим ещё пару регистров RAH - старший байт и RAL - младший байт. Выходы этих регистров выведем за пределы микросхемы и будем использовать в качестве шестнадцатиразрядной шины адреса.
Ещё один регистр используется для формирования сигналов управления системной шины микропроцессора. В простейшем случае это сигналы записи (WR) и чтения (RD). Для формирования необходимых сигналов достаточно записывать в определённый бит регистра логический 0 или 1. Определим формат регистра управления. Пусть нулевой бит этого регистра будет сигналом записи, а первый бит этого регистра будет сигналом чтения. Остальные биты этого регистра пока не важны. Полученный формат приведён на рисунке 2.
Динамические оперативные запоминающие устройства (ОЗУ)
Статические оперативные запоминающие устройства позволяют обеспечивать хранение записанной информации до тех пор, пока на микросхему подаётся питание. Однако запоминающая ячейка статического ОЗУ занимает относительно большую площадь, поэтому для ОЗУ большого объема в качестве запоминающей ячейки применяют конденсатор. Заряд на этой ёмкости естественно с течением времени уменьшается, поэтому его необходимо подзаряжать с периодом приблизительно 10 мс. Этот период называется периодом регенерации. Подзарядка ёмкости производится при считывании ячейки памяти, поэтому для регенерации информации достаточно просто считать регенерируемую ячейку памяти.
Схема запоминающего элемента динамического ОЗУ и его конструкция приведена на рисунке 1.
Схема запоминающего элемента динамического ОЗУ и его конструкция.
При считывании заряда ёмкости необходимо учитывать, что ёмкость линии считывания много больше емкости запоминающей ячейки. Графики изменения напряжения на линии считывания при считывании информации с запоминающей ячейки без применения регенерации приведены на рисунке 2.
Рисунок 2. Графики изменения напряжения на линии считывания при считывании информации с запоминающей ячейки.
Первоначально на линии записи/считывания присутствует половина питания микросхемы. При подключении к линии записи/считывания запоминающей ячейки заряд, хранящийся в запоминающей ячейке, изменяет напряжение на линии на небольшую величину DU. Теперь это напряжение необходимо восстановить до первоначального логического уровня. Если приращение напряжения DU было положительным, то напряжение необходимо довести до напряжения питания микросхемы. Если приращение DU было отрицательным, то напряжение необходимо довести до уровня общего провода.
Для регенерации первоначального напряжения, хранившегося в запоминающей ячейке в схеме применяется RS триггер, включенный между двумя линиями записи/считывания. Схема такого включения приведена на рисунке 3. Эта схема за счет положительной обратной связи восстанавливает первоначальное значение напряжения в запоминающем элементе, подключенном к выбранной линии считывания.
То есть, при считывании ячейки производится регенерация хранящегося в ней заряда.
Рисунок 3. Схема регенерирующего каскада.
Для уменьшения времени регенерации микросхема устроена так, что при считывании одной ячейки памяти в строке регенерируется вся строка.
Особенностью динамических ОЗУ является мультиплексирование шины адреса. Адрес строки и адрес столбца передаются поочередно. Адрес строки синхронизируется стробирующим сигналом RAS# (Row Address strobe), а адрес столбца - CAS# (Column Adress Strobe). Мультиплексирование адресов позволяет уменьшить количество ножек микросхем ОЗУ. Изображение микросхемы динамического ОЗУ приведено на рисунке 4, а временные диаграммы обращения к динамическому ОЗУ на рисунке 5.
Рисунок 4. Изображение динамического ОЗУ на принципиальных схемах.
Рисунок 5. Временная диаграмма обращения к динамическому ОЗУ
Именно так долгое время велась работа с динамическими ОЗУ. Затем было замечено, что обычно обращение ведется к данным, лежащим в соседних ячейках памяти, поэтому не обязательно при считывании или записи каждый раз передавать адрес строки. Данные стали записывать или считывать блоками и адрес строки передавать только в начале блока. При этом можно сократить общее время обращения к динамическому ОЗУ и тем самым увеличить быстродействие компьютера.
Такой режим обращения к динамическому ОЗУ называется быстрым страничным режимом доступа FPM (Fast Page Mode). Длина считываемого блока данных равна четырем словам. Для того, чтобы оценить время такого режима доступа к памяти время измеряют в тактах системной шины процессора. В обычном режиме доступа к памяти время доступа одинаково для всех слов. Поэтому цикл обращения к динамической памяти можно записать как 5-5-5-5. При режиме быстрого страничного доступа цикл обращения к динамической памяти можно записать как 5-3-3-3, то есть время обращения к первой ячейке не изменяется по сравнению с предыдущим случаем, а считывание последующих ячеек сокращается до трех тактов. При этом среднее время доступа к памяти сокращается почти в полтора раза.
Временная диаграмма режима FPM приведена на рисунке 6.
Рисунок 6. Временная диаграмма обращения к динамическому ОЗУ в режиме FPM.
Еще одним способом увеличения быстродействия ОЗУ является применение микросхем EDO (Extended Data Out — ОЗУ с расширенным выходом данных). В EDO ОЗУ усилители-регенераторы не сбрасываются по окончанию строба CAS#, поэтому времени для считывания данных в таком режиме больше. Теперь для того чтобы сохранить время считывания на прежнем уровне можно увеличить тактовую частоту системной шины и тем самым увеличить быстродействие компьютера. Для EDO ОЗУ цикл обращения к динамической памяти можно записать как 5-2-2-2.
Следующим шагом в развитии схем динамического ОЗУ было применение в составе ОЗУ счетчика столбцов. То есть при переходе адреса ячейки к следующему столбцу запоминающей матрицы адрес столбца инкрементируется (увеличивается) автоматически. Такое ОЗУ получило название BEDO (ОЗУ с пакетным доступом). В этом типе ОЗУ удалось достигнуть режима обращения к динамической памяти 5-1-1-1.
В синхронном динамическом ОЗУ (SDRAM) дальнейшее увеличение быстродействия получается за счет применения конвейерной обработки сигнала. Как известно при использовании конвейера можно разделить операцию считывания или записи на отдельные подоперации, такие как выборка строк, выборка столбцов, считывание ячеек памяти, и производить эти операции одновременно. При этом пока на выход передается считанная ранее информация, производится дешифрация столбца для текущей ячейки памяти и производится дешифрация строки для следующей ячейки памяти. Этот процесс иллюстрируется рисунком 7.
Рисунок 7. Структурная схема конвейерной обработки данных.
Из приведенного рисунка видно что, несмотря на то, что при считывании одной ячейки памяти время доступа к ОЗУ увеличивается, при считывании нескольких соседних ячеек памяти общее быстродействие микросхем синхронного динамического ОЗУ увеличивается.
[] [] []
Классификация микропроцессоров
В современном мире трудно найти область техники, где не применялись бы микропроцессоры. Они применяются при вычислениях, они выполняют функции управления, они используются при обработке звука и изображения. В зависимости от области применения микропроцессора меняются требования к нему. Это накладывает отпечаток на внутреннюю структуру микропроцессора. По области применения определилось три направления развития микропроцессоров: сигнальные микропроцессоры
По внутренней структуре существует два основных принципа построения микропроцессоров:
По системе команд микропроцессоры отличаются огромным разнообразием, зависящим от фирмы-производителя. Тем не менее можно определить две крайние политики построения микропроцессоров:
Аккумуляторные микропроцессоры Микропроцессоры с регистрами общего назначенияВ микропроцессорах с регистрами общего назначения математические операции могут выполняться над любой ячейкой памяти. В зависимости от типа операции команда может быть одноадресной, двухадресной или трёхадресной.
Принципиальным отличием аккумуляторных процессоров является то, что математические операции могут производиться только над одной особой ячейкой памяти - аккумулятором. Для того, чтобы произвести операцию над произвольной ячейкой памяти её содержимое необходимо скопировать в аккумулятор, произвести требуемую операцию, а затем скопировать полученный результат в произвольную ячейку памяти.
В настоящее время в чистом виде не существует ни та ни другая система команд. Все выпускаемые в настоящее время процессоры обладают системой команд с признаками как аккумуляторных процессоров, так и микропроцессоров с регистрами общего назначения.
В Гарвардской архитектуре принципиально различаются два вида памяти:
Память программ Память данныхВ Гарвардской архитектуре принципиально невозможно производить операцию записи в память программ, что исключает возможность случайного разрушения управляющей программы в случае неправильных действий над данными. Кроме того, в ряде случаев для памяти программ и памяти данных выделяются отдельные шины обмена данными.
Эти особенности определили области применения этой архитектуры построения микропроцессоров. Гарвардская архитектура применяется в микроконтролерах, где требуется обеспечить высокую надёжность работы аппаратуры и в сигнальных процессорах, где эта архитектура кроме обеспечения высокой надёжности работы устройств позволяет обеспечить высокую скорость выполнения программы, за счёт одновременного считывания управляющих команд и обрабатываемых данных, а так же запись полученных результатов в память данных.
Отличие архитектуры Фон Неймана заключается в принципиальной возможности работы над управляющими программами точно так же как над данными. Это позволяет производит загрузку и выгрузку управляющих программ в произвольное место памяти процессора, которая в этой структуре не разделяется на память программ и память данных. Любой участок памяти может служить как памятью программ, так и памятью данных. Причём в разные моменты времени одна и та же область памяти может использоваться и как память программ и как память данных. Для того, чтобы программа могла работать в произвольной области памяти, её необходимо модернизировать перед загрузкой, то есть работать с нею как с обычными данными. Эта особенность архитектуры позволяет наиболее гибко управлять работой микропроцессорной системы, но создаёт принципиальную возможность искажения управляющей программы, что понижает надёжность работы аппаратуры. Эта архитектура используется в универсальных компьютерах и в некоторых видах микроконтроллеров.
[] [] []
Команды микропроцессора
Команды микропроцессора в отличие от микрокоманд разрабатываются независимо от аппаратуры микросхемы, поэтому их разрядность обычно совпадает с разрядностью микропроцессора. Команда микропроцессора состоит из инструкции и обозначается код операции КОП (или INS в англоязычной литературе). Команда микропроцессора может состоять только из кода операции, когда не требуется указывать адрес операнда (операнды это данные, над которыми команда производит какое либо действие), или может состоять из кода операции и адресов операндов или данных. Форматы команд очень сильно зависит от структуры процессора. Рассмотрим построение команд для восьмиразрядного процессора, построенного по структуре . Примеры построения команд для такого процессора приведены на рисунке 1.
Рисунок 1. Форматы различных команд микропроцессора.
Если для кода операции используется восьмибитное слово (байт), то при помощи этого слова можно закодировать 256 операций. В процессе разработки системы команд для операции может быть назначен любой код. Именно системой команд и определяется конкретное семейство процессоров. Однобайтовые команды позволяют работать с внутренними программно доступными регистрами процессора.
Для выполнения одной и той же операции над разными регистрами процессора назначаются разные коды. Запоминать эти коды очень утомительно для человека. При программировании в машинных кодах легко совершить ошибку и очень трудно найти её, особенно если коды различаются только на один бит. Для сокращения объёма записи вместо двоичного можно воспользоваться шестнадцатиричным кодом, однако это не увеличивает наглядности программы. Фрагмент исполняемого кода микропроцессора приведён на рисунке 2.
Рисунок 2. Фрагмент исполняемого кода микропроцессора.
Ну как? Очень понятно?
Чтобы уменьшить объём запоминаемой информации и увеличить наглядность исходного текста программы, каждой операции процессора придумывают мнемоническое обозначение. В качестве мнемонического обозначения операции обычно используют сокращения английских слов, обозначающих эту операцию.
Например, для операции копирования используется мнемоническое обозначение MOV; для операции суммирования используется мнемоническое обозначение ADD; для операции вычитания используется мнемоническое обозначение SUB; для операции умножения используется мнемоническое обозначение MUL и т.д.
Для полного обозначения команды используется мнемоническое обозначение операции и используемые ею операнды, которые перечисляются через запятую. При этом в большинстве процессоров операнд приёмник информации записывается первым, а операнд источник информации вторым. Например:
MOV R0, A ;Скопировать содержимое регистра A в регистр R0
ADD A, R5 ;Просуммировать содержимое регистров R5 и A, результат поместить в регистр A
Приведённые выше команды - это однобайтовые команды, так как в них используются только внутренние регистры процессора. Если в команде используется константа в качестве операнда или указывается адрес операнда в системной памяти, то команда будет занимать в системной памяти два или три байта. Например:
MOV A, 1025 ;Скопировать содержимое 1025 ячейки памяти в регистр A
ADD A, #110 ;Просуммировать содержимое регистра A с числом 110
Несмотря на то, что общий объём исходного текста программы увеличивается, скорость написания и особенно отладки программ в таком виде возрастает. Теперь вместо одного текста программы в памяти компьютера или на бумаге придется хранить два текста: один для человека, который в дальнейшем будем называть исходным текстом программы; другой для микропроцессора, который в дальнейшем будем называть загрузочным модулем.
Преобразование программы, записанной в мнемоническом виде, в машинные коды является рутинной работой, которую можно поручить компьютерной программе. Язык программирования в котором для обозначения машинных команд используются мнемонические обозначения называется ассемблером. Точно так же называют и программу или пакет программ, которая осуществляет трансляцию (преобразование) исходного текста программы (исходный модуль) в машинные коды (загрузочный модуль).
[ ]
Микропрограммирование
Все действия микропроцессора и сигналы на его выводах определяются последовательностью микрокоманд, подаваемых на управляющие входы . Эта последовательность микрокоманд называется микропрограммой.
При изучении принципов работы и приводились временные диаграммы, которые необходимо сформировать, для того, чтобы записать или прочитать необходимую информацию. Выберем одну из этих диаграмм:
Рисунок 1. Временные диграммы считывания
Любую временную диаграмму формирует микропроцессор. Устройство микросхемы, на примере которой мы будем формировать необходимые для работы сигналы рассматривалось при обсуждении . По принципиальной схеме блока обработки сигнала можно определить формат микрокоманды, управляющей этим блоком.
Работа любого цифрового устройства начинается с заранее заданных начальных условий. Эти начальные условия формируются специальным сигналом RESET (сброс), который формируется после подачи питания на схему. Договоримся, что сигнал сброса микропроцессора будет записывать в регистр программного счетчика PC нулевое значение. (Это условие справедливо не для всех процессоров. Например, IBM совместимые процессоры при сбросе микросхемы записывают в программный счётчик значение F0000h.)
Выполнение любой начинается с её считывания из системной памяти (ОЗУ или ПЗУ). Необходимые для этого микрокоманды подаются на входы управления БОС из блока микропрограммного управления БМУ, как только снимается сигнал сброса со счётчика микрокоманд БМУ. При считывании однобайтной команды достаточно считать из системной памяти только код операции и выполнить эту операцию. Временная диаграмма этого процесса приведена на рисунке 2. Последовательность операций, которые необходимо выполнить микропрограмме, показана стрелочками. Для считывания следующей команды микропрограмма запускается заново.
Рисунок 2. Временные диаграммы сигналов считывания команд из системной памяти.
Для того, чтобы считать код операции из системной памяти, необходимо выставить на шине адреса адрес этой команды.
Этот адрес хранится в счетчике команд PC. Скопируем его в регистр адреса RA, выходы которого подключены к шине адреса:
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
1) | PCH -> RAH | 1111 1111 | 1111 | 1010 | 0011 0 0 | 1100 |
2) | PCL -> RAL | 1111 1111 | 1111 | 1011 | 0011 0 0 | 1101 |
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
3) | const -> CR | 1111 1101 | 1111 | 1111 | 0011 0 0 | 1110 |
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
4) | data -> RI | 1111 1111 | 1100 | 1111 | 1100 0 0 | 1001 |
5) | const -> CR | 1111 1111 | 1111 | 1111 | 0011 0 0 | 1110 |
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
6) | PCL+1 -> PCL | 1111 1111 | 1011 | 1111 | 1100 1 0 | 1011 |
7) | PCH+C -> PCH | 1111 1111 | 1010 | 1111 | 1100 1 0 | 1010 |
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
9) | R0 -> ACC | 1111 1111 | 0000 | 1111 | 1100 0 0 | 1000 |
Рассмотрим ещё один пример. Пусть из системной памяти считывается команда безусловного перехода JMP 1234. Первые восемь микрокоманд совпадают для всех команд микропроцессора. Различие наступает начиная с девятой команды, которая зависит от конкретной инструкции. При выполнении команды безусловного перехода необходимо считать адрес новой команды, который записан в байтах, следующих за кодом операции. Этот процесс аналогичен считыванию кода операции:
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
9) | PCH -> RAH | 1111 1111 | 1111 | 1010 | 0011 0 0 | 1100 |
10) | PCL -> RAL | 1111 1111 | 1111 | 1011 | 0011 0 0 | 1101 |
11) | const -> CR | 1111 1110 | 1111 | 1111 | 0011 0 0 | 1110 |
12) | data -> RI | 1111 1111 | 1100 | 1111 | 1100 0 0 | 1001 |
13) | const -> CR | 1111 1111 | 1111 | 1111 | 0011 0 0 | 1110 |
14) | PCL+1 -> PCL | 1111 1111 | 1011 | 1111 | 1100 1 0 | 1011 |
15) | PCH+C -> PCH | 1111 1111 | 1010 | 1111 | 1100 1 0 | 1010 |
Поля микрокоманды БОС | ||||||
N | Описание | константа | источник A | источник B | команда | приёмник |
16) | PCH -> RAH | 1111 1111 | 1111 | 1010 | 0011 0 0 | 1100 |
17) | PCL -> RAL | 1111 1111 | 1111 | 1011 | 0011 0 0 | 1101 |
18) | const -> CR | 1111 1110 | 1111 | 1111 | 0011 0 0 | 1110 |
19) | data -> PCH | 1111 1111 | 1100 | 1111 | 1100 0 0 | 1110 |
20) | const -> CR | 1111 1111 | 1111 | 1111 | 0011 0 0 | 1110 |
21) | RI -> PCL | 1111 1111 | 1001 | 1111 | 1100 1 0 | 1001 |
Рисунок 3. Временная диаграмма выполнения команды JMP 1234.
[ ]
Подключение внешних устройств к микропроцессору
В устройствах связи микропроцессорные системы чаще всего используются для управления устройствами, блоками или системами связи. При этом в качестве микропроцессорного устройства может выступать универсальный компьютер или группа компьютеров объединенных локальной или глобальной сетью связи (для больших и дорогих систем связи, таких как автоматические телефонные станции или коммутационные центры сотовых систем связи) или специализированное микропроцессорное устройство в качестве которого чаще всего выступает однокристальный микроконтроллер для дешевой и портативной аппаратуры.
Внешними устройствами называются любые устройства, которыми управляет или которым передает информацию микропроцессор или устройства от которых он получает информацию. В качестве внешних устройств может выступать принтер или дисплей клавиатура или модем, но для устройств связи в качестве внешних устройств чаще выступают микросхемы приемников, передатчиков (в том числе построенные на базе сигнальных процессоров), синтезаторов частоты или электрически стираемые постоянные запоминающие устройства.
Согласование микросхем между собой не представляет трудностей, так как практически все современные микросхемы по входу и выходу согласованы с TTL уровнями. Если же это не так, то для согласования нестандартных уровней с TTL уровнями выпускаются специальные микросхемы. Несколько иначе обстоит дело с индикаторами и различными исполнительными устройствами.
В качестве простейшего индикатора рассмотрим светодиодный индикатор. Схема подключения такого индикатора показана на рисунке 1. Транзистор служит для увеличения тока параллельного порта, при помощи которого микропроцессор зажигает и гасит светодиодный индикатор. Кроме того, транзистор позволяет согласовать уровни напряжения, необходимые для работы цифровых микросхем, к которым относятся и микропроцессорные устройства и уровни напряжения, необходимые для работы светодиодного индикатора. Гальванической развязки транзисторный ключ не обеспечивает.
Рисунок 1.
Подключение одиночного светодиодного индикатора.
Простой светодиодный индикатор позволяет отображать двоичную информацию, такую как включено или выключено устройство, есть или нет сигнала и т.д. Для отображения цифровой информации используются семисегментные индикаторы.Подключение семисегментного светодиодного индикатора не отличается от схемы, приведенной на рисунке 1. Практически так же выглядят схемы индикаторов на газоразрядных лампах и лампах накаливания (для лампы накаливания не нужен токоограничивающий резистор).
Несколько сложнее выглядит схема подключения внешних исполнительных устройств с индуктивной нагрузкой (например реле или электромагнит):
Рисунок 2. Подключение внешнего устройства с индуктивной нагрузкой.
Диод VD1 в этой схеме служит для ограничения напряжения импульсов самоиндукции, которые могут вывести из строя транзистор VT1.
При считывании информации из внешнего устройства возникают аналогичные проблемы. Источники дискретной информации могут иметь различную физическую природу. Они могут находиться на значительном расстоянии от контроллера, иметь различное напряжение питания, но их данные должны быть надежно введены в микропроцессор.
Для решения указанных проблем и реализации гальванической развязки датчиков и микропроцессорного устройства, все датчики с точки зрения схемы представляют собой контакты, работающие на замыкание. Поэтому схема подключения датчика и кнопки не различаются. Со стороны микропроцессорного устройства необходимо преобразовать замыкание/размыкание контактов в логические уровни, необходимые для правильной работы микропроцессорного устройства. Такая схема приведена на рисунке 3.
Рисунок 3. Подключение источника дискретной информации с гальванической развязкой.
Иногда требуется вводить информацию с большого количества кнопок. В этом случае для уменьшения количества линий ввода-вывода используется клавиатура. Для подключения клавиатуры используется два порта: порт ввода и порт вывода. Схема подключения клавиатуры приведена на рисунке 4.
Рисунок 4. Подключение клавиатуры к микропроцессорному устройству.
Собственно говоря, схема подключения не отличается от предыдущей схемы. Принципиальное отличие состоит в том, что корпус на кнопки подается не непосредственно, а через порт вывода. В каждый момент времени к корпусу подключен только один столбец кнопок. Временные диаграммы напряжения на выводах порта вывода приведены на рисунке 5.
Рисунок 5. Временные диаграммы напряжения на выводах порта вывода.
[ ]
Постоянные запоминающие устройства
Очень часто в различных применениях требуется хранение информации, которая не изменяется в процессе эксплуатации устройства. Это такая информация как программы в микроконтроллерах, начальные загрузчики и BIOS в компьютерах, таблицы коэффициентов цифровых фильтров в сигнальных процессорах. Практически всегда эта информация не требуется одновременно, поэтому простейшие устройства для запоминания постоянной информации можно построить на мультиплексорах. Схема такого постоянного запоминающего устройства приведена на рисунке 1.
Рисунок 1. Схема постоянного запоминающего устройства, построенная на мультиплексоре.
В этой схеме построено постоянное запоминающее устройство на восемь одноразрядных ячеек. Запоминание конкретного бита в одноразрядную ячейку производится запайкой провода к источнику питания (запись единицы) или запайкой провода к корпусу (запись нуля). На принципиальных схемах такое устройство обозначается как показано на рисунке 2.
Рисунок 2. Обозначение постоянного запоминающего устройства на принципиальных схемах.
Для того, чтобы увеличить разрядность ячейки памяти ПЗУ эти микросхемы можно соединять параллельно (выходы и записанная информация естественно остаются независимыми). Схема параллельного соединения одноразрядных ПЗУ приведена на рисунке 3.
Рисунок 3. Схема многоразрядного ПЗУ.
В реальных ПЗУ запись информации производится при помощи последней операции производства микросхемы - металлизации. Металлизация производится при помощи маски, поэтому такие ПЗУ получили название масочных ПЗУ. Еще одно отличие реальных микросхем от упрощенной модели, приведенной выше - это использование кроме мультиплексора еще и демультиплексора. Такое решение позволяет превратить одномерную запоминающую структуру в многомерную и, тем самым, существенно сократить объем схемы дешифратора, необходимого для работы схемы ПЗУ. Эта ситуация иллюстрируется следующим рисунком:
Рисунок 4. Схема масочного постоянного запоминающего устройства.
Масочные ПЗУ изображаются на принципиальных схемах как показано на рисунке 5.
Адреса ячеек памяти в этой микросхеме подаются на выводы A0 ... A9. Микросхема выбирается сигналом CS. При помощи этого сигнала можно наращивать объем ПЗУ (пример использования сигнала CS приведён при обсуждении ). Чтение микросхемы производится сигналом RD.
Рисунок 5. Обозначение масочного постоянного запоминающего устройства на принципиальных схемах.
Программирование масочного ПЗУ производится на заводе изготовителе, что очень неудобно для мелких и средних серий производства, не говоря уже о стадии разработки устройства. Естественно, что для крупносерийного производства масочные ПЗУ являются самым дешевым видом ПЗУ, и поэтому широко применяются в настоящее время. Для мелких и средних серий производства радиоаппаратуры были разработаны микросхемы, которые можно программировать в специальных устройствах - программаторах. В этих микросхемах постоянное соединение проводников в запоминающей матрице заменяется плавкими перемычками, изготовленными из поликристаллического кремния. При производстве микросхемы изготавливаются все перемычки, что эквивалентно записи во все ячейки памяти логических единиц. В процессе программирования на выводы питания и выходы микросхемы подаётся повышенное питание. При этом, если на выход микросхемы подаётся напряжение питания (логическая единица), то через перемычку ток протекать не будет и перемычка останется неповрежденной. Если же на выход микросхемы подать низкий уровень напряжения (присоединить к корпусу), то через перемычку будет протекать ток, который испарит эту перемычку и при последующем считывании информации из этой ячейки будет считываться логический ноль.
Такие микросхемы называются программируемыми ПЗУ (ППЗУ) и изображаются на принципиальных схемах как показано на рисунке 6. В качестве примера можно назвать микросхемы 155РЕ3, 556РТ4, 556РТ8 и другие.
Рисунок 6. Обозначение программируемого постоянного запоминающего устройства на принципиальных схемах.
Программируемые ПЗУ оказались очень удобны при мелкосерийном и среднесерийном производстве.
Однако при разработке радиоэлектронных устройств часто приходится менять записываемую в ПЗУ программу. ППЗУ при этом невозможно использовать повторно, поэтому раз записанное ПЗУ при ошибочной или промежуточной программе приходится выкидывать, что естественно повышает стоимость разработки аппаратуры. Для устранения этого недостатка был разработан еще один вид ПЗУ, который мог бы стираться и программироваться заново.
ПЗУ с ультрафиолетовым стиранием строится на основе запоминающей матрицы построенной на ячейках памяти, внутреннее устройство которой приведено на следующем рисунке:
Рисунок 7. Запоминающая ячейка ПЗУ с ультрафиолетовым и электрическим стиранием.
Ячейка представляет собой МОП транзистор, в котором затвор выполняется из поликристаллического кремния. Затем в процессе изготовления микросхемы этот затвор окисляется и в результате он будет окружен оксидом кремния - диэлектриком с прекрасными изолирующими свойствами. В описанной ячейке при полностью стертом ПЗУ заряда в плавающем затворе нет, и поэтому транзистор ток не проводит. При программировании микросхемы на второй затвор, находящийся над плавающим затвором, подаётся высокое напряжение и в плавающий затвор за счет тунельного эффекта индуцируются заряды. После снятия программирующего напряжения на плавающем затворе индуцированный заряд остаётся и, следовательно, транзистор остаётся в проводящем состоянии. Заряд на плавающем затворе может храниться десятки лет.
Структурная схема постоянного запоминающего устройства не отличается от описанного ранее масочного ПЗУ. Единственно вместо перемычки используется описанная выше ячейка. В репрограммируемых ПЗУ стирание ранее записанной информации осуществляется ультрафиолетовым излучением. Для того, чтобы этот свет мог беспрепятственно проходить к полупроводниковому кристаллу, в корпус микросхемы встраивается окошко из кварцевого стекла.
При облучении микросхемы, изолирующие свойства оксида кремния теряются и накопленный заряд из плавающего затвора стекает в объем полупроводника и транзистор запоминающей ячейки переходит в закрытое состояние.
Время стирания микросхемы колеблется в пределах 10 - 30 минут.
Количество циклов записи - стирания микросхем находится в диапазоне от 10 до 100 раз, после чего микросхема выходит из строя. Это связано с разрушающим воздействием ультрафиолетового излучения. В качестве примера таких микросхем можно назвать микросхемы 573 серии российского производства, микросхемы серий 27сXXX зарубежного производства. В этих микросхемах чаще всего хранятся программы BIOS универсальных компьютеров. Репрограммируемые ПЗУ изображаются на принципиальных схемах как показано на рисунке 8.
Рисунок 8. Обозначение репрограммируемого постоянного запоминающего устройства на принципиальных схемах.
Так так корпуса с кварцевым окошком очень дороги, а также малое количество циклов записи - стирания привели к поиску способов стирания информации из ППЗУ электрическим способом. На этом пути встретилось много трудностей, которые к настоящему времени практически решены. Сейчас достаточно широко распространены микросхемы с электрическим стиранием информации. В качестве запоминающей ячейки в них используются такие же ячейки как и в РПЗУ, но они стираются электрическим потенциалом, поэтому количество циклов записи - стирания для этих микросхем достигает 1000000 раз. Время стирания ячейки памяти в таких микросхемах уменьшается до 10 мс. Схема управления для таких микросхем получилась сложная, поэтому наметилось два направления развития этих микросхем:
ЕСППЗУ FLASH -ПЗУ Электрически стираемые ППЗУ дороже и меньше по объему, но зато позволяют перезаписывать каждую ячейку памяти отдельно. В результате эти микросхемы обладают максимальным количеством циклов записи - стирания. Область применения электрически стираемых ПЗУ - хранение данных, которые не должны стираться при выключении питания. К таким микросхемам относятся отечественные микросхемы 573РР3, 558РР и зарубежные микросхемы серии 28cXX. Электрически стираемые ПЗУ обозначаются на схемах как показано на рисунке 9.
Рисунок 9. Обозначение электрически стираемого постоянного запоминающего устройства на принципиальных схемах.
В последнее время наметилась тенденция уменьшения габаритов ЭСППЗУ за счет уменьшения количества внешних ножек микросхем. Для этого адрес и данные передаются в микросхему и из микросхемы через последовательный порт. При этом используются два вида последовательных портов - SPI порт и I2C порт (микросхемы 93сXX и 24cXX серий соответственно). Зарубежной серии 24cXX соответствует отечественная серия микросхем 558РРX.
FLASH - ПЗУ отличаются от ЭСППЗУ тем, что стирание производится не каждой ячейки отдельно, а всей микросхемы в целом или блока запоминающей матрицы этой микросхемы, как это делалось в РПЗУ.
Рисунок 10. Обозначение FLASH памяти на принципиальных схемах.
При обращении к постоянному запоминающему устройству сначала необходимо выставить адрес ячейки памяти на шине адреса, а затем произвести операцию чтения из микросхемы. Эта временная диаграмма приведена на рисунке 11.
Рисунок 11. Временная диаграмма чтения информации из ПЗУ.
На рисунке 11 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке RD - это сигнал чтения, A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние), D - выходная информация, считанная из выбранной ячейки ПЗУ.
[ ]
Причины широкого распространения микропроцессоров
Цифровые микросхемы к настоящему времени достигли впечатляющего быстродействия при приемлемом токе потребления. Наиболее быстрые из цифровых микросхем обладают скоростью переключения порядка 3..5 нс. (серия микросхем 74ALS). В то же время приходится платить за быстродействие микросхем повышеным током потребления. Исключением являются микросхемы, построенные на основе КМОП технологии (например микросхемы серий 1564, 74HC, 74AHC). В этих микросхемах потребляемый ток прямо пропорционален скорости переключения логических вентилей в микросхеме. Т.е. микросхема автоматически увеличивает ток потребления, если от нее требуется большее быстродействие, поэтому в настоящее время подавляющее большинство микросхем выпускается именно по этой технологии.
Часто цифровые устройства выполняют достаточно сложные задачи. Возникает вопрос - раз микросхемы достигли такого высокого быстродействия, то нельзя ли использовать одну и ту же микросхему многократно? Тогда можно будет обменивать быстродействие микросхем на сложность решаемой задачи. Именно этот обмен и позволяют осуществлять микропроцессоры. В этих микросхемах многократно используется одно и то же устройство - (арифметическо-логическое устройство). Поэтому возможен обмен предельного быстродействия микроконтроллера на сложность реализуемого устройства. Именно по этой причине стараются максимально увеличить быстродействие микропроцессоров - это позволяет реализовывать все более сложные устройства в одном и том же объеме.
Ещё одной причиной широкого распространения микропроцессоров стало то, что микропроцессор - это универсальная микросхема, которая может выполнять практически любые функции. Универсальность обеспечивает широкий спрос на эти микросхемы, а значит массовость производства. Стоимость же микросхем обратно пропорциональна массовости их производства, то есть микропроцессоры становятся дешёвыми микросхемами и тем самым ещё больше увеличивают спрос.
В наибольшей степени все вышеперечисленные свойства проявляются в однокристальных микроЭВМ или как их чаще называют по области применения: микроконтроллерах. В микроконтроллерах на одном кристалле объединяются все составные части компьютера: микропроцессор (часто называют ядро микроконтроллера), ОЗУ, ПЗУ, таймеры и порты ввода-вывода.
Выводы:
КМОП технология позволяет обменивать скорость работы на потребляемый ток (чем с большей скоростью переключаются логические элементы микросхемы, тем больший ток потребляет микросхема);
Микроконтроллеры позволяют реализовывать схему управления практически любой сложности на одной универсальной микросхеме;
Микроконтроллеры позволяют обменивать скорость своей работы на сложность проектируемого устройства.
Микроконтроллеры позволяют реализовывать аппаратуру с минимальной стоимостью, габаритами и током потребления.
Срок разработки аппаратуры на микроконтроллерах минимален.
Модернизация аппаратуры заключается в смене управляющей программы.
Принципы построения параллельного порта
Параллельные порты предназначены для обмена информацией микропроцессора с внешними устройствами, при этом в качестве внешнего устройства может изпользоваться . Параллельные порты позволяют согласовывать низкую скорость работы внешнего устройства и высокую скорость работы системной шины микропроцессора. С точки зрения внешнего устройства порт представляет собой обычный источник или приемник информации со стандартными цифровыми логическими уровнями (обычно ТТЛ), а с точки зрения микропроцессора - это ячейка памяти, в которую можно записывать данные или в которой сама собой появляется информация.
В качестве внешнего устройства может служить любой объект управления или источник информации (различные кнопки, датчики, микросхемы приемников, синтезаторов частот, дополнительной памяти, исполнительные механизмы, двигатели, реле и т.д.).
В зависимости от направления передачи данных параллельные порты называются портами ввода, вывода или портами ввода вывода.
Структурная схема порта ввода приведена на рис 1.
Рис. 1. Структурная схема порта ввода.
|
В качестве порта ввода может быть использована схема с открытым коллектором или с третьим (Z) состоянием. В настоящее время обычно используются схемы с . Параллельное соединение таких схем называется шинным формирователем. Из порта ввода возможно только чтение информации.
Выход шинного формирователя подключается к внутренней шине. Значение сигнала с внешнего вывода порта считывается по сигналу "RD". Для отображения этого шинного формирователя только в одну ячейку памяти адресного пространства микропроцессорного устройства в составе порта ввода-вывода всегда присутствует дешифратор адреса. |
Так как с точки зрения программиста эта ячейка памяти ничем не отличается от регистра данных порта вывода, то по аналогии она называется регистром данных порта ввода.
Структурная схема порта вывода приведена на рис 2.
Рис. 2. Структурная схема порта вывода. |
В качестве порта вывода может быть использован параллельный регистр. В порт вывода возможна только запись.
Данные с внутренней шины микроконтроллера записываются в регистр по сигналу "WR". Выходы "Q" регистра могут быть использованы как источники логических уровней для управления внешними устройствами. Для отображения этого регистра только в одну ячейку памяти адресного пространства микропроцессорного устройства в составе порта ввода-вывода всегда присутствует дешифратор адреса. Этот регистр называется регистром данных порта вывода. |
Так как из порта ввода возможно только чтение, а в порт вывода возможна только запись, то для них обычно отводится один и тот же адрес в адресном пространстве памяти микропроцессора.
Порты выпускаются в качестве универсальных микросхем, но на заводе, где производятся эти микросхемы неизвестно сколько на самом деле потребуется линий ввода информации, и сколько потребуется линий вывода информации. Количество же ножек у микросхемы ограничено. Поэтому в одной универсальной микросхеме размещаются и порт ввода и порт вывода информации, а для подключения этих портов к внешним ножкам микросхемы используется коммутатор. Для управления этим коммутатором используется еще один (внутренний) параллельный порт вывода, регистр данных которого называется регистром управления параллельного порта ввода-вывода, а сам порт называется портом ввода-вывода. Адрес для регистра управления обычно назначается рядом с адресом регистра данных порта ввода-вывода.
Рис. 3. Структурная схема параллельного порта ввода-вывода.
В некоторых микропроцессорах для портов ввода вывода выделяется отдельное адресное пространство. В этом случае для записи в порт и для чтения из порта используются отдельные сигналы чтения и записи. Чаще всего они называются IOWR# и IORD#.
Параллельные порты, предназначенные для обмена данными между компьютерами, или компьютером и принтером, устроены несколько иначе. Основным отличием обмена данных между компьютерами или контроллерами от обмена данными между компьютером и простым внешним устройством является большой объём передаваемых данных. В этом случае недостаточно выдачи на выход порта одного или даже нескольких байт информации, поэтому приходится передавать данные последовательно байт за байтом через один и тот же параллельный порт. Байты необходимо каким либо образом отличать друг от друга, поэтому вводится специальный сигнал синхронизации CLK, который позволяет отличать один байт от другого. Для формирования такого сигнала можно воспользоваться вторым параллельным портом, и получить его программным способом, но обычно этот сигнал формируется аппаратно из сигнала WR# при записи очередного байта в параллельный порт вывода.Временная диаграмма обмена данными через параллельный порт приведена на рисунке 4.
Рис. 4. Временная диаграмма работы параллельного порта.
В лекции приведены только основы работы параллельного порта. Кому интересно познакомиться с особенностями работы параллельных портов может обратиться к специализированной .
Далеко не полную информацию по LPT порту универсального компьютера можно посмотреть здесь.
[ ]
Принципы построения последовательного порта
Последовательные порты предназначены для обмена информацией микропроцессоров между собой, а также для связи с устройствами в которых критично количество соединительных проводов.В настоящее время широко используются два вида последовательных портов:
; .Принципы построения таймеров
Таймеры предназначены для формирования временных интервалов, позволяя микропроцессорной системе работать в режиме реального времени.
Таймеры представляют собой обычные , которые подсчитывают импульсы от высокостабильного . К системной шине микропроцессора таймеры подключаются при помощи .
, входящий в состав таймера, определяет минимальный интервал времени, который может определять таймер. Интервалы времени, задаваемые таймером, могут устанавливаться только из дискретного набора допустимых времён. Дискретность установки этих интервалов времени тоже определяется частотой задающего генератора. Разрядность цифрового счётчика, входящего в состав таймера, определяет максимальный интервал времени, который может определять таймер.
Обычно используются 16-ти разрядные таймеры, поэтому, для подключения такого таймера к 8-ми разрядному процессору требуется два параллельных порта. Кроме того, таймером нужно управлять. Таймер нужно включать и выключать, часто требуется определять не возникало ли переполнение таймера (факт переполнения легко запомнить в дополнительном триггере, подключенном к выходу переноса счетчика таймера). Этот триггер называется флагом переполнения таймера. Триггер (флаг) включения и выключения таймера и флаг переполнения таймера подключают к системной шине микропроцессора через дополнительный порт ввода вывода.
Структурная схема таймера, построенного по описанным выше принципам, приведена на рисунке 1.
Рисунок 1. Структурная схема таймера.
В зависимости от типа использованного таймеры бывают суммирующие или вычитающие. Если в таймере используется суммирующий счётчик, то таймер называется суммирующим. Если в таймере используется вычитающий счётчик, то таймер называется вычитающим.
Использование вычитающего счётчика позволяет проще задавать интервалы времени. В этом случае записываемый в таймер код будет соответствовать интервалу времени:
В случае использования суммирующего таймера код, записываемый в таймер для задания интервала времени, определяется из другой формулы:
В этой формуле код, который заносится в таймер, представляет собой дополнение кода интервала времени до максимального кода, который можно записать в таймер. Максимальный код таймера определяется по разрядности таймера. В рассмотренном примере разрядность таймера равна 16. Это означает, что максимальный код равен 65535.
Достаточно часто суммирующие таймеры используются в режиме свободнобегущего таймера. Схема такого таймера приведена на рисунке 2.
Рисунок 2. Структурная схема свободнобегущего таймера с модулем сравнения.
Свободнобегущие таймеры используются как системные часы, задающие время внутри микропроцессорной системы. Для задания промежутков времени микропроцессор считывает значение текущего системного времени и суммирует с ним код задаваемого промежутка времени. Полученный результат записывается в регистр сравнения таймера. При совпадении значений таймера и регистра сравнения устанавливается флаг совпадения. Значение этого флага можно определить программным опросом или воспользоваться механизмом прерывания работы процессора.
Часто с одним свободно бегущим таймером работает несколько модулей сравнения. В этом случае они образуют набор модулей сравнения (PCA). Практически все современные микроконтроллеры и сигнальные процессоры оснащены таймерами с такими наборами модулей.
Кроме модулей сравнения с свободнобегущим таймером работают модули захвата, которые позволяют аппаратно запоминать время какого-либо внешнего события без участия центрального процессора. Структурная схема свободнобегущего таймера с модулем захвата приведена на рисунке 3.
Рисунок 3. Структурная схема свободнобегущего таймера с модулем захвата.
[ ]
Принципы работы микропроцессора
В настоящее время наметилось два направления развития микропроцессоров: RISC процессоры (процессоры с сокращённым набором команд) CISC процессоры (процессоры с полным набором команд)
В процессорах с полным набором команд используется уровень микропрограммирования для того, чтобы декодировать и выполнить команду микропроцессора. В этих процессорах формат команды не зависит от аппаратуры процессора. На одной и той же аппаратуре при смене микропрограммы могут быть реализованы различные микропроцессоры. С другой стороны смена аппаратуры никак не влияет на программное обеспечение микропроцессора. С точки зрения пользователя у микропроцессора только увеличивается производительность, снижается потребление энергии, уменьшаются габариты устройств. Неявным недостатком таких процессоров является то, что производители микросхем стараются увеличить количество команд, которые может выполнять микропроцессор, тем самым увеличивая сложность микропрограммы и замедляя выполнение каждой команды в целом.
В процессорах с сокращённым набором команд декодирование и исполнение команды производится аппаратурно, поэтому количество команд ограниченно минимальным набором. В этих процессорах команда и микрокоманда совпадают. Преимуществом этого типа процессоров является то, что команда может быть в принципе выполнена за один такт (не требуется выполнение микропрограммы), однако для выполнения тех же действий, которые выполняет команда CISC процессора, требуется выполнение целой программы.
В большинстве случаев быстродействие RISC процессоров выше чем CISC процессоров, однако при выборе процессора нужно учитывать все параметры в целом, т.к. тактовая частота может оказаться значительно ниже по сравнению с CISC процессором (особенно если в нём применяются специальные меры по повышению производительности), разрядность команды может оказаться выше чем у CISC процессора (что чаще всего и бывает). В результате общий объём исполняемой программы для RISC процессора превысит объём подобной программы для CISC процессора.
В качестве примера рассмотрим устройство процессора с полным набором команд. Здесь будет рассматриваться упрощённая модель процессора для облегчения понимания работы. CISC микропроцессор состоит из двух частей:
.
Шинные формирователи
Мультиплексоры предназначены для объединения нескольких выходов в тех случаях, когда заранее известно сколько выходов нужно объединять. Часто это неизвестно. Более того, часто количество объединяемых микросхем изменяется в процессе эксплуатации устройств. Наиболее яркий пример - это компьютеры, в которых в процессе эксплуатации изменяется объем оперативной памяти, количество портов ввода-вывода, количество дисководов. В таких случаях невозможно для объединения нескольких выходов воспользоваться логическим элементом "ИЛИ".
Для объединения нескольких выходов на один вход в случае, когда заранее не известно сколько микросхем нужно объединять, используется два способа: монтажное ИЛИ; шинные формирователи.
Исторически первой схемой объединения выходов были схемы с открытым коллектором (монтажное "ИЛИ"). Схема монтажного "ИЛИ" приведена на рисунке 1.
Рисунок 1. Схема монтажного "ИЛИ".
Такое объединение микросхем называется шиной и позволяет объединять до 10 микросхем на один провод. Естественно для того, чтобы микросхемы не мешали друг другу только одна из микросхем должна выдавать информацию на общий провод. Остальные микросхемы в этот момент времени должны быть отключены от шины (то есть выходной транзистор должен быть закрыт). Это обеспечивается внешней микросхемой управления не показанной на данном рисунке.
На принципиальных схемах такие элементы обозначаются как показано на рисунке 2.
Рисунок 2. Обозначение микросхемы с открытым коллектором на выходе
Недостатком приведенной схемы объединения нескольких микросхем на один провод является низкая скорость передачи информации, обусловленная затягиванием переднего фронта. Это явление связано с различным сопротивлением заряда и разряда паразитной ёмкости шины. Заряд паразитной ёмкости происходит через сопротивления R1 и R2, которые много больше сопротивления открытого транзистора. Величину этого сопротивления невозможно уменьшить меньше некоторого предела, определяемого напряжением низкого уровня, который определяется в свою очередь допустимым током потребления всей схемы в целом.
Временная диаграмма напряжения на шине с общим коллектором приведена на рисунке 3.
Рисунок 3. Временные диаграммы напряжения на входе и выходе микросхемы с открытым коллектором.
Естественным решением этой проблемы было бы включение транзистора в верхнее плечо схемы, но при этом возникает проблема сквозных токов, из-за которой невозможно соединять выходы цифровых микросхем непосредственно. Причина возникновения сквозных токов поясняется на рисунке 4.
Рисунок 4. Путь протекания сквозного тока при непосредственном соединении выходов цифровых микросхем.
Эта проблема исчезает, если появляется возможность закрывать транзисторы как в верхнем, так и в нижнем плече выходного каскада. Если в микросхеме закрыты оба транзистора, то такое состояние выхода микросхемы называется третьим состоянием или z-состоянием выхода микросхемы. Такая возможность появляется в специализированных микросхемах с третьим состоянием на выходе микросхемы. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе микросхемы приведена на рисунке 5.
Рисунок 5. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе
На принципиальных схемах такие элементы обозначаются как показано на рисунке 6.
Рисунок 6. Обозначение микросхемы с тремя состояниями на выходе
В настоящее время схемы с тремя состояниями широко используются для построения шин. Шина представляет собой проводник к которому могут подключаться несколько микросхем. При этом часть из них используют этот проводник для передачи по нему цифрового сигнала, а часть используют его для получения информации. То есть этот проводник может быть использован в качестве элемента коммутации.
При этом особенно важно, что в отличие от коммутаторов ( и ) количество входов и выходов в шине заранее не определено. Поэтому к шине можно подключать (и отключать) устройства без перенастройки принципиальной схемы.
Часто в микросхеме, содержащей элементы с тремя состояниями выходного каскада объединяют управляющие сигналы всех элементов в один провод.Такие микросхемы называют шинными формирователями и изображают на схемах как показано на рисунке 7.
Рисунок 7. Обозначение шинного формирователя.
[ ]
Синхронные последовательные порты
При рассмотрении работы в режиме обмена данными с другим компьютером или принтером уже рассматривался режим последовательной передачи байтов. В последовательном порту режим последовательной передачи применяется не только к байтам, но и к отдельным битам внутри байта. В этом случае для передачи данных достаточно только одного провода. Передаваемая и принимаемая информация обычно представляется в виде однобайтовых или многобайтовых слов. Вес каждого бита в слове различен, поэтому кроме битовой синхронизации, аналогичной байтовой синхронизации для параллельного порта, требуется кадровая синхронизация. Кадровая синхронизация позволяет однозначно определять номер каждого бита в передаваемом слове. Временная диаграмма передачи кадра по синхронному последовательному порту приведена на рисунке 1.
Рисунок 1. Временная диаграмма передачи одного кадра двоичной информации по последовательному порту.
Временная диаграмма, приведённая на рисунке 1, применяется в синхронных последовательных портах, которые используются чаще всего в сигнальных процессорах для обмена информацией с кодеками речи, аналого-цифровыми и цифро-аналоговыми преобразователями. На приведённой временной диаграмме показаны два сигнала синхронизации: сигнал тактовой синхронизации CLK и сигнал кадровой синхронизации FS. Сигнал кадровой синхронизации формируется аппаратно из сигнала WR# при записи очередного байта в параллельный порт вывода. Полярность сигналов синхронизации зависит от конкретного типа применяемых микросхем, поэтому в большинстве сигнальных процессоров возможна настройка полярности сигналов синхронизации.
Упрощённая схема синхронного последовательного порта приведена на рисунке 2. На этой схеме видно, что в состав последовательного порта входит параллельный порт, который позволяет подключаться к системной шине микропроцессора. Для преобразования параллельного кода, который поступает из системной шины в последовательный, используется . При обращении центрального процессора к последовательному порту вырабатывается сигнал записи в последовательный порт, который подаётся на вход параллельной записи V универсального регистра.
Этот же сигнал используется в качестве сигнала кадровой синхронизации FS. Сигнал тактовой синхронизации CLK, вырабатываемый отдельным генератором, подаётся на вход последовательного сдвига C универсального регистра порта.
Рисунок 2. Упрощённая схема синхронного последовательного порта
Количество передаваемых в одном кадре бит может меняться от восьми до тридцатидвух. В качестве примера использования синхронного последовательного порта на рисунке 3 приведена схема подключения аналого-цифрового преобразователя фирмы к синхронному последовательному порту сигнального процессора той же фирмы.
Рисунок 3. Схема подключения кодека к синхронному последовательному порту.
В рассмотренной схеме синхронного последовательного порта на приёмном конце необходимо подсчитывать количество тактовых импульсов, прошедшее после импульса кадровой синхронизации. Кроме того, в таком синхронном последовательном порту информация передаётся непрерывно, что, конечно, удобно для устройств с непрерывным потоком информации, как, например, в кодеках речи. Но существуют устройства, к которым необходимо обращаться только периодически, как, например, синтезаторы частоты, микросхемы приёмников, блоков цветности телевизоров, микросхем памяти данных и многие другие устройства. В этих случаях используются другие виды синхронных последовательных портов такие как SPI порт и I2C шина. Временная диаграмма SPI интерфейса приведена на рисунке 4.
Рисунок 4. Временная диаграмма SPI интерфейса.
Основное отличие этого интерфейса от приведённого выше, заключается в том, что сигнал тактовой синхронизации передаётся только в момент действия импульса кадровой синхронизации. Активный уровень сигнала кадровой синхронизации длится до окончания передачи последнего бита в передаваемом кадре. По одним и тем же линиям передачи данных MISO (вход для главного, выход для ведомого) и MOSI (выход для главного, вход для ведомого) может передаваться информация к совершенно различным микросхемам. Выбор, для какой из микросхем предназначена информация, производится сигналом SS (выбор ведомого).
В SPI интерфейсе в приёмнике не требуется счётчик тактовых импульсов. Запись принятой информации производится по окончанию кадрового импульса.
Если в устройстве используется несколько микросхем, то количество линий выбора ведомого становится значительным, поэтому в таких случаях используется ещё один вид синхронного последовательного интерфейса: I2C шина. Временная диаграмма этого интерфейса приведена на рисунке 5. В I2C шине приём и передача данных, а также передача адреса микросхемы и адреса регистра внутри микросхемы, к которому осуществляется обращение, производится по одному и тому же проводу. Для подключения к этому проводу используются микросхемы с открытым коллектором. Нагрузкой для всех микросхем, подключенных к линии SDA служит внешний резистор. Естественно, что скорость передачи данных по такому порту будет ниже, по сравнению с SPI портом. Тактовая синхронизация в I2C шине передаётся по линии SCL. Начало работы с микросхемой обозначается особой комбинацией сигналов SDA и SCL, которая называется условием старта. Эта же комбинация одновременно осуществляет кадровую синхронизацию. Завершение работы с микросхемой обозначается ещё одной комбинацией сигналов SDA и SCL. В качестве примера микросхем, использующих интерфейс I2C можно назвать микросхемы EEPROM серии 24сXX.
Рисунок 5. Временная диаграмма I2C интерфейса.
Статические оперативные запоминающие устройства (ОЗУ)
В радиоаппаратуре часто требуется хранение временной информации, значение которой не важно при включении устройства. Такую память можно было бы построить на микросхемах или -памяти, но, к сожалению, эти микросхемы дороги, обладают малым количеством перезаписей и чрезвычайно низким быстродействием при считывании и особенно записи информации. Для хранения временной информации можно воспользоваться . Так как запоминаемые слова не нужны одновременно, то можно воспользоваться механизмом адресации, который применяется в .
Схемы, в которых в качестве запоминающей ячейки используется называется статической ОЗУ, т.к. информация в ней сохраняется все время, пока к микросхеме подключено питание. В отличие от статической ОЗУ в микросхемах постоянно требуется регенерировать их содержимое, иначе информация будет испорчена.
В микросхемах ОЗУ присутствуют две операции: операция записи и операция чтения. Для записи и чтения информации можно использовать различные шины данных (как это делается в сигнальных процессорах), но чаще используется одна и та же шина данных. Это позволяет экономить выводы микросхем, подключаемых к этой шине и легко осуществлять коммутацию сигналов между различными устройствами.
Схема статического ОЗУ приведена на рисунке 1. Вход и выход микросхемы в этой схеме объединены при помощи . Естественно, что схемы реальных ОЗУ будут отличаться от приведенной на этом рисунке. Тем не менее, приведенная схема позволяет понять как работает реальное ОЗУ. Изображение ОЗУ на принципиальных схемах приведено на рисунке 2.
Рисунок 1. Структурная схема ОЗУ.
Рисунок 2. Изображение ОЗУ на принципиальных схемах.
Сигнал записи WR позволяет записать логические уровни, присутствующие на информационных входах во внутреннюю ячейку ОЗУ. Сигнал чтения RD позволяет выдать содержимое внутренней ячейки памяти на информационные выходы микросхемы. В приведенной на рисунке 1 схеме невозможно одновременно производить операцию записи и чтения, но обычно это и не нужно.
Конкретная ячейка микросхемы выбирается при помощи двоичного кода - адреса ячейки.
Объем памяти микросхемы зависит от количества ячеек, содержащихся в ней или, что то же самое, от количества адресных проводов. Количество ячеек в микросхеме можно определить по количеству адресных проводов возводя 2 в степень, равную количеству адресных выводов в микросхеме:
Вывод выбора кристалла CS позволяет объединять несколько микросхем для увеличения объема памяти ОЗУ. Такая схема приведена на рисунке 3.
Рисунок 3. Схема ОЗУ, построенного на нескольких микросхемах памяти.
Статические ОЗУ требуют для своего построения большой площади кристалла, поэтому их ёмкость относительно невелика. Статические ОЗУ применяются для построения микроконтроллерных схем из-за простоты построения принципиальной схемы и возможности работать на сколь угодно низких частотах, вплоть до постоянного тока. Кроме того статические ОЗУ применяются для построения КЭШ-памяти в универсальных компьютерах из-за высокого быстродействия статического ОЗУ.
Временные диаграммы чтения из статического ОЗУ совпадают с временными Временные диаграммы записи в статическое ОЗУ и чтения из него приведены на рисунке 4.
Рисунок 4. Временная диаграмма обращения к ОЗУ принятая для схем, совместимых со стандартом фирмы INTEL.
На рисунке 4 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке RD - это сигнал чтения; WR - сигнал записи; A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние); DI - входная информация, предназначенная для записи в ячейку ОЗУ, расположенную по адресу A1; DO - выходная информация, считанная из ячейки ОЗУ, расположенной по адресу A2.
Рисунок 5. Временная диаграмма обращения к ОЗУ принятая для схем, совместимых со стандартом фирмы MOTOROLA.
На рисунке 5 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке R/W - это сигнал выбора операции записи или чтения; DS - сигнал стробирования данных; A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние); DI - входная информация, предназначенная для записи в ячейку ОЗУ, расположенную по адресу A1; DO - выходная информация, считанная из ячейки ОЗУ, расположенной по адресу A2.
[ ]
Универсальные микропроцессы
Универсальные микропроцессоры применяются в вычислительной технике и в настоящее время именно на них отрабатываются самые передовые решения по повышению быстродействия микросхем.
Паразитные ёмкости печатной платы компьютера или другого устройства, в котором используется микропроцессор, не позволяют достигнуть предельного быстродействия, с которым может работать кристалл микропроцессора. Кроме того, невозможно реализовать кварцевые резонаторы на частоты, на которых работают современные микропроцессоры. Поэтому внутренняя и внешняя тактовая частота микропроцессора различаются. Обычно внутренняя тактовая частота в несколько раз выше внешней тактовой частоты микропроцессора.
Умножение внешней тактовой частоты внутри кристалла процессора производится при помощи цепи фазовой автоподстройки частоты, поэтому для установления стабильной внутренней частоты микропроцессора требуется некоторое время, определяемое обычно десятками микросекунд.
Первым фактором, огранивающим быстродействие микропроцессорной системы в целом, является то, что для увеличения доступной ёмкости системной памяти компьютера, микросхемы ОЗУ выбираются вида. Однако эти ОЗУ обладают относительно невысоким быстродействием. В результате возникает противоречие между высоким быстродействием микропроцессора и быстродействием системной памяти, которая ограничивает быстродействие микропроцессорной системы в целом.
В качестве решения этой проблемы в современных компьютерах предлагается использование КЭШ-памяти. Эта память с точки зрения программиста никак не видна и общий объём системной памяти не увеличивает. Предназначение КЭШ-памяти - увеличить общее быстродействие системной памяти в целом.
КЭШ-память выполняется в виде небольшого размера и высокого быстродействия. КЭШ-память ставится как буфер между основной памятью и микропроцессором. Она располагается на материнской плате. Естественно что при первом обращении к системной памяти быстродействие снижается на задержку, вносимую КЭШ-памятью. Выигрыш в быстродействии достигается при повторном обращении к одному и тому же участку памяти.
В этом случае обращение к основной памяти не требуется, так как в КЭШ-памяти уже хранится копия содержимого основной памяти компьютера. Учитывая, что выполнение программ обычно реализуется в виде циклов, когда один и тот же участок программного кода повторяется многократно, общее быстродействие системы в целом будет определяться быстродействием КЭШ-памяти.
Всю логику работы с КЭШ-памятью выполняет контроллер памяти, входящий в набор микросхем (Chip Set) материнской платы компьютера.
Рассмотренный выше метод увеличивает общее быстродействие системной памяти, но при этом быстродействие повышается только до значения тактовой частоты системной шины (внешняя тактовая частота микропроцессора). Согласовать внутреннее быстродействие микропроцессора и быстродействие системной шины позволяет использование внутренней КЭШ памяти. Естественно объём этой внутренней памяти меньше объёма КЭШ-памяти, расположенной на материнской плате компьютера.
При рассмотрении принципов работы цифровых микросхем мы узнали, что потребляемый микросхемой ток определяется быстродействием микросхемы, поэтому внутренняя КЭШ-память в свою очередь разделяется на два уровня: первый уровень малого объёма, но высокого быстродействия, совпадающего с внутренним быстродействием микропроцессора, и второй уровень, с большим объёмом памяти, но с меньшим быстродействием. По аналогии с этими двумя уровнями КЭШ-памяти, КЭШ-память, расположенную на материнской плате называют КЭШ-памятью третьего уровня.
[] [] []
Виды двоичных кодов
В микропроцессорах двоичные коды используются для представления любой обрабатываемой информации. При этом разрядность обрабатываемых чисел может превышать разрядность самого процессора и используемой в нём памяти. В этом случае длинное число может занимать несколько ячеек памяти и обрабатываться несколькими командами процессора. При обработке все ячейки памяти, выделенные под многобайтное число, рассматриваются как одно число.
Для представления числовой информации могут использоваться знаковые и беззнаковые коды. Для определённости примем длину слова процессора равной восьми битам.
Беззнаковые двоичные коды.
Первый вид двоичных кодов, который мы рассмотрим - это целые беззнаковые коды. В этих кодах каждый двоичный разряд представляет собой степень цифры 2:
При этом минимально возможное число, которое можно записать таким двоичным кодом, равно 0. Максимально возможное число, которое можно записать таким двоичным кодом, можно определить как:
Этими двумя числами полностью можно определить диапазон, чисел которые можно представить таким двоичным кодом. В случае двоичного восьмиразрядного беззнакового целого числа диапазон будет: диапазон чисел, которые можно записать таким кодом: 0 .. 255. Для шестнадцатиразрядного кода этот 0 .. 65535. В восьмиразрядном процессоре для хранения такого числа используется две ячейки памяти, расположенные в соседних адресах. Для работы с такими числами используются специальные команды.
Второй вид двоичных кодов, который мы рассмотрим - это прямые целые знаковые коды. В этих кодах старший разряд в слове используется для представления знака числа. В прямом знаковом коде нулем обозначается знак '+', а единицей - знак '-'. В результате введения знакового разряда диапазон чисел смещается в сторону отрицательных чисел:
В случае двоичного восьмиразрядного знакового целого числа диапазон чисел, которые можно записать таким кодом: -127 .. +127. Для шестнадцатиразрядного кода этот диапазон будет: -32767 .. +32767. В восьмиразрядном процессоре для хранения такого числа тоже используется две ячейки памяти, расположенные в соседних адресах.
Недостатком такого кода является то, что знаковый разряд и цифровые разряды приходится обрабатывать раздельно. Алгоритм программ, работающий с такими кодами получается сложный. Для выделения и изменения знакового разряда приходится применять механизм маскирования разрядов, что резко увеличивает размер программы и уменьшает ее быстродействие. Для того, чтобы алгоритм обработки знакового и цифровых разрядов не различался, были введены обратные двоичные коды.
Знаковые обратные двоичные коды.
Обратные двоичные коды отличаются от прямых только тем, что отрицательные числа в них получаются инвертированием всех разрядов числа. При этом знаковый и цифровые разряды не различаются. Алгоритм работы с такими кодами резко упрощается.
Тем не менее при работе с обратными кодами требуется специальный алгоритм распознавания знака, вычисления абсолютного значения числа, восстановления знака результата числа. Кроме того, в прямом и обратном коде числа для запоминания числа 0 используется два кода, тогда как известно, что число 0 положительное и отрицательным не может быть никогда.
Знаковые дополнительные двоичные коды.
От перечисленных недостатков свободны дополнительные коды. Эти коды позволяют непосредственно суммировать положительные и отрицательные числа не анализируя знаковый разряд и при этом получать правильный результат. Все это становится возможным благодаря тому, что дополнительные числа являются естественным кольцом чисел, а не исскуственным образованием как прямые и обратные коды. Кроме того немаловажным является то, что вычислять дополнение в двоичном коде чрезвычайно легко. Для этого достаточно к обратному коду добавить 1:
Диапазон чисел, которые можно записать таким кодом: -128 .. +127. Для шестнадцатиразрядного кода этот диапазон будет: -32768 .. +32767. В восьмиразрядном процессоре для хранения такого числа используется две ячейки памяти, расположенные в соседних адресах.
В обратных и дополнительных кодах наблюдается интересный эффект, который называется эффект распространения знака.
Он заключается в том, что при преобразовании однобайтного числа в двухбайтное достаточно всем битам старшего байта присвоить значение знакового бита младшего байта. То есть для хранения знака числа можно использовать сколько угодно старших бит. При этом значение кода совершенно не изменяется.
Использование для представления знака числа двух бит предоставляет интересную возможность контролировать переполнения при выполнении арифметических операций. Рассмотрим несколько примеров.
1) Просуммируем числа 12 и 5
В этом примере видно, что в результате суммирования получается правильный результат. Это можно проконтролировать по флагу переноса C, который совпадает со знаком результата (действует эффект распространения знака).
2) Просуммируем два отрицательных числа -12 и -5
В этом примере флаг переноса C тоже совпадает со знаком результата, то есть переполнения не произошло и в этом случае
3) Просуммируем положительное и отрицательное число -12 и +5
В этом примере при суммировании положительного и отрицательного числа автоматически получается правильный знак результата. В данном случае знак результата отрицательный. Флаг переноса совпадает со знаком результата, поэтому переполнения не было (мы можем убедиться в этом непосредственными вычислениями на бумаге или на калькуляторе).
4) Просуммируем положительное и отрицательное число +12 и -5
В данном примере знак результата положительный. Флаг переноса совпадает со знаком результата, поэтому переполнения не было и в этом случае.
5)Просуммируем числа 100 и 31
В этом примере видно, что в результате суммирования произошло переполнение восьмибитовой переменной, т.к. в результате операции над положительными числами получился отрицательный результат. Однако если рассмотреть флаг переноса, то он не совпадает со знаком результата. Эта ситуации является признаком переполнения результата и легко обнаруживается при помощи операции "исключающее ИЛИ" над старшим битом результата и флагом переноса C. Большинство процессоров осуществляют эту операцию аппаратно и помещают результат во флаг переполнения OV.
В этом примере результате операции над отрицательными числами в результате суммирования произошло переполнение восьмибитовой переменной, т.к. получился положительный результат. И в этом случае если рассмотреть флаг переноса C, то он не совпадает со знаком результата. Отличие от предыдущего случая только в комбинации этих бит. В примере 5 говорят о переполнении результата (комбинация 01), а в примере 6 об антипереполнении результата (комбинация 10).
Представление дробных чисел в двоичном коде с фиксированной запятой.
Кроме целых чисел часто требуется работать с дробными числами. Следующий вид двоичных кодов, который мы рассмотрим - это дробные коды. Как и в случае целых чисел, дробные числа могут быть беззнаковые и знаковые. Для записи знаковых чисел могут быть использованы прямые, обратные и дополнительные коды. Принцип их построения точно такой же, как и в случае целых чисел.
Рассмотрим, как можно записать дробное число. До сих пор мы предполагали, что двоичная запятая находится правее самого младшего разряда. Но кто сказал, что она должна всегда находиться в этом месте? Мы можем договориться, что запятая находится слева от самого старшего разряда, и тогда в такой переменной можно будет записывать только дробные числа:
Или договоримся, что она находится точно посередине переменной, и тогда мы сможем записывать смешанные числа:
Остальные случаи рассматривать не будем. Они строятся точно так же как и для целых чисел.
Представление чисел в двоичном коде с плавающей запятой.
Часто приходится обрабатывать очень большие числа (например, расстояние между звёздами) или наоборот очень маленькие числа (например, размеры атомов или электронов). При таких вычислениях пришлось бы использовать числа с очень большой разрядностью. В то же время нам не нужно знать расстояние между звёздами с точностью до миллиметра. Для вычислений с такими величинами числа с фиксированной запятой неэффективны.
В десятичной арифметике для записи таких чисел используется алгебраическая форма.
При этом число записывается в виде мантиссы, умноженной на 10 в степени, отображающей порядок числа, Например:
0,2*105; 0,16*10-38
Для записи двоичных чисел тоже используется такая форма записи. Эта форма записи называется запись числа с плавающей точкой. Напомним, что мантисса не может быть больше единицы и после запятой в мантиссе не может записываться ноль.
А теперь рассмотрим промышленные стандарты, используемые для представления чисел в компьютерах. Существует стандарт IEEE 754 для представления чисел с одинарной точностью (float) и с двойной точностью (double). Для записи числа в формате с плавающей запятой одинарной точности требуется тридцатидвухбитовое слово. Для записи чисел с двойной точностью требуется шестидесятичетырёхбитовое слово. Чаще всего числа хранятся в нескольких соседних ячейках памяти процессора. Форматы числа в формате с плавающей запятой одинарной точности и числа в формате с плавающей запятой удвоенной точности приведены на рисунке
На рисунке буквой S обозначен знак числа, 0 - это положительное число, 1 - отрицательное число. e обозначает смещённый порядок числа. Смещение требуется, чтобы не вводить в число еще один знак. Смещённый порядок всегда положительное число. Для одинарной точности для порядка выделено восемь бит. Для смещённого порядка двойной точности отводится 11 бит. Для одинарной точности смещение принято 127, а для двойной точности - 1023. В десятичной мантиссе после запятой могут присутствовать цифры 1:9, а в двоичной - только 1. Поэтому для хранения единицы после двоичной запятой не выделяется отдельный бит в числе с плавающей запятой. Единица подразумевается, как и двоичная запятая. Кроме того, в формате чисел с плавающей запятой принято, что мантисса всегда больше 1. То есть диапазон значений мантиссы лежит в диапазоне от 1 до 2.
Рассмотрим несколько примеров:
1) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:
11000001 01001000 00000000 00000000
- Знаковый бит, равный 1 показывает, что число отрицательное.
- Экспонента 10000010 в десятичном виде соответствует числу 130. Вычтя число 127 из 130, получим число 3.
- Теперь запишем мантиссу: 1,100 1000 0000 0000 0000 0000
- И, наконец, определим десятичное число: 1100,1b = 12,5d
2) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:
11000011 00110100 00000000 00000000
- Знаковый бит, равный 1 показывает, что число отрицательное.
- Экспонента 10000110 в десятичном виде соответствует числу 134. Вычтя число 127 из 134, получим число 7.
- Теперь запишем мантиссу: 1,011 0100 0000 0000 0000 0000
- И, наконец, определим десятичное число: 10110100b=180d
Для того чтобы записать ноль, достаточно записать в смещенный порядок число 00000000b. Значение мантиссы при этом не имеет значения. Число, в котором все байты равны 0, тоже попадает в этот диапазон значений.
Бесконечность соответствует смещенному порядку 11111111b и мантиссе, равной 1,0. При этом существует минус бесконечность и плюс бесконечность (переполнение и антипереполнение), которые часто отображаются на экран монитора как +INF и -INF.
Все остальные комбинации битов (в том числе и все единицы) воспринимаются как не числа и отображаются на экран: NaN.
Запись десятичных чисел.
Иногда бывает удобно хранить числа в памяти процессора в десятичном виде (Например, для вывода на экран дисплея). Для записи таких чисел используются двоично-десятичные коды. Для записи одного десятичного разряда используется четыре двоичных бита. Эти четыре бита называются тетрадой. Иногда встречается название, пришедшее из англоязычной литературы: нибл. При помощи четырех бит можно закодировать шестнадцать цифр. Лишние комбинации в двоично-десятичном коде являются запрещенными. Таблица соответствия двоично-десятичного кода и десятичных цифр приведена ниже:
Остальные комбинации двоичного кода в тетраде являются запрещенными. Запишем пример двоично-десятичного кода:
1258 = 0001 0010 0101 1000
589 = 0000 0101 1000 1001
Достаточно часто в памяти процессора для хранения одной десятичной цифры выделяется одна ячейка памяти (восьми, шестнадцати или тридцатидвухразрядная).
Это делается для повышения скорости работы программы. Для того, чтобы отличить такой способ записи двоично-десятичного числа от стандартного, способ записи десятичного числа, как это показано в примере, называется упакованной формой двоично-десятичного числа. Запишем те же числа, что и в предыдущем примере в неупакованном двоично-десятичном коде для восьмиразрядного процессора:
1258 =00000001 00000010 00000101 00001000 589 = 00000000 00000101 00001000 00001001 Суммирование двоично-десятичных чисел.
Суммирование двоично-десяичных чисел можно производить по правилам обычной двоичной арифметики, а затем производить двоично-десятичную коррекцию. Двоично-десятичная коррекция заключается в проверке каждой тетрады на допустимые коды. Если в какой либо тетраде обнаруживается запрещенная комбинация , то это говорит о переполнении. В этом случае необходимо произвести двоично-десятичную коррекцию. Двоично-десятичная коррекция заключается в дополнительном суммировании числа шесть (число запрещенных комбинаций) с тетрадой, в которой произошло переполнение или произошёл перенос в старшую тетраду. Приведём два примера:
Запись текстов в памяти процессора.
Все символы и буквы могут быть закодированы при помощи восьми двоичных символов. Наиболее распространенными таблицами являются таблицы ASCII с национальными расширениями, применяющиеся в DOS (и которые можно использовать для записи текстов в микропроцессорах), и таблицы ANSI, применяющиеся в WINDOWS. В таблицах ASCII и ANSI первые 128 символов совпадают. В этой части таблицы содержатся символы цифр, знаков препинания, латинские буквы верхнего и нижнего регистров и управляющие символы. Национальные расширения символьных таблиц и символы псевдографики содержатся в последних 128 кодах этих таблиц, поэтому русские тексты в операционных системах DOS и WINDOWS не совпадают.
[ ]
Языки программирования для микроконтроллеров
Программирование для микроконтроллеров как и программирование для универсальных компьютеров прошло большой путь развития от программирования в машинных кодах до применения современных интегрированных систем написания программ, отладки и программирования микроконтроллеров. В настоящее время программы пишется на одном из языков программирования.
Рисунок 1. Классификация программ-трансляторов языков программирования.
Сами языки программирования в свою очередь делятся на две группы:
языки программирования "высокого" уровня языки программирования "низкого" уровня.К языкам программирования "низкого" уровня относятся языки программирования в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.
Языки программирования "высокого" уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки "высокого" уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы - трансляторы для соответствующего процессора.) В настоящее время наиболее распространены такие языки программирования высокого уровня как и
О преимуществах и недостатках языков высокого и низкого уровней говорилось достаточно много. Выбор языка программирования зависит от состава аппаратуры, для которой пишется программа, а также от требующегося быстродействия всего программно - аппаратного комплекса в целом.
В тех случаях, когда объём ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемблеру нет.
Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т.к. испортить можно всё!).
Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объём памяти программ (несколько десятков килобайт). Увеличение объёма программы связано с несколькими факторами:
Язык программирования рассчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче (исключив не нужные в данном конкретном случае проверки или защиты).
Программист не видит к чему приводит использование тех или других операторов языка программирования, поэтому может выбирать операторы, не оптимальные как с точки зрения длины машинного кода программы, так и с точки зрения быстродействия программы.
Программист не использует подпрограммы там, где они могли бы сократить объём программы, так как на языке программирования высокого уровня это всего один или несколько операторов.
Первый из этих пунктов постепенно утрачивает своё значение с появлением всё более совершенных трансляторов. Третий пункт тоже решается тем же путём при применении различных видов оптимизаторов, входящих в состав компилятора. Однако в большинстве случаев оптимизатор не может определить одинаковые действия, если они отличаются хотя бы одной командой. Кроме того, оптимизатор работает только в пределах одного модуля!
Многофайловые программы
В процессе написания программ обычно накапливаются подпрограммы и участки кода, которые можно использовать в нескольких программах. Эти участки кода можно копировать из программы в программу при помощи текстового редактора, в котором Вы пишете программы. Однако это может привести к некоторым неудобствам. Прежде всего, разрастается исходный текст программы, и в нём становится трудно ориентироваться при написании и редактировании программы. Кроме того, при обнаружении ошибок в отлаженном ранее участке кода или при переходе к работе с другими устройствами приходится искать включенные ранее участки кода и заменять их новыми.
Это трудоёмкая работа, которая приводит к ошибкам и, в конечном счёте, замедляет написание и отладку программ. Намного удобнее использовать хранить исходную программу в нескольких файлах, предоставляя работу по соединению этих файлов в единую программу транслятору.
Самым простым способом соединения нескольких файлов в одну программу является использование директивы включения текстового файла в исходный текст программы INCLUDE.
При использовании этой директивы в исходный текст программы добавляется содержимое включаемого файла и только после этого производится трансляция исходного текста программы в объектный или исполняемый код программы. Иными словами содержимое исходного файла программы и включаемого файла объединяются препроцессором во временном файле и только после этого производится трансляция полученного временного файла. Пример использования директивы INCLUDE на языке программирования Си:
#include <stdio.h> /*Файл стандартного ввода-вывода*/ #include <reg51.h> /*Файл описания регистров специальных функций микроконтроллера*/ ... /*Остальная часть программы*/Приведём содержимое включаемых файлов:
В результате программа-транслятор формирует временный файл следующего содержания:
а затем транслирует его в загружаемый модуль.
Точно таким же образом можно использовать включение файлов и на языке программирования ASM-51:
$include (stdio.asm) ;Файл стандартного ввода-вывода
$include (reg51.inc) ;Файл описания регистров специальных функций микроконтроллера
... ;Остальная часть программы
Использование нескольких файлов позволяет разбить исходный текст программы на несколько независимых файлов, каждый из которых реализует свою независимую задачу. Удобнее всего в отдельные файлы выносить подпрограммы, так как они могут быть построены таким образом, чтобы в наименьшей степени быть связанными с основной программой. Разбираться с короткими файлами, реализующими одну или несколько связанных между собой задач намного легче, чем работать с одним большим файлом. Кроме того, различные участки программы могут быть написаны несколькими программистами, которым намного легче работать со своей программой, оформленной в виде отдельного файла.
[ ]
Многомодульные программы
Разбиение исходного текста программы на несколько файлов делает этот текст более понятным для программиста или нескольких программистов, участвующих в создании программного продукта. Однако остаётся нерешёнными ещё несколько задач:
Программа-транслятор работает со всем исходным текстом целиком, ведь она соединяет все файлы перед трансляцией вместе. Поэтому время трансляции исходного текста программы остаётся значительным (и даже возрастает). В то же самое время программа никогда не переписывается целиком. Обычно изменяется только небольшой участок программы. При назначении переменных их количество ограничено программой-транслятором и может быть исчерпано при написании программы. Различные программисты, участвующие в создании программного продукта могут назначать одинаковые имена для своих переменных и при попытке соединения файлов в единую программу обычно возникают проблемы.Все эти проблемы могут быть решены при раздельной трансляции программы. То есть было бы неплохо уметь транслировать каждый файл с исходным текстом программы отдельно и соединять затем готовые оттранслированные участки программы.
Компиляторы, которые позволяют транслировать отдельные участки программы называются компиляторами с раздельной трансляцией.
Исходный текст программы, который может быть отдельно оттранслирован, называется программным модулем.
Оттранслированный программный модуль сохраняется в виде отдельного файла в объектном формате, где кроме машинных команд сохраняется информация о именах переменных, адресах команд, требующих модификации при объединении модулей в единую программу и отладочная информация.
Раздельная трансляция программы возможна при использовании двух программ: транслятора исходного текста программы и редактора связей.
Программа редактор связей позволяет объединять несколько объектных файлов (модулей) в один. Для объединения нескольких модулей в исполняемую программу имена всех модулей передаются в редактор связей в качестве параметров при запуске этой программы.
Пример вызова редактора связей из командной строки DOS для объединения трёх модулей:
rl51.exe progr.obj, modul1.obj, modul2.obj
В результате работы редактора связей в этом примере будет создан исполняемый модуль с именем progr.
На первый взгляд раздельная трансляция не должна вызывать каких либо проблем. Однако это не так. При компиляции исходного текста программы транслятор составляет таблицу ссылок на константы, переменные и команды. Если при втором просмотре исходного текста программы, во время которого формируется объектный модуль, транслятор не обнаружит имени переменной или метки в своей таблице, то будет сформировано сообщение об ошибке и объектный модуль будет стёрт с диска компьютера.
Для того, чтобы транслятор вместо формирования сообщения об ошибке записал в объектный модуль информацию, необходимую для редактора связей, нужно использовать специальные директивы ссылок на внешние переменные или метки. Обычно эти директивы называются PUBLIC (общие) и EXTRN (внешние). Для ссылки на переменную или метку используется директива EXTRN. В этой директиве перечисляются через запятую метки и переменные, точное значение которых редактор связей должен получить из другого модуля и модифицировать все команды, в которых эти метки или переменные используются. Пример использования директивы EXTRN на языке программирования ASM-51:
EXTRN DATA (BufInd, ERR)
EXTRN CODE (Podprogr)
Для того, чтобы редактор связей мог осуществить связывание модулей в единую программу, переменные и метки, объявленные по крайней мере в одном из модулей как EXTRN, в другом модуле должны быть объявлены как доступные для всех модулей при помощи директивы PUBLIC . Пример использования директивы PUBLIC на языке программирования ASM-51:
PUBLIC BufInd, Parametr
PUBLIC Podprogr, ?Podprogr?Byte
Использование нескольких модулей при написании программы увеличивает скорость трансляции и, в конечном итоге, скорость написания программы. Однако объявления переменных и имён подпрограмм внешних модулей загромождают исходный текст модуля.Кроме того, при использовании чужих модулей трудно объявить переменные и подпрограммы без ошибок. Поэтому обычно объявления переменных, констант и предварительные объявления подпрограмм хранят во включаемых файлах, которые называются файлами-заголовками. Правилом хорошего тона считается при разработке программного модуля сразу же написать файл-заголовок для этого модуля, который может быть использован программистами, работающими с Вашим программным модулем.
[ ]
Написание программ для микропроцессоров
Написание программ для микропроцессоров резко отличается от написания программ для универсального компьютера. При выполнении программы на универсальном компьютере запуск программ, взаимодействие с внутренними, внешними устройствами или человеком берёт на себя операционная система. Программа, написанная для микроконтроллера, должна решать все эти задачи. Программа, написанная для компьютера, когда-нибудь запускается и завершается. Программа, управляющая микроконтроллером, запускается при включении устройства и не завершает свою работу пока не будет выключено питание.
Программа для микроконтроллера должна решать все перечисленные выше проблемы. Простейшим видом программы, которая может решать поставленные задачи является монитор.
Алгоритм программы-монитора приведён на рисунке 2.25. После включения питания эта программа должна настроить микросхему под выполняемую программой задачу, то есть настроить определённые ножки микросхемы на ввод или вывод информации, включить и настроить внутренние таймеры микроконтроллера и так далее. Этот блок алгоритма программы-монитора называется инициализацией процессора.
Рисунок 2.25. Алгоритм программы-монитора.
Основная часть программы начинает выполняться после настройки микроконтроллера на выполняемую работу. При этом необходимо понимать, что если в аппаратуре ввод обработка и вывод информации производится различными блоками, то при выполнении программы эти же действия производятся последовательно одним и тем же устройством – микропроцессором. В этом же цикле предусмотрен блок обработки ошибок. Его предназначение сообщать оператору о непредвиденной ситуации, такой как неправильный ввод с клавиатуры или неправильные данные с подключенного к микроконтроллеру устройства.
Рассмотрим пример реализации такого алгоритма работы программы. Для написания программы воспользуемся принципами структурного программирования, рассмотренными ранее. В этом случае для проверки работоспособности программы можно воспользоваться программами-заглушками.
Исходный текст такой программы приведён на рисунке 2.26.
Рисунок 2.25. Пример реализации программы-монитора на языке СИ.
Как видно из приведённого текста программа ещё ничего не делает, однако эта программа может быть оттранслирована и запущена на отладчике. В отладчике можно проверить, что при включении устройства мы действительно попадаем в подпрограмму инициализации, а затем последовательно вызываются подпрограммы сбора и обработки информации, а также подпрограмма обработки ошибок.
При использовании нескольких подпрограмм встаёт проблема обмена информацией между этими подпрограммами. Как уже рассматривалось ранее, информация в подпрограмму может быть передана через параметры подпрограммы или через глобальные переменные. При создании программы-монитора может потребоваться передавать одну и ту же информацию нескольким подпрограммам, поэтому в мониторах информация обычно передаётся через глобальные переменные.
Объявим глобальную переменную SkanCode, в которой будем хранить значения электрических сигналов на выводах микроконтроллера, подключенных к контактам клавиатуры.
Достаточно часто программа, написанная для микроконтроллера, реализует одновременно несколько устройств или несколько режимов работы. В случае если реализуется несколько режимов работы, задача решается несколько проще. Так как в каждый отдельный момент времени требуется только один режим работы, то для реализации каждого режима работы можно использовать отдельный программный монитор.
[ ]
Определения
Абсолютный сегмент - это часть программы или памяти данных, расположенных по определённому адресу. Программа - обязана разместить сегмент по указанному адресу. При перекрытии одних и тех же адресов редактор связей генерирует сообщение об ошибке.
Глобальные переменные существуют в течение всей работы устройства. К глобальным переменным относятся внутренние и внешние устройства микроконтроллера, а также переменные, через которые осуществляется обмен данными между подпрограммами.
Директива - это команда программе-транслятору выполнить какое-либо действие.
Загрузочный модуль - это готовая программа в машинных кодах, которая может быть записана во внутреннюю память микроконтроллера. Может храниться на компьютере в бинарном или HEX формате.
Идентификатор - это символическое обозначение объекта программы. В качестве идентификатора может быть использована любая последовательность букв и цифр. Идентификатор может начинаться только с буквы! Это позволяет отличать его от .
Интерпретатор - программа, осуществляющая трансляцию одного оператора исходного текста программы в машинные коды.
Исполняемый модуль программы получается при помощи программы редактора связей. Формат исполняемого модуля программы (который часто называется абсолютным модулем программы) - это объектный формат. В этом модуле сохраняется вся отладочная информация, поэтому этот модуль может быть использован для внутрисхемного отладчика при отладке программы.
Исходный модуль - это текстовый файл части программы, написанный на каком-либо языке программирования. Исходный модуль обычно оформляется специальным образом для того, чтобы он мог быть оттранслирован (в объектный модуль).
Исходный текст программы - это текстовый файл, написанный на каком-либо языке программирования. Выполняться такая программа может только под управлением интерпретатора. Обычно исходный текст программы преобразуется в машинные коды при помощи программы-компилятора.
Ключевые слова - являются определяющей частью оператора любого языка программирования.
Комментарий - это пояснение к программе, которое не оказывает влияния на ее выполнение.
Компилятор - программа, осуществляющая трансляцию всего исходного текста программы в машинные коды.
Локальные переменные имеют значение только в течение выполнения какого-то участка программы или подпрограммы. Локальные переменные обычно размещаются во внутренних регистрах микроконтроллера для увеличения быстродействия программы и сокращения её объёма.
Модуль - это часть программы, которая может быть откомпилирована отдельно. В дальнейшем готовые откомпилированные модули (объектные модули) могут объединяться в готовые программы или библиотеки. В модулях обычно хранятся подпрограммы, константы или переменные.
Объектный модуль программы получается в результате трансляции исходного текста модуля. В состав объектного модуля программы помещается оттранслированный код модуля, информация для редактора связей, позволяющая объединять модули в единую программу, и отладочная информация (переменные, константы, метки и их адреса). Для объектного модуля по умолчанию используется имя файла, совпадающее с именем файла исходного модуля и с расширением obj.
Параметры подпрограммы - это локальные переменные подпрограммы, которые доступны из вызывающей эту подпрограмму программы. Параметры подпрограммы записываются в скобках после имени подпрограммы. Например:
real sin(real x); sin(0.707); sin(a); Параметр программы - это последовательность символов, которая печатается после названия исполняемого файла. В качестве параметров могут использоваться команды, ключи и имена файлов, над которыми будут производиться какие-либо действия.
Перемещаемый сегмент - это часть программы или памяти данных, которые программа - может разместить в любом свободном месте памяти процессора. При распределении памяти редактор связей старается не оставлять неиспользуемых промежутков.
Подпрограмма-заглушка это подпрограмма, которая ничего не выполняет, а только возвращает управление главной программе. Действие, которое в дальнейшем должна выполнять эта программа, отображается в названии подпрограммы-заглушки.
Формальные параметры подпрограммы - это локальные переменные, использующиеся в подпрограмме. Объявления параметров подпрограммы записываются в скобках после имени подпрограммы. Например:
real sin(real x). Перед вызовом подпрограммы этим переменным должны быть присвоены конкретные значения. Например:
sin(0.707). Реальные параметры подпрограммы - это переменные, использующиеся в вызывающей подпрограмму программе. При вызове подпрограммы они уже должны содержать конкретные значения. Реальные параметры подпрограммы записываются в скобках после имени подпрограммы. Например:
a=0.707; sin(a); Редактор связей - программа, позволяющая осуществить связывание отдельных оттранслированных программных модулей в единую программу.
Число - может быть целой или константой, , и литеральной строкой.
[ ]
Отладка программ
После того, как программные модули были успешно оттранслированы, размещены по конкретным адресам и связаны между собой, для отладки программы можно воспользоваться любым из следующих методов:
внутрисхемным эмулятором встроенным программным отладчиком внешним программным отладчиком отлаживаемым устройством с записанным в память программ двоичным кодом программыВнутрисхемный эмулятор с отображением переменных языка программирования на дисплее компьютера оказывает значительную помощь при отладке программ непосредственно на разрабатываемой аппаратуре. Этот метод отладки предоставляет наиболее удобную среду, когда можно непосредственно в отлаживаемом устройстве останавливать программу, контролировать выполнение программы непосредственно по исходному тексту программы, состояние внешних портов и внутренних переменных, как входящих в состав микросхемы, так и объявленных при написании исходного текста программы. Отметим, что при отладке программы с использованием внутрисхемного эмулятора необходимо включать в объектные модули символьную информацию. Необходимое для отладки программ оборудование показано на рисунке 1.
Рисунок 1. Пример системы отладки программного обеспечения для микроконтроллеров.
До недавнего времени внутрисхемный эмулятор являлся отдельным устройством, подключаемым к разрабатываемой плате вместо микроконтроллера. В состав современных микроконтроллеров часто входит встроенный внутрисхемный эмулятор. При этом наиболее удобным интерфейсом для связи с компьютером является JTAG интерфейс, хотя некоторые фирмы-производители микросхем предлагают свой интерфейс.
При использовании интегрированной среды программирования предоставляется удобный интерфейс, позволяющий легко отлаживать разрабатываемую программу. В настоящее время стандартом де-факто стал интерфейс, похожий на программную оболочку Visual C. Пример внешнего вида такой программной оболочки приведён на рисунке 2.
Рисунок 2. Пример внешнего вида отладчика интегрированной системы отладки программного обеспечения.
Встроенный программный отладчик, входящий в состав интегрированной среды программирования не позволяет проконтролировать работу аппаратуры, подключенной к внешним ножкам микроконтроллера, но значительно удешевляет отладочный комплекс, необходимый для написания программ для микроконтроллеров. Сигналы, которые должна подавать на микроконтроллер аппаратура задаются самим программистом (а значит уже на этом этапе возможно возникновение ошибок из-за неправильного понимания работы аппаратуры). Ручной ввод этих сигналов значительно замедляет процесс отладки программного обеспечения.
Внешний программный отладчик. В некоторых случаях используется не интегрированная среда программирования, а отдельный транслятор с выбранного языка программирования. В этом случае можно воспользоваться любой программой, эмулирующей выбранный тип микроконтроллера. Так как объектные форматы различных трансляторов несколько отличаются друг от друга, то в качестве входного файла используется загрузочный модуль в двоичном или гексадецимальном формате. В этих форматах отладочная информация полностью отсутствует, поэтому отладку в таких программах можно вести только с помощью встроенного дизассемблера и распечатанного (или открытого в другом окне) листинга программы. Естественно, что это ещё более неудобный способ отладки по сравнению с использованием интегрированной среды программирования и внутрисхемного эмулятора.
Программирование микросхемы. При использовании любого способа отладки программы, готовый загрузочный модуль записывается во внутреннюю память программ микроконтроллера при помощи программатора (который входит в состав многих современных микросхем микроконтроллеров). После этого ведётся тщательное тестирование разработанного устройства с целью обнаружения ошибок в схеме и программе этого устройства. Только после успешного прохождения этого тестирования программа считается полностью написанной и отлаженной.
При написании достаточно простых программ иногда для отладки программ используют только этот последний этап тестирования.Однако обнаружение, поиск и устранение ошибок при использовании только этого метода очень трудоёмок! Это то же самое, что пытаться настроить аппаратуру без использования приборов!
Подпрограммы функции
Часто требуется передавать результат вычислений из подпрограммы в основную программу. Для этого можно воспользоваться подпрограммой - функцией. Подпрограмма - функция возвращает вычисленное значение. Пример использования подпрограммы - функции:
Y=sin(x);Использование подпрограмм-функций позволяет приблизить процесс написания программ к математической записи выражений, которые необходимо вычислить. Использование подпрограмм-функций позволяет увеличить наглядность программ и, в результате, увеличить скорость написания и отладки программ.
Подпрограммы-функции обычно возвращают простые типы переменных, такие как байт, слово или целое значение. Однако при помощи переменной-указателя можно возвращать и более сложные переменные, такие как массивы переменных или строки.
[ ]
Подпрограммы процедуры
Если подпрограмма только осуществляет действия над глобальными переменными, то такая подпрограмма называется процедурой. Эта подпрограмма может осуществлять управление какими-то устройствами или осуществлять какие-либо вычисления. Если производятся вычисления, то результат помещается в глобальную переменную для того, чтобы этим результатом могла воспользоваться другая подпрограмма или основная программа. Пример управления последовательным портом:
... G_Per=56; PeredatByte(); ... G_Per=37; PeredatByte(); ... /********************************************** Подпрограмма передачи байта через последовательный порт **********************************************/ void PeredatByte(void) {do;while(TI==0)//Если предыдущий байт передан SBUF=G_Per //то передать очередной байт }Рисунок 1. Пример подпрограммы - процедуры.
Часто подпрограмма должна выполнять действия над каким то числом, значение которого неизвестно в момент написания программы. Это число можно передать через глобальную переменную как показано на рисунке 1. Однако намного удобнее использовать подпрограмму с . На языке высокого уровня вызов такой подпрограммы будет выглядеть следующим образом:
... PeredatByte(56); ... PeredatByte(57); ... /******************************************************* Подпрограмма передачи байта через последовательный порт ********************************************************/ void PeredatByte(char byte) {do;while(TI==0) //Если предыдущий байт передан SBUF=byte; //то передать очередной байт }Рисунок 2. Пример подпрограммы - процедуры с передачей данных через параметр подпрограммы.
Сравните с программой, приведённой на рисунке 1. Как по вашему, какая из программ более наглядная? В подпрограмму можно передавать и значительные объёмы данных, как например:
PeredatStroky("Напечатать строку");
Естественно, что в этом случае сама вызываемая подпрограмма должна быть написана несколько иначе по сравнению с предыдущим случаем.
Подпрограммы процедуры и подпрограммы функции
Подпрограммы предназначены для выполнения определённых действий над внутренними устройствами микроконтроллера, подключёнными к ножкам микроконтроллера или числами, хранящимися в памяти этой микросхемы. В любом случае, с точки зрения программы, операции производятся над переменными. Переменные могут быть или .
Применение комментариев
Комментарий используется для увеличения наглядности исходного текста программы и может содержать любой печатный символ кода ASCII, в том числе включать пробелы и табуляцию. При компиляции исходного текста программы в исполняемый или объектный код комментарии игнорируются программами-трансляторами. Рассмотрим конкретные примеры использования комментариев.
Комментарии применяются при написании программы для того, чтобы поставить в соответствие блоку алгоритма написанные операторы программы. Так как алгоритм может быть написан с различной степенью детализации, то это должно быть отображено при помощи различных видов комментариев, существенно отличающихся друг от друга.
Комментарии для блоков алгоритма с наибольшей степенью детализации обычно пишут справа от операторов, которые реализуют этот алгоритм.
Более крупные блоки алгоритма отражаются комментариями, пересекающими всю программу. Эти комментарии пишут буквами верхнего регистра, чтобы было легко заметить этот комментарий.
Ещё более крупные блоки алгоритма выделяют специальными символами, которые сразу бросаются в глаза (обычно это звёздочки или символы знака минус '-'). Пример использования комментариев на языке программирования ассемблер приведён ниже:
... ;ПЕРЕДАТЬ ДВА ЧИСЛА ПО ПОСЛЕДОВАТЕЛЬНОМУ ПОРТУ КОММЕНТАРИЙ АЛГОРИТМА ВТОРОГО УРОВНЯ MOV G_Per, #56 ;Передать число 56 через КОММЕНТАРИЙ, ПОЯСНЯЮЩИЙ ДЕЙСТВИЯ CALL PeredatByte ;последовательный порт НЕСКОЛЬКИХ ОПЕРАТОРОВ MOV G_Per, #37 ;Передать число 37 через CALL PeredatByte ;последовательный порт ;------------------------------------------ КОНЕЦ БЛОКА АЛГОРИТМА ВТОРОГО УРОВНЯ ... ;******************************************** ;Подпрограмма передачи байта ТАК ВЫДЕЛЯЮТСЯ ОСОБО ;через последовательный порт ВАЖНЫЕ БЛОКИ АЛГОРИТМА ;******************************************** PeredatByte: JB TI,$ ;Если предыдущий байт передан КОММЕНТАРИЙ, ПОЯСНЯЮЩИЙ ДЕЙСТВИЕ КОМАНДЫ В ДАННОМ КОНКРЕТНОМ СЛУЧАЕ MOV SBUF,G_Per ;то передать очередной байт RETВ приведённом примере показан отрывок программы на языке ASM-51, но точно так же можно использовать комментарии и на языке высокого уровня. При этом нужно помнить, что те действия, которые абсолютно ясны в момент написания программы через месяц вызовут затруднения даже у программиста, написавшего эту программу, не говоря уже о человеке, который видит эту программу впервые.
Программа, написанная на языке программирования ассемблер, читается прежде всего по комментариям и только потом, если она по каким либо причинам не работает, проверяется на соответствие комментария конкретным операторам языка программирования.
Такой стиль написания программ позволяет значительно экономить время, так как не приходится повторно разбираться с уже написанными участками кода при поиске ошибки программы.
[ ]
Применение подпрограмм при программировании
При написании программ часто при реализации алгоритма работы устройства приходится повторять одни и те же операторы (например операторы, работающие с параллельным или последовательным портом). Было бы неплохо использовать один и тот же участок кода, вместо того, чтобы повторять одни и те же операторы несколько раз.
Участок программы, к которому можно обращаться из различных мест программы для выполнения некоторых действий называется подпрограммой.
Проблема, с которой приходится сталкиваться при многократном использовании участков кодов, это в какое место памяти программ возвращаться после завершения подпрограммы? Обращение к подпрограмме производится из нескольких мест основной программы. Описанную ситуацию иллюстрирует рисунок 1. На этом рисунке изображено адресное пространство микроконтроллера. Младшие адреса адресного пространства на этом рисунке находятся в нижней части рисунка.
Рисунок 1. Вызов подпрограммы и возврат к выполнению основной программы.
Для того, чтобы получить возможность возвращаться на команду, следующую за командой вызова подпрограммы, требуется запомнить адрес этой команды. Адрес возврата хранится в особых ячейках памяти. После выполнения подпрограммы необходимо осуществить переход к адресу, который записан в этих ячейках.
Для обращения к подпрограмме и возврата из неё в систему команд микропроцессоров вводят специальные команды. В микроконтроллерах семейства MCS-51 это команды , для вызова подпрограммы и команда для возврата из подпрограммы. Эти команды не только осуществляют передачу управления на указанный адрес, но и запоминают адрес команды, следующей за командой вызова подпрограммы. Команда возврата из подпрограммы передаёт управление команде, адрес которой был запомнен командой вызова подпрограммы. Пример использования подпрограммы на языке программирования ASM-51 приведён на рисунке 2:
... MOV A,#56 CALL PeredatByte ... MOV A,#37 CALL PeredatByte ... ;******************************************** ;Подпрограмма передачи байта ;через последовательный порт ;******************************************** PeredatByte: JB TI,$ ;Если предыдущий байт передан MOV SBUF,G_Per ;то передать очередной байт RETРисунок 2.
Например в микроконтроллерах семейства MCS-51 при занесении информации в стек содержимое указателя стека увеличивается (стек растёт вверх), поэтому стек размещается в самой верхней части памяти данных. Для того, чтобы установить глубину стека 28 байт, необходимо вычесть из адреса максимальной ячейки внутренней памяти микроконтроллера глубину стека и записать полученное значение в указатель стека SP:
Кроме содержимого программного счётчика часто требуется запоминать содержимое внутренних регистров и флагов процессора, локальных переменных подпрограммы. Стек оказался удобным средством и для этой задачи. Сохранение локальных переменных в стеке позволило осуществлять вызов подпрограммы самой из себя (реализовывать рекурсивные алгоритмы). Это привело к введению в систему команд специальных команд работы со стеком. В микроконтроллерах семейства MCS-51 это команды и . Использование этих команд показывается на следующем примере:
[ ]
Способы отладки программ
Отладка программ заключается в проверке правильности работы программы и аппаратуры. Программа, не содержащая синтаксических ошибок тем не менее может содержать логические ошибки, не позволяющие программе выполнять заложенные в ней функции. Логические ошибки могут быть связаны с алгоритмом программы или с неправильным пониманием работы аппаратуры, подключённой к портам микроконтроллера.
Встроенный в состав интегрированной среды программирования отладчик позволяет отладить те участки кода программы, которые не зависят от работы аппаратуры, не входящей в состав микросхемы микроконтроллера. Обычно это относится к вычислению математических выражений или преобразованию форматов представления данных.
Для отладки программ обычно применяют три способа:
Пошаговая отладка программ с заходом в подпрограммы; Пошаговая отладка программ с выполнением подпрограммы как одного оператора; Выполнение программы до точки останова.Пошаговая отладка программ заключается в том, что выполняется один оператор программы и, затем контролируются те переменные, на которые должен был воздействовать данный оператор.
Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.
Если в программе существует достаточно большой участок программы, уже отлаженный ранее, то его можно выполнить, не контролируя переменные, на которые он воздействует. Использование точек останова позволяет пропускать уже отлаженную часть программы. Точка останова устанавливается в местах, где необходимо проверить содержимое переменных или просто проконтролировать, передаётся ли управление данному оператору.
Практически во всех отладчиках поддерживается это свойство (а также выполнение программы до курсора и выход из подпрограммы). Затем отладка программы продолжается в пошаговом режиме с контролем локальных и глобальных переменных, а также внутренних регистров микроконтроллера и напряжений на выводах этой микросхемы.
Контроль данных при пошаговой отладке. При использовании встроенного отладчика программ для контроля переменных можно воспользоваться окном Watch. В большинстве случаев это намного выгоднее, чем использовать просмотр памяти данных. Переменные в этом окне отображаются в том формате, в котором они были объявлены в программе. Преобразование данных из одной формы представления в другую осуществляется встроенными средствами отладчика. Если же отладочная информация по какой либо причине была потеряна или программирование ведётся на языке программирования ассемблер, то состояние переменных можно проконтролировать просмотром содержимого внутренней и внешней памяти микроконтроллера. Для определения конкретной ячейки памяти микроконтроллера, занятой под переменную можно воспользоваться листингом, создаваемым редактором связей компилятора или самим компилятором, если не используется многомодульное программирование.
Практически все отладчики позволяют проконтролировать содержимое рабочих регистров текущего банка.
[] []
Структурное программирование
Программирование для универсальных компьютеров начиналось с программирования в машинных кодах, затем появились и начали своё развитие языки высокого уровня, затем Дейкстрой были развиты принципы структурного программирования, на смену структурному программированию пришло объектное программирование и в настоящее время активно развивается визуальное программирование.
Программирование для микроконтроллеров во многом повторяет тот же путь. Переход от этапа к этапу зависит от доступных внутренних ресурсов микроконтроллеров. Ещё несколько лет назад использование языков высокого уровня было невозможно из-за малого объёма внутренней памяти программ. (В дешёвых моделях микроконтроллеров эта ситуация сохраняется до сих пор.) В настоящее время с появлением микроконтроллеров и сигнальных процессоров с объёмом внутренней памяти в несколько десятков килобайт появляется возможность объектного проектирования.
Применение структурного программирования позволяет увеличить скорость написания программ и облегчить отладку написанной программы. Структурное программирование возможно и на языках программирования assembler, где не предусмотрено структурных операторов, подобных структурным операторам языков программирования C, PASCAL, PL/M.
В настоящее время существует два способа написания программ: снизу вверх и сверху вниз. При написании программы снизу вверх приступить к отладке программы невозможно, не написав полностью всю программу. При написании программы сверху вниз на любом этапе написания программы она может быть оттранслирована и выполнена, при этом можно отследить все алгоритмические действия программы, написанные к этому времени. Процесс написания программы не отличается от процесса создания алгоритма. Более того, эти этапы создания программы можно объединить. Выполняемое алгоритмическое действие отображается в названии подпрограммы. Например:
ProchitatPort ;Прочитать порт
VklychitIndikator ;Включить индикатор
Основная идея структурного программирования заключаются в том, что существует только четыре структурных оператора.
Используя эти структурные операторы можно построить сколь угодно сложную программу.
Первый структурный оператор называется линейная цепочка операторов. Любая задача может быть разбита на несколько подзадач. Выполнение подзадач может быть поручено подпрограмме, в названии которой можно (и нужно) отразить подзадачу, которую должна решать эта подпрограмма. На момент написания алгоритма (и программы) верхнего уровня нас не интересует, как будет решаться эта задача, поэтому вместо настоящей подпрограммы поставим .
Алгоритмическое изображение оператора |
Язык программирования С | Язык программирования asm-51 |
Алгоритмическое изображение оператора |
Язык программирования С |
Язык программирования asm-51 |
Алгоритмическое изображение оператора |
Язык программирования С |
Язык программирования asm-51 |
Алгоритмическое изображение оператора |
Язык программирования С |
Язык программирования asm-51 |
Алгоритмическое изображение оператора |
Язык программирования С |
Язык программирования asm-51 |
Виды компиляторов
Программы-компиляторы бывают оценочные и профессиональные.
Оценочные или учебные компиляторы позволяют написать простейшие программы для конкретного процессора и определить подходит ли процессор для тех задач, которые предстоит решать в процессе разработки устройства. Конечно, если программа очень проста, то можно весь программный продукт написать на оценочном компиляторе. Оценочные компиляторы позволяют транслировать одиночный файл исходного текста программы. Иногда такие компиляторы позволяют включать в процесс трансляции содержимое отдельных файлов специальной . В результате работы оценочного компилятора сразу получается исполняемый или программы, поэтому такие компиляторы называются компиляторы с единой трансляцией.
Профессиональные трансляторы позволяют производить трансляцию исходного текста программы по частям. Это позволяет значительно сократить время трансляции исходного текста программы, так как не нужно транслировать весь текст программы, а можно транслировать только ту часть программы, которая менялась после предыдущей трансляции. Кроме того, каждый программный модуль может писать отдельный программист. Это позволяет сократить время написания программы. Даже в том случае, если программу пишет один человек, время написания программы сокращается за счёт использования готовых отлаженных и оттранслированных . В таких компиляторах процесс трансляции программы разбивается на два этапа: трансляция программного модуля и связывание программных модулей в единую программу. Поэтому такие компиляторы называются компиляторами с раздельной трансляцией.
Оценочные компиляторы обычно предлагаются бесплатно фирмами - производителями микроконтроллеров. Только фирма Intel предложила в своё время профессиональный пакет разработки программ - язык программирования PLM-51 в состав которого входит профессиональный язык программирования ASM-51.
Профессиональные компиляторы разрабатываются и продаются отдельными фирмами. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм как , , . В состав современных средств написания и отладки программ для микроконтроллеров обычно входят эмуляторы процессоров или отладочные платы, текстовый редактор, компиляторы языка высокого уровня (чаще всего "C") и ассемблера, редактор связей и загрузчик программы в отладочную плату. Все программы обычно объединены интегрированной средой разработки программного проекта, позволяющую поддерживать один или несколько программных проектов.
[ ] [ ] [ ]
Виды программ – трансляторов
Процесс преобразования операторов исходного языка программирования в машинные коды микропроцессора называется трансляцией исходного текста. В настоящее время ручная трансляция программ практически не используется. Трансляция производится специальными программами-трансляторами.
Существует два больших класса программ-трансляторов: компиляторы и интерпретаторы. При использовании компиляторов весь исходный текст программы преобразуется в машинные коды, и именно эти коды записываются в память микропроцессора. При использовании интерпретатора в память микропроцессора записывается исходный текст программы, а трансляция производится при считывании очередного оператора. Естественно, что быстродействие интерпретаторов намного ниже по сравнению с компиляторами, т.к. при использовании оператора в цикле он транслируется многократно.
Применение интерпретатора может обеспечить выигрыш только в случае его разработки для языка программирования “высокого” уровня. В этом случае может быть сэкономлена внутренняя память программ, а также облегчен процесс отладки программ (при применении языка программирования BASIC) или облегчен перенос программ с одного типа процессора на другой (при применении языка программирования JAVA).
При программировании на языке программирования ASSEMBLER применение интерпретатора приводит к проигрышу по всем параметрам, поэтому для языков программирования низкого уровня применяются только программы–компиляторы.
Для программирования микроконтроллеров как на языке программирования “низкого” уровня, так и на языке программирования “высокого” уровня используются только компиляторы, поэтому рассмотрим подробнее виды этих трансляторов.
Что такое микроконтроллеры, микропроцессоры и сигнальные процессоры
Вся схемотехника разделяется на две большие области: аналоговую и цифровую Преимущества и недостатки этих технологий известны. Аналоговая схемотехника характеризуется максимальным быстродействием, малым потреблением энергии и малой стабильностью параметров. Цифровая схемотехника обладает прекрасной повторяемостью параметров. Это привело к её развитию в последние годы. В курсах электронных приборов рассматривались основные технологии производства цифровых микросхем: ТТЛ, ЭСЛ и КМОП, поэтому здесь особенности этих технологий рассматриваться не будут.
По мере развития цифровых микросхем их быстродействие достигло впечатляющих результатов. Наиболее быстрые из цифровых микросхем обладают скоростью переключения порядка 3..5 нс. (серия микросхем 74ALS), а внутри кристалла микросхемы, где нет больших ёмкостей нагрузки время переключения измеряется пикосекундами. Таким быстродействием обладают программируемые логические схемы и заказные БИС. В этих микросхемах алгоритм решаемой задачи заключён в их принципиальной схеме.
Часто для решаемой задачи не требуется такого быстродействия, каким обладают современные цифровые микросхемы. Однако за быстродействие приходится платить:
Быстродействующие микросхемы потребляют значительный ток. Для решения задачи приходится использовать много микросхем, это выливается в стоимость и габариты устройства.Первую задачу решает применение технологии КМОП цифровых микросхем (например микросхемы серий 1564, 74HC, 74AHC). Потребляемый ими ток зависит от скорости переключения логических вентилей. Именно поэтому в настоящее время подавляющее большинство микросхем выпускается именно по этой технологии.
Вторую задачу решают несколькими способами. Для жёсткой логики это разработка специализированных БИС. Использование специализированных БИС позволяет уменьшить габариты устройства, но стоимость его снижается только при крупносерийном производстве. Для среднего и малого объёмов производства такое решение неприемлемо.
Ещё одним решением уменьшения габаритов и стоимости устройства является применение программируемых логических схем (ПЛИС).
Это направление активно развивается в настоящее время, но оно не входит в рамки рассмотрения данного курса.
Третий способ решения поставленной задачи заключается в том, что можно заставить одно очень быстродействующее устройство последовательно решать различные задачи, изменяя свою структуру во времени. Это микропроцессоры. В микропроцессорах возможен обмен предельного быстродействия на сложность реализуемого устройства. Именно по этой причине стараются максимально увеличить быстродействие микропроцессоров - это позволяет реализовывать все более сложные устройства в одном и том же объеме. Более того! В одном процессоре можно реализовать несколько устройств одновременно! Именно это решение задачи и рассматривается в данном учебном курсе.
В современном мире трудно найти область техники, где не применялись бы микропроцессоры. Они применяются при вычислениях, они выполняют функции управления, они используются при обработке звука и изображения. В зависимости от области применения микропроцессора меняются требования к нему. Это накладывает отпечаток на внутреннюю структуру микропроцессора. В настоящее время определилось три направления развития микропроцессоров:
сигнальные микропроцессоры
Универсальные микропроцессоры используются для построения вычислительных машин. В них используются самые передовые решения по повышению быстродействия, не обращая особого внимания на габариты, стоимость и потребляемую энергию. В технике связи компьютеры используются для управления системами связи или устройствами связи, обладающими большими габаритами и стоимостью. Такие компьютеры называются контроллерами.
Для управления малогабаритными и дешёвыми устройствами связи используются однокристальные микроЭВМ, которые в настоящее время называются микроконтроллерами. В микроконтроллерах наоборот, максимальное внимание уделяется именно габаритам, стоимости и потребляемой энергии.
Еще один класс микропроцессоров решает задачи, которые традиционно решала аналоговая схемотехника. Это сигнальные процессоры. К сигнальным процессорам предъявляются специфические требования.От них требуются максимальное быстродействие, малые габариты, легкая стыковка с аналого-цифровыми и цифро-аналоговыми преобразователями, большая разрядность обрабатываемых данных и небольшой набор математических операций, обязательно включающий операцию умножения-накопления и аппаратную организацию циклов.
[ ]
Изменения в содержании материалов
1.06.06 Добавлен
12.05.05 Добавлено описание
27.04.05 Добавлено описание
26.02.05 Добавлены несколько
19.02.05 Добавлены
12.11.04 Изменено с целью приближения к лекционному материалу.
6.11.04 Размещены для группы РТ-14 для группы РА-15.
13.10.04 В связи с участившимися запросами по размещены материалы по этому семейству микроконтроллеров.
30.09.04 Начат набор желающих пройти обучение по курсу " ". Занятия начинаются по мере формирования групп. Количество человек в группе - 12 человек. Для записи обращаться: Главный корпус СибГУТИ каф. САПР к 302 (3 этаж) тел. для справок: 66-02-86.
30.09.04 Улучшена навигация между курсами. Исправлены ошибки в файлах описания и работы с . Кроме того выложены по разработке программ для микроконтроллеров семейства MCS-51.
27.07.04 Полностью изменена структура материалов. Обеспечены ссылки для последовательного чтения материалов Добавлены материалы по языку программирования . Добавлены материалы по языку программирования .
Микроконтроллеры Область применения
Термин контроллер образовался от английского слова to control - управлять. Эти устройства могут основываться на различных принципах работы от механических или оптических устройств до электронных аналоговых или цифровых устройств. Механические устройства управления обладают низкой надежностью и высокой стоимостью по сравнению с электронными блоками управления, поэтому в дальнейшем мы такие устройства рассматривать не будем. Электронные аналоговые устройства требуют постоянной регулировки в процессе эксплуатации, что увеличивает стоимость их эксплуатации. Поэтому такие устройства к настоящему времени почти не используются. Наиболее распространенными на сегодняшний день схемами управления являются схемы, построенные на основе цифровых микросхем.
В зависимости от стоимости и габаритов устройства, которым требуется управлять, определяются и требования к контроллеру. Если объект управления занимает десятки метров по площади, как, например, автоматические телефонные станции, базовые станции сотовых систем связи или радиорелейные линии связи, то в качестве контроллеров можно использовать универсальные компьютеры. Управление при этом можно осуществлять через встроенные порты компьютера (LPT, COM, USB или ETHERNET). В такие компьютеры при включении питания заносится управляющая программа, которая и превращает универсальный компьютер в контроллер.
Использование универсального компьютера в качестве контроллера позволяет в кратчайшие сроки производить разработку новых систем связи, легко их модернизировать (путём простой смены программы) а также использовать готовые массовые (а значит дешёвые) блоки.
Если же к контроллеру предъявляются особенные требования, такие, как работа в условиях тряски, расширенном диапазоне температур, воздействия агрессивных сред, то приходится использовать промышленные варианты универсальных компьютеров. Естественно, что эти компьютеры значительно дороже обычных универсальных компьютеров, но всё равно они позволяют экономить время разработки системы, за счёт того, что не нужно вести разработку аппаратуры контроллера.
Контроллеры требуются не только для больших систем, но и для малогабаритных устройств таких как радиоприёмники, радиостанции, магнитофоны или сотовые аппараты. В таких устройствах к контроллерам предъявляются жёсткие требования по стоимости, габаритам и температурному диапазону работы. Этим требованиям не могут удовлетворить даже промышленные варианты универсального компьютера. Приходится вести разработку контроллеров на основе однокристальных ЭВМ, которые в свою очередь получили название микроконтроллеры.
Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас. В качестве примера на рисунке 1 приведены узлы автомобиля, в которых применяются микроконтроллеры.
Рисунок 1 Узлы автомобиля, в которых применяются микроконтроллеры.
Внешний вид автомобильной и носимой радиостанции, в которых тоже применяются микросхемы микроконтроллеров, показаны на рисунке 2 и рисунке 3.
Рисунок 2. Малогабаритная радиостанция с применением микроконтроллеров.
Рисунок 3. Малогабаритная радиостанция с применением микроконтроллеров.
Как выглядит носимая радиостанция внутри показывает фотография, приведённая на рисунке 4.
Рисунок 4. Печатная плата приёмопередатчика носимой радиостанции.
Наиболее распространёнными в настоящее время являются микроконтроллеры семейства . Это семейсво поддерживается рядом фирм - производителей микросхем. Не менее распространёнными в мире но не в России являются микроконтроллеры фирмы Это такие семейства как и многие другие. Пожалуй, не менее популярными микроконтроллерами являются микроконтроллеры семейства AVR фирмы . Одно перечисление семейств микроконтроллеров может занять несколько страниц текста, поэтому ограничимся приведёнными семействами восьмиразрядных микроконтроллеров.
[ ]