Контакты

Хранитель музея | Эдуард Пройдаков | director@computer-museum.ru
Ведущий раздела "Электросвязь" | Петр Чачин | chachin@pcweek.ru
Web-мастер | Оксана Приходько | oxana_web@yahoo.com
На первую страницу Поиск


‹Ѕ\ЫSЫV~nfц8хО6Щlc’@Ѓ·a6·ТЛ#Ы«с–eяІ}м¦Ыi†6ҐdєЫ}й¬0V|ђ-Y–1¤‰ч;’o"¶[6'z БъОпr~чsfЮ]ј·°ъЩэ№µzз6№яажнҐ†ГџL,„Г‹«‹оL„ўдC)+¤ГбШЭАЬ.эбТLJЙ¤сi&% Iь$dfuiхvlо™Ц4МЉy@йLШэНМќШк<^ґz?ылѓҐЏg №¬"f•акv^ ђ…{wWcwWgЉшҐfп}џ$RBA•Щ-)›МmЙБHt2ВЂs{йо_ИrмцмЉІќWRўЁђ[Л±ga™эF'Еua3„І Њјц«Щ3[rёЅf|Њз’Ы$-®+Ў°!egгўдтэOXФlаfZH< ђґ”}И6±мGоГ]бСvЂоГь›BЂД7№t®0ш$%)ўім™и .ЉO‹dKJ*©ЩАхI@Жs…¤€/аcBL§ејђђІЭзјђL¶џќ7ђЕ}ШЎ$;oЉLЭђ”(m¤°аk`ЧЊ”Щ r!ОHaњ‰жс# }ћЯ ыI1xСФыШ[вЬLXa"§{r2кБ&аѕ †F‡ЇгoВЖЪUпb^{Пп] +В®ь6{ўгXЦТќЏИКтВyцd"Ў i=@¬ДоМЯџ ь1 ђ›ч–cЛігд“ҐЕХ[і‡Щ·bKЭ‚ввmѓ№6€USЧzњr–!ђTA\З*ЦE1‡ћ…ЗCШГщ–‰є lkР№^IїЉ i(ИЋiШЄnџ&, ZзХЙу ЖЇ w9энҐќЗаµuР_“!S°®"MёыџМД™о3SегќД^RЮyiжЭ`ђ,ж fAV„‚B‚Б№K<-»ь~{р&dLvвСг¶ќГ"Р—ЉxЊ2]ж±]мЭ3~чї!:·Gл¶V=…нЊэє Шg"“0“0Ќ°«чоCХ:є.Е3щDф5=…:–J(r[эj№Ъ±m‘(йЁЪxїтB!ъНбх 0g0а®fХMCњ§‡D7«µіW¶fM“Н>µ4RkЩґўЩ:%ЌzMkЄ}д5ЅН)QИЙ…GЎ|*Яї№ЯС^Дп©n™uН*jдШЭуoB’"e·№LЮ?’ј€;Щ‘"i4µP(Д‰°|B:oѓЯћє`ч–¦ЙsZ6ОHН2Kfе№ЄЩх'љRАЙКRТ?Вј€;»;Шb¶IЉFГ¶тQA±ђ)lКю…0®шLіЄФµ$©»6єшЈYЇі …сMyMV|›pПVЌ’jЩґ¬УЎ,е‘vX7‹¤К К/ЏїзD§°©дЦЂнџ(Ѕ€яЎЖ))UZdЯґlіxЪ$jС6«ж>eЋўЩп(bGшOЗшѕ¬hєm™ХбSш8RYJK‰\Ц?ћyw,jРCШ¬КС»E~†8-И©‡BБ?ъ<ЂЉ¦iлЦiQµµКЙі¤¦YZУ,©Шз5іТЂҐ.љ%&S(Њ®–4l т8ф^6.зЯя¦эу;х…®ZZq”ц\ ”P ,щд¤lс"ођЙЙ B$ъЉ8Ь±alK5К°Ђ¦e&yyteз;‹Йњ’›ф1`ф"ѕчЕfNyя[6lµе>ДRЖЩ4)j™УЦ ‡рZГ¦¤¦ВГ©–;’+:™oуЛP'†yHJZ‹i”aЦЩџ[жQ€ь7Dѕ ‘џґ’ уЈю№ќfїI|П‘HIyяФДш¤lо[љTsьЖЃе„Ь°¤MКi'¬ R$¦э#С‹шY«ЫЖ©yЪ4А‰(yУg±yчМrIe2ѓЎ+BSM[;‘E¦Я‡®Уgд•CЬ€KJѕђKш'A/вcі~VҐ–Z¶Z%&H'ЄБ†<Цкu“[¦””}Ь…]°Э.д1Gqо[к>¬6E@sЂРХде”УbB #aе]я:Щ №ј‚$WXHgХuД,zГЄ“n} Ґ(щйpxkk+$KqyS‘дPa3ь§л±ЊрЁа!‰ .ґЃЪt`-ћІs€кЋсBа5^ `Fь±“€4бNБйѕЫcНЙ±ПХЯ^>кE|ЄЗҐйdџВ/AѓЪ!?№ІјґІмqx №ѓk±C CIцСфР\џю3ІУІЎћP›РjлдqePЇ6 Н&–Y6ШєЙ,э[a@VфЩzµ’гЇ‹¤П]„=мЙ—“wдн¬їЯ‹шUќMdaМШs'n }«”°еcлEьжWЌА—БКµKgіG§Ъд$ЕdІ ' BЖ?+пE\\\&+‹Луw¦IЈT4Ґл&*њ6ЇВ zfѕШЏwGШph«™хЉVjАюT(©Єµ %Љ†ХъЂ“$%–" Щкџ$Ѕ€{f•D—ШЏ'ґ»Г+ґ7q%Єїгйm/t‘b>Vа'‘лСЦ4A8Pі`S+)љеЄщње€Гз40uv‡єЛ‰¤,fш–ЄЯСEй‡ЫнЇ}РiдяZіЄ!щЧHQ–Е+хПдТўвcЁoЧўыкVбЙKK%UБ^ЈТ™‡¤WОгeqryµl?іY/вSfоk%ZЕV4‘юЎд ?Iu^фm€YСЯXЦ‹шµ†HЋ"›ХYI‚и(a™'МомSіЫдe}ІB6ЗХьА< opцРцtіr¦›д9rYдн*±Хкљ.ґЬае2Ї®СшT5МљZmЩg ©“[µ»ъѓвС9Ц84Q±c®†O!>.(и mы'pаWєЮЁВ.!№u{Ѕ¶EЈЋ–Г!к7™uq—УЖЌъNiс— мSRЈhMQ^ЭСхM1НfЇь#Л‹шМ¬Uh‘Щ"ё—@Ц‹z{rD•&)feБ?‚Ѕ€@BЄYW™КrRM§I±ћу1Xр">aЭЏv+¤~dZUFЇ8€M>$%?Л€^Д^И©ђ–hЅVСZјкшт|мpчР~°`Dєz”±Ш†.Ѓј"џt")oъШ¦нЗыwQsZПiI7u =:µRйРЬ&Y ВшCnрІ©МkЛ ·Јp·b:qЮKќЙSтй§K¬WЗk;ЉyБєЖіпGЌh'ОDЖ~e^jЉў2¬4‚t%њ0Че[Нy рSхэ RQ¬±ВіҐ–(єQMЋ‰ф[ЋэЂ3ОD Nг‡–A+ј4яоџьzhПЬмѓ/Eхm’ѓЉZеаGLНь ;Ч©мЎ!‰^±zVр±>Ы»;їB‚)й•W'ЄVEOgUv^{WNИ|+A#уНЪ“ОHШ)fi"›ІќЃ)Тt…Ш"!r™Љ+њ'‡чzPЛуK‹Уd_+#я¬іСЌ3ѕDЙ›р)I]бiw‡ж…лћЬi‘¶Іx{uФѕЅ@іЂЄ;бВ•®‘кйE|‚‚,ВХ;6ЄФ®ЈГЈ”ХЏЬЂ#¬У^»CЖж¤[RAДЃ-ѕЖx©ёЅb«Њ±>Љ)яv…D%ns·†e Б4љЌ^і—Г4–њ~”щ6МFлыбШ/Я:›Б‚Ђ™гЃЅ®њkE6ЇgУљJцѕЫ осљзУ’ЊжІЏ3{^Дn_ Ћ¶»Eбs;g…-|Иґ™\)–*Ўe™љљ !г џKSЧЖoDёое‘vПш›\µ‘ЛBШN/ЯТ^ њj1 Зѓ€МpЖЂWYАSгЧьҐґшЊ»ХРнЋп°<Ц)xb cкнЮ"zаЄОт`ьІ#t{z]Jж д\tБUВ!±eW›щх›І6аOґ„ъј=Mњ‰bЁ¬л–КкѕZдU.tцКuѕ*;Jvј= WТъ)qўgP:МҐ^t\,™Л€Y” }“›рџ&jЧ8H1ЊњЯиЛ|«юЉЄ~7ЁM]”'R2‘№Іd¤цо"”В\ ъЁURДБДґґ_яnёЋ§л›(kCV5LЋіz$|ґЪАрґMЏp¶аRю(.еЦ8зM#СЏЧН/:)Љя]Т`іыIЗ0Ґujъ(%є@цЃCщЩDaЫЗj–q§Ёlў±‡EkќЩђЃД9†яґ‡@р‰ќpЖ‰Ы™pыЃs‡”ЕlТ9ўL€Лrо ¬cмћov¤њыпЂЫ5эЌ3Б8ѓ=мR\Ђ ®б®†lяеёЬ sjчzзмч8iЯ*0ЮЉчµіИЇЛ·яzѓ7=їЏгы¤}z?Љ%єЧфVЦ9‘ЮџKњ;fЯ;ZьћЫџєЦaН tyѓ«%ЮОiэs7аЁюпбv;t¦ЈћзOќыЁћјёЇ«7У ћ~гcчЋЬл@оОЯБЕ ёЫЃн®щеШ


Арифметико-логические устройства

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

Схема вычитателя числа A из числа B приведена на рисунке 1, а схема вычитателя числа B из числа A приведена на рисунке 2.

Рисунок 1. Схема вычитателя числа A из числа B.

Рисунок 2. Схема вычитателя числа B из числа A.

Если же потребуется в процессе вычислений изменять арифметическую операцию, то в схему можно ввести коммутатор. Такая схема приведена на рисунке 3.

Рисунок 3. Структурная схема арифметического устройства.

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

Проанализируем эту таблицу. Если на все управляющие входы подать низкий потенциал, то к входу сумматора будут подключены коды A и B без инверсии. В этом случае будет производиться операция суммирования. Эта ситуация отображена первыми двумя строками таблицы выполняемых операций. Операция вычитания осуществляется второй, третьей, восьмой и девятой строкой. В этом случае один из операндов поступает на вход сумматора через блок инверторов. Правда для получения дополнительного кода не хватает единицы, но еЈ можно подать на вход переноса сумматора PI. ЕщЈ одной часто используемой операцией является увеличение числа на единицу или уменьшение числа на единицу. Эти операции позволяют легко организовывать циклы в программе и переходить от предыдущего операнда к следующему. Такие операции могут быть выполнены при помощи кодов, записанных в строках четыре, семь, шестнадцать и двадцать пять. Кроме того, схема арифметического устройства может просто передавать на выход любой из входных кодов без изменения, что позволяет осуществлять копирование данных (суммирование с константой ноль) через это устройство без дополнительных схем коммутации.

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

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


Шинные формирователи

Мультиплексоры предназначены для объединения нескольких выходов в тех случаях, когда заранее известно сколько выходов нужно объединять. Часто это неизвестно. Более того, часто количество объединяемых микросхем изменяется в процессе эксплуатации устройств. Наиболее яркий пример - это компьютеры, в которых в процессе эксплуатации изменяется объем оперативной памяти, количество портов ввода-вывода, количество дисководов. В таких случаях невозможно для объединения нескольких выходов воспользоваться логическим элементом "ИЛИ".

Для объединения нескольких выходов на один вход в случае, когда заранее не известно сколько микросхем нужно объединять, используется два способа:

  1. монтажное ИЛИ;
  2. шинные формирователи.

Исторически первой схемой объединения выходов были схемы с открытым коллектором (монтажное "ИЛИ"). Схема монтажного "ИЛИ" приведена на рисунке 1.

Рисунок 1. Схема монтажного "ИЛИ".

Такое объединение микросхем называется шиной и позволяет объединять до 10 микросхем на один провод. Естественно для того, чтобы микросхемы не мешали друг другу только одна из микросхем должна выдавать информацию на общий провод. Остальные микросхемы в этот момент времени должны быть отключены от шины (то есть выходной транзистор должен быть закрыт). Это обеспечивается внешней микросхемой управления не показанной на данном рисунке.

На принципиальных схемах такие элементы обозначаются как показано на рисунке 2.

OK.gif (1175 bytes)

Рисунок 2. Обозначение микросхемы с открытым коллектором на выходе

Недостатком приведенной схемы объединения нескольких микросхем на один провод является низкая скорость передачи информации, обусловленная затягиванием переднего фронта. Это явление связано с различным сопротивлением заряда и разряда паразитной Јмкости шины. Заряд паразитной Јмкости происходит через сопротивления R1 и R2, которые много больше сопротивления открытого транзистора. Величину этого сопротивления невозможно уменьшить меньше некоторого предела, определяемого напряжением низкого уровня, который определяется в свою очередь допустимым током потребления всей схемы в целом. Временная диаграмма напряжения на шине с общим коллектором приведена на рисунке 3.

Рисунок 3. Временные диаграммы напряжения на входе и выходе микросхемы с открытым коллектором.

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

Рисунок 4. Путь протекания сквозного тока при непосредственном соединении выходов цифровых микросхем.

Эта проблема исчезает, если появляется возможность закрывать транзисторы как в верхнем, так и в нижнем плече выходного каскада. Если в микросхеме закрыты оба транзистора, то такое состояние выхода микросхемы называется третьим состоянием или z-состоянием выхода микросхемы. Такая возможность появляется в специализированных микросхемах с третьим состоянием на выходе микросхемы. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе микросхемы приведена на рисунке 5.

Рисунок 5. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе

На принципиальных схемах такие элементы обозначаются как показано на рисунке 6.

Z.gif (1166 bytes)

Рисунок 6. Обозначение микросхемы с тремя состояниями на выходе

Часто в микросхеме, содержащей элементы с тремя состояниями выходного каскада объединяют управляющие сигналы всех элементов в один провод. Такие микросхемы называют шинными формирователями и изображают на схемах как показано на рисунке 7.

Buf.gif (1651 bytes)

Рисунок 7. Обозначение шинного формирователя.


Семейство MSC-51

Микроконтроллеры семейства MCS-51.

1. Внутреннее устройство микроконтроллеров.

  1. Представители семейства MCS-51.
  2. Архитектура микроконтроллеров MCS-51.
  3. Особенности построения параллельных портов микроконтроллеров MCS-51.
  4. Особенности построения памяти микроконтроллеров семейства MCS-51.
  5. Внутренние таймеры микроконтроллера, особенности их применения.
  6. Устройство и особенности применения последовательного порта микроконтроллеров семейства MCS-51.

2. Система команд микроконтроллеров семейства MCS-51.

  1. Виды адресации.
  2. Инструкции микроконтроллеров семейства MCS-51.
3. Язык программирования ASM-51.
  1. Основные определения.
  2. Правила написания операторов на языке ассемблер.
  3. Символы, идентификаторы и числа языка ASM-51.
  4. Директивы языка ASM-51.
  5. Реализация подпрограмм процедур и подпрограмм функций на языке ассемблер.
  6. Способы реализации структурных операторов на языке ассемблер.
  7. Построение многомодульных программ на языке программирования ASM-51.

5. Язык программирования высокого уровня PLM-51.

  1. Язык программирования PLM-51
  2. Структура программ на языке программирования PLM-51
  3. Символы и идентификаторы языка программирования PLM-51.
  4. Операторы языка программирования PLM-51.
  5. Объявление переменных в языке программирования PLM-51.
  6. Объявление подпрограмм в языке программирования PLM-51.
  7. Области действия переменных в языке программирования PLM-51.
  8. Построение многомодульных программ на языке программирования PLM-51.

6. Язык программирования высокого уровня C-51.

  1. Язык программирования C-51
  2. Структура программ на языке программирования C-51
  3. Символы языка программирования C-51.
  4. Идентификаторы и константы.
  5. Выражения в операторах.
  6. Операторы.
  7. Объявление простых переменных.
  8. Объявление массивов и структур.
  9. Указатели.
  10. Объявление подпрограмм.
  11. Области действия переменных.
  12. Построение многомодульных программ.


Виды двоичных кодов

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

Для представления числовой информации могут использоваться знаковые и беззнаковые коды. Для определЈнности примем длину слова процессора равной восьми битам.

Беззнаковые двоичные коды.

Первый вид двоичных кодов, который мы рассмотрим - это целые беззнаковые коды. В этих кодах каждый двоичный разряд представляет собой степень цифры 2:

UnsIntCd.gif (2998 bytes)

При этом минимально возможное число, которое можно записать таким двоичным кодом, равно 0. Максимально возможное число, которое можно записать таким двоичным кодом, можно определить как:

Formula1.gif (1236 bytes)

Этими двумя числами полностью можно определить диапазон, чисел которые можно представить таким двоичным кодом. В случае двоичного восьмиразрядного беззнакового целого числа диапазон будет: диапазон чисел, которые можно записать таким кодом: 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

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

Суммирование двоично-десятичных чисел.

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

DecCorr1.gif (1567 bytes)

DecCorr2.gif (1536 bytes)

Запись текстов в памяти процессора.

Все символы и буквы могут быть закодированы при помощи восьми двоичных символов. Наиболее распространенными таблицами являются таблицы ASCII с национальными расширениями, применяющиеся в DOS (и которые можно использовать для записи текстов в микропроцессорах), и таблицы ANSI, применяющиеся в WINDOWS. В таблицах ASCII и ANSI первые 128 символов совпадают. В этой части таблицы содержатся символы цифр, знаков препинания, латинские буквы верхнего и нижнего регистров и управляющие символы. Национальные расширения символьных таблиц и символы псевдографики содержатся в последних 128 кодах этих таблиц, поэтому русские тексты в операционных системах DOS и WINDOWS не совпадают.


Комментарии

Применение комментариев

Комментарий используется для увеличения наглядности исходного текста программы и может содержать любой печатный символ кода 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. Что такое микроконтроллеры, микропроцессоры и сигнальные процессоры.
  2. Области применения микроконтроллеров, микропроцессоров и сигнальных процессоров.

2. Принципы работы микропроцессоров.

  1. Принципы аппаратурной реализации таблицы истинности.
  2. Сумматоры по модулю два. Построение многоразрядных арифметических сумматоров
  3. Построение мультиплексоров, декодеров и шинных формирователей.
  4. Масочные ПЗУ, ППЗУ, РПЗУ, ЭСППЗУ, FLASH - память
  5. Построение триггерных схем, регистров и ОЗУ.
  6. Построение арифметико-логических устройств.
  7. Виды двоичных кодов.
  8. Блок обработки сигналов микропроцессора.
  9. Понятие команд и микрокоманд. Системная шина микропроцессора
  10. Подключение ОЗУ и ПЗУ к системной шине микропроцессора. Дешифратор адреса.
  11. Понятие адресного пространства и распределения памяти микропроцессорного устройства.
  12. Подключение внешних устройств к микропроцессору.
  13. Принципы построения параллельного порта.
  14. Принципы построения последовательных портов
  15. Принципы построения таймеров.

3. Семейства микроконтроллеров.

  1. Микроконтроллеры семейства MCS-48.
  2. Микроконтроллеры семейства MCS-51.
  3. Микроконтроллеры семейства AVR.
  4. Микроконтроллеры семейства HS-11.

4. Сигнальные процессоры.

  1. Сигнальные процессоры фирмы Analog Devices.
  2. Сигнальные процессоры фирмы Texas Instruments.
  3. Сигнальные процессоры фирмы Motorolla.

5. Программирование.

  1. Языки программирования.
  2. Применение подпрограмм при программировании.
  3. Понятие подпрограммы процедуры и подпрограммы функции.
  4. Применение комментариев.
  5. Понятие структурного программирования.
  6. Понятие многофайлового и многомодульного программирования.
  7. Написание программ для микропроцессоров
  8. Отладка программ
Контакты
На первую страницу Поиск В раздел 'Галерея славы'


Декодеры

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

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

Рисунок 1. Таблица истинности десятичного декодера.

В соответствии с принципами построения произвольной таблицы истинности получим схему декодера. Эта схема приведена на рисунке 2.

Рисунок 2. Принципиальная схема двоично-десятичного декодера.

Точно так же можно получить схему для любого другого декодера или дешифратора.


Подключение внешних устройств к микропроцессору.

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

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

Согласование микросхем между собой не представляет трудностей, так как практически все современные микросхемы по входу и выходу согласованы с TTL уровнями. Если же это не так, то для согласования нестандартных уровней с TTL уровнями выпускаются специальные микросхемы. Несколько иначе обстоит дело с индикаторами и различными исполнительными устройствами.

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

Рисунок 1. Подключение одиночного светодиодного индикатора.

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

Несколько сложнее выглядит схема подключения внешних исполнительных устройств с индуктивной нагрузкой (например реле или электромагнит):

Рисунок 2. Подключение внешнего устройства с индуктивной нагрузкой.

Диод VD1 в этой схеме служит для ограничения напряжения импульсов самоиндукции, которые могут вывести из строя транзистор VT1.

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

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

Рисунок 3. Подключение источника дискретной информации с гальванической развязкой.

Иногда требуется вводить информацию с большого количества кнопок. В этом случае для уменьшения количества линий ввода-вывода используется клавиатура. Для подключения клавиатуры используется два порта: порт ввода и порт вывода. Схема подключения клавиатуры приведена на рисунке 4.

Рисунок 4. Подключение клавиатуры к микропроцессорному устройству.

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

Рисунок 5. Временные диаграммы напряжения на выводах порта вывода.


Подпрограммы процедуры и подпрограммы функции.

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

Подпрограммы процедуры

Если подпрограмма только осуществляет действия над глобальными переменными, то такая подпрограмма называется процедурой. Эта подпрограмма может осуществлять управление какими-то устройствами или осуществлять какие-либо вычисления. Если производятся вычисления, то результат помещается в глобальную переменную для того, чтобы этим результатом могла воспользоваться другая подпрограмма или основная программа. Пример управления последовательным портом:

  ...
  G_Per=56;
  PeredatByte();
  ...
  G_Per=37;
  PeredatByte();
  ...

/**********************************************
Подпрограмма передачи байта
через последовательный порт
**********************************************/
void PeredatByte(void)
{do;while(TI==0)//Если предыдущий байт передан
 SBUF=G_Per     //то передать очередной байт
}

Рисунок 1. Пример подпрограммы - процедуры.

Часто подпрограмма должна выполнять действия над каким то числом, значение которого неизвестно в момент написания программы. Это число можно передать через глобальную переменную как показано на рисунке 1. Однако намного удобнее использовать подпрограмму с параметрами. На языке высокого уровня вызов такой подпрограммы будет выглядеть следующим образом:

  PeredatByte(56);
  PeredatByte(57);

Рисунок 2. Пример подпрограммы - процедуры с передачей данных через параметр подпрограммы.

Сравните с программой, приведЈнной на рисунке 1. Как по вашему, какая из программ более наглядная? В подпрограмму можно передавать и значительные объЈмы данных, как например:

PeredatStroky("Напечатать строку");

Естественно, что в этом случае сама вызываемая подпрограмма должна быть написана несколько иначе по сравнению с предыдущим случаем.

Подпрограммы функции.

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

Y=sin(x);

Использование подпрограмм-функций позволяет приблизить процесс написания программ к математической записи выражений, которые необходимо вычислить. Использование подпрограмм-функций позволяет увеличить наглядность программ и, в результате, увеличить скорость написания и отладки программ.

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


Виртуальный компьютерный музей. Англо-русский компьютерный словарь. Вычисления в докомпьютерную эпоху. Технологии. Компьютерные игры. История развития электросвязи. История развития ПО. История вычислительной техники в России и за рубежом. English version.

 О Музее Календарь событий Докомпьютерная эпоха Компьютерный словарь История ВТ за рубежом История электросвязи История игр Книги и пресса Новости Музея Галерея славы История развития ВТ в СССР История развития ПО Технологии Ссылки Гостевая книга English version

Проект Эдуарда Пройдакова

Спонсоры проекта

[О музее] [Новости] [Календарь событий] [Галерея славы] [Документы и публикации]
[Англо-русский компьютерный словарь] [Вычисления в докомпьютерную эпоху] [Технологии] [Компьютерные игры][История развития электросвязи]
[История развития ПО [image] ] [История отечественной вычислительной техники ]
[История вычислительной техники за рубежом] [Книги и пресса ] [Ссылки] [Поиск] [Контакты] [Гостевая книга] [English version [image] ]

© Совет Виртуального компьютерного музея, 1997-2007


Команды микропроцессора

Команды микропроцессора в отличие от микрокоманд разрабатываются независимо от аппаратуры микросхемы, поэтому их разрядность обычно совпадает с разрядностью микропроцессора. Команда микропроцессора состоит из инструкции и обозначается код операции КОП (или INS в англоязычной литературе). Команда микропроцессора может состоять только из кода операции, когда не требуется указывать адрес операнда (операнды это данные, над которыми команда производит какое либо действие), или может состоять из кода операции и адресов операндов или данных. Форматы команд очень сильно зависит от структуры процессора. Рассмотрим построение команд для восьмиразрядного процессора, построенного по структуре Фон-Неймана. Примеры построения команд для такого процессора приведены на рисунке 1.

Ins.gif (4077 bytes)

Рисунок 1. Форматы различных команд микропроцессора.

Если для кода операции используется восьмибитное слово (байт), то при помощи этого слова можно закодировать 256 операций. В процессе разработки системы команд для операции может быть назначен любой код. Именно системой команд и определяется конкретное семейство процессоров. Однобайтовые команды позволяют работать с внутренними программно доступными регистрами процессора.

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

Ins.gif (4077 bytes)

Рисунок 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

Несмотря на то, что общий объЈм исходного текста программы увеличивается, скорость написания и особенно отладки программ в таком виде возрастает. Теперь вместо одного текста программы в памяти компьютера или на бумаге придется хранить два текста: один для человека, который в дальнейшем будем называть исходным текстом программы; другой для микропроцессора, который в дальнейшем будем называть загрузочным модулем.

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


Логические элементы

Любые цифровые микросхемы строятся на основе простейших логических элементов "НЕ", "ИЛИ", "И". В настоящее время используется несколько технологий построения логических элементов:

  • транзисторно-транзисторная логика (ТТЛ, TTL)
  • логика на основе комплементарных МОП транзисторов (КМОП, CMOS)
  • логика на основе сочетания комплементарных МОП и биполярных транзисторов (BiCMOS)

Простейшим логическим элементом является инвертор, который работает в соответствии со следующей таблицей:

Tbl_Inv.gif (1170 bytes) | Рис 1 Таблица истинности логического инвертора
inverter.gif (1082 bytes) | Рис 2 Изображение логического инвертора на принципиальных схемах.

Чаще всего существуют не отдельные схемы логического "И", а более сложные схемы, выполняющие одновременно логическую функцию "И" и логическую функцию "НЕ" Таблица истинности и изображение схемы, выполняющей логическую функцию "И-НЕ" изображены на рис 3 и 4 соответственно:

Tbl_and.gif (1317 bytes) | Рис 3 Таблица истинности схемы, выполняющей логическую функцию "И-НЕ".
 | Рис 4 Изображение схемы, выполняющей логическую функцию "И-НЕ".

Точно также как не существует отдельных схем логического "И", выполненных по технологии ТТЛ, не существует отдельных схем логического "ИЛИ". Таблица истинности и изображение схемы, выполняющей логическую функцию "ИЛИ-НЕ" изображены на рис 5 и 6 соответственно:

Tbl_and.gif (1317 bytes) | Рис 5 Таблица истинности схемы, выполняющей логическую функцию "ИЛИ-НЕ".
or.gif (1087 bytes) | Рис 6 Изображение схемы, выполняющей логическую функцию "ИЛИ-НЕ".

Построение произвольной таблицы истинности.

Любая логическая схема без памяти полностью описывается таблицей истинности. При построении сложных логических схем с произвольной таблицей истинности используется сочетание простейших схем "И" "ИЛИ" "НЕ".

При построении схемы, реализующей произвольную таблицу истинности, каждый выход анализируется (и строится схема) отдельно. Для реализации таблицы истинности при помощи логических элементов "И" достаточно рассмотреть только те строки таблицы истинности, которые содержат логические "1" в выходном сигнале. Строки, содержащие в выходном сигнале логический 0 в построении схемы не участвуют. Каждая строка, содержащая в выходном сигнале логическую "1", реализуется схемой логического "И" с количеством входов, совпадающим с количеством входных сигналов в таблице истинности. Входные сигналы, описанные в таблице истинности логической "1" подаются на вход этой схемы непосредственно, а входные сигналы, описанные в таблице истинности логическим "0" подаются на вход через иверторы. Объединение сигналов с выходов схем, реализующих отдельные строки таблицы истинности, производится при помощи схемы логического ИЛИ. Количество входов в этой схеме определяется количеством строк в таблице истинности, в которых в выходном сигнале присутствует логическая "1".

Рассмотрим конкретный пример. Пусть необходимо реализовать таблицу истинности, приведенную на рисунке 7:

Рисунок 7 Произвольная таблица истинности.

Для построения схемы, реализующей сигнал Out1, достаточно рассмотреть строки, выделенные красным цветом. Эти строки реализуются микросхемой D2 на рисунке 8. Каждая строка реализуется своей схемой "И", затем выходы этих схем объединяются Для построения схемы, реализующей сигнал Out2, достаточно рассмотреть строки, выделенные зеленым цветом. Эти строки реализуются микросхемой D3.

Рисунок 8. Принципиальная схема, реализующая таблицу истинности, приведенную на рисунке 7.


Многофайловые программы.

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

Это трудоЈмкая работа, которая приводит к ошибкам и, в конечном счЈте, замедляет написание и отладку программ. Намного удобнее использовать хранить исходную программу в нескольких файлах, предоставляя работу по соединению этих файлов в единую программу транслятору.

Самым простым способом соединения нескольких файлов в одну программу является использование директивы включения текстового файла в исходный текст программы INCLUDE.

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

#include <stdio.h> /*Файл стандартного ввода-вывода*/
#include <reg51.h> /*Файл описания регистров специальных функций микроконтроллера*/

... /*Остальная часть программы*/

ПриведЈм содержимое включаемых файлов:

В результате программа-транслятор формирует временный файл следующего содержания:

а затем транслирует его в загружаемый модуль.

Точно таким же образом можно использовать включение файлов и на языке программирования ASM-51:

$include (stdio.asm) ;Файл стандартного ввода-вывода
$include (reg51.inc) ;Файл описания регистров специальных функций микроконтроллера

... ;Остальная часть программы

Использование нескольких файлов позволяет разбить исходный текст программы на несколько независимых файлов, каждый из которых реализует свою независимую задачу. Удобнее всего в отдельные файлы выносить подпрограммы, так как они могут быть построены таким образом, чтобы в наименьшей степени быть связанными с основной программой. Разбираться с короткими файлами, реализующими одну или несколько связанных между собой задач намного легче, чем работать с одним большим файлом. Кроме того, различные участки программы могут быть написаны несколькими программистами, которым намного легче работать со своей программой, оформленной в виде отдельного файла.


Многомодульные программы.

Разбиение исходного текста программы на несколько файлов делает этот текст более понятным для программиста или нескольких программистов, участвующих в создании программного продукта. Однако остаЈтся нерешЈнными ещЈ несколько задач:

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

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

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

Исходный текст программы, который может быть отдельно оттранслирован, называется программным модулем.

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

Раздельная трансляция программы возможна при использовании двух программ: транслятора исходного текста программы и редактора связей.

Программа редактор связей позволяет объединять несколько объектных файлов (модулей) в один. Для объединения нескольких модулей в исполняемую программу имена всех модулей передаются в редактор связей в качестве параметров при запуске этой программы. Пример вызова редактора связей из командной строки 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

Использование нескольких модулей при написании программы увеличивает скорость трансляции и, в конечном итоге, скорость написания программы. Однако объявления переменных и имЈн подпрограмм внешних модулей загромождают исходный текст модуля. Кроме того, при использовании чужих модулей трудно объявить переменные и подпрограммы без ошибок. Поэтому обычно объявления переменных, констант и предварительные объявления подпрограмм хранят во включаемых файлах, которые называются файлами-заголовками. Правилом хорошего тона считается при разработке программного модуля сразу же написать файл-заголовок для этого модуля, который может быть использован программистами, работающими с Вашим программным модулем.


Микроконтроллеры. Область применения

Термин контроллер образовался от английского слова to control - управлять. Эти устройства могут основываться на различных принципах работы от механических или оптических устройств до электронных аналоговых или цифровых устройств. Механические устройства управления обладают низкой надежностью и высокой стоимостью по сравнению с электронными блоками управления, поэтому в дальнейшем мы такие устройства рассматривать не будем. Электронные аналоговые устройства требуют постоянной регулировки в процессе эксплуатации, что увеличивает стоимость их эксплуатации. Поэтому такие устройства к настоящему времени почти не используются. Наиболее распространенными на сегодняшний день схемами управления являются схемы, построенные на основе цифровых микросхем.

В зависимости от стоимости и габаритов устройства, которым требуется управлять, определяются и требования к контроллеру. Если объект управления занимает десятки метров по площади, как, например, автоматические телефонные станции, базовые станции сотовых систем связи или радиорелейные линии связи, то в качестве контроллеров можно использовать универсальные компьютеры. Управление при этом можно осуществлять через встроенные порты компьютера (LPT, COM, USB или ETHERNET). В такие компьютеры при включении питания заносится управляющая программа, которая и превращает универсальный компьютер в контроллер.

Использование универсального компьютера в качестве контроллера позволяет в кратчайшие сроки производить разработку новых систем связи, легко их модернизировать (путЈм простой смены программы) а также использовать готовые массовые (а значит дешЈвые) блоки.

Если же к контроллеру предъявляются особенные требования, такие, как работа в условиях тряски, расширенном диапазоне температур, воздействия агрессивных сред, то приходится использовать промышленные варианты универсальных компьютеров. Естественно, что эти компьютеры значительно дороже обычных универсальных компьютеров, но всЈ равно они позволяют экономить время разработки системы, за счЈт того, что не нужно вести разработку аппаратуры контроллера.

Контроллеры требуются не только для больших систем, но и для малогабаритных устройств таких как радиоприЈмники, радиостанции, магнитофоны или сотовые аппараты. В таких устройствах к контроллерам предъявляются жЈсткие требования по стоимости, габаритам и температурному диапазону работы. Этим требованиям не могут удовлетворить даже промышленные варианты универсального компьютера. Приходится вести разработку контроллеров на основе однокристальных ЭВМ, которые в свою очередь получили название микроконтроллеры.

Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас. В качестве примера на рисунке 1 приведены узлы автомобиля, в которых применяются микроконтроллеры.

Рисунок 1 Узлы автомобиля, в которых применяются микроконтроллеры.

Внешний вид автомобильной и носимой радиостанции, в которых тоже применяются микросхемы микроконтроллеров, показаны на рисунке 2 и рисунке 3.

Рисунок 2. Малогабаритная радиостанция с применением микроконтроллеров.

Рисунок 3. Малогабаритная радиостанция с применением микроконтроллеров.

Как выглядит носимая радиостанция внутри показывает фотография, приведЈнная на рисунке 4.

Рисунок 4. Печатная плата приЈмопередатчика носимой радиостанции.

Наиболее распространЈнными в настоящее время являются микроконтроллеры семейства MCS-51. Это семейсво поддерживается рядом фирм - производителей микросхем. Не менее распространЈнными в мире но не в России являются микроконтроллеры фирмы Motorolla. Это такие семейства как HC05, HC07, HC11 и многие другие. Пожалуй, не менее популярными микроконтроллерами являются микроконтроллеры семейства AVR фирмы Atmel. Одно перечисление семейств микроконтроллеров может занять несколько страниц текста, поэтому ограничимся приведЈнными семействами восьмиразрядных микроконтроллеров.


Микропрограммирование

Все действия микропроцессора и сигналы на его выводах определяются последовательностью микрокоманд, подаваемых на управляющие входы блока обработки сигналов. Эта последовательность микрокоманд называется микропрограммой.

При изучении принципов работы ОЗУ и ПЗУ приводились временные диаграммы, которые необходимо сформировать, для того, чтобы записать или прочитать необходимую информацию. Выберем одну из этих диаграмм:

DiagRAM.gif (4664 bytes)

Рисунок 1. Временные диграммы считывания

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

Работа любого цифрового устройства начинается с заранее заданных начальных условий. Эти начальные условия формируются специальным сигналом RESET (сброс), который формируется после подачи питания на схему. Договоримся, что сигнал сброса микропроцессора будет записывать в регистр программного счетчика PC нулевое значение. (Это условие справедливо не для всех процессоров. Например, IBM совместимые процессоры при сбросе микросхемы записывают в программный счЈтчик значение F0000h.)

Выполнение любой команды начинается с еЈ считывания из системной памяти (ОЗУ или ПЗУ). Необходимые для этого микрокоманды подаются на входы управления БОС из блока микропрограммного управления БМУ, как только снимается сигнал сброса со счЈтчика микрокоманд БМУ. При считывании однобайтной команды достаточно считать из системной памяти только код операции и выполнить эту операцию. Временная диаграмма этого процесса приведена на рисунке 2. Последовательность операций, которые необходимо выполнить микропрограмме, показана стрелочками. Для считывания следующей команды микропрограмма запускается заново.

RdIns.gif (3761 bytes)

Рисунок 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

Затем сформируем сигнал считывания. Для этого в регистр управления запишем константу 1111 1101.

 |  | Поля микрокоманды БОС
N | Описание | константа | источник A | источник B | команда | приЈмник
3) | const -> CR | 1111 1101 | 1111 | 1111 | 0011 0 0 | 1110

Теперь можно считать число с шины данных, а так как системная память в этот момент выдаЈт на нее код операции, то мы считаем именно этот код. Запишем его в регистр команд и снимем сигнал чтения с системной шины. Для этого в регистр управления запишем константу 1111 1111.

 |  | Поля микрокоманды БОС
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

Прежде, чем перейти к дальнейшему выполнению микропрограммы, увеличим содержимое счетчика команд на 1.

 |  | Поля микрокоманды БОС
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

После считывания команды еЈ необходимо декодировать. Это можно выполнить микропрограммным способом проверяя каждый бит регистра команд и осуществляя ветвление по результату проверки или включить в состав блока микропрограммного управления аппаратный дешифратор команд, который сможет осуществить ветвление микропрограммы на 256 ветвей за один такт синхронизации микропроцессора. Выберем именно этот путь. Восьмым тактом микропрограмма направляется на одну из 256 ветвей, отвечающую за выполнение считанной инструкции. Например, если была считана команда MOV A, R0, то следующая микрокоманда будет выглядеть следующим образом:

 |  | Поля микрокоманды БОС
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

В результате выполнения этой микропрограммы в программный счЈтчик будет загружен адрес, записанный во втором и третьем байтах команды безусловного перехода JMP 1234. Временная диаграмма, формируемая рассмотренной микропрограммой, приведена на рисунке 3.

RdJmp.gif (6120 bytes)

Рисунок 3. Временная диаграмма выполнения команды JMP 1234.


Классификация микропроцессоров

Что такое микроконтроллеры, микропроцессоры и сигнальные процессоры.

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

Основные направления развития современной схемотехники приведены на рисунке 1.

Рисунок 1. Место, занимаемое микропроцессорами в современной схемотехнике.

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

По мере развития цифровых микросхем их быстродействие достигло впечатляющих результатов. Наиболее быстрые из цифровых микросхем обладают скоростью переключения порядка 3..5 нс. (серия микросхем 74ALS), а внутри кристалла микросхемы, где нет больших Јмкостей нагрузки время переключения измеряется пикосекундами. Таким быстродействием обладают программируемые логические схемы и заказные БИС. В этих микросхемах алгоритм решаемой задачи заключЈн в их принципиальной схеме.

Часто для решаемой задачи не требуется такого быстродействия, каким обладают современные цифровые микросхемы. Однако за быстродействие приходится платить:

  1. Быстродействующие микросхемы потребляют значительный ток.
  2. Для решения задачи приходится использовать много микросхем, это выливается в стоимость и габариты устройства.

Напомню основные характеристики различных технологий производства цифровых микросхем.

Наибольшим быстродействием и наименьшей помехоустойчивостью обладала технология ЭСЛ (эмитерно связанная логика). Однако принципиальная еЈ особенность работы в активном режиме приводила к тому, что в процессе работы накапливались и усиливались шумы транзисторов, а это означает, что достаточно сложные алгоритмы работы принципиально будут выполняться с ошибками. Это привело к тому, что в настоящее время эта технология производства цифровых микросхем практически не применяется.

Следующий вид технологии производства цифровых микросхем - это ТТЛ (транзисторно-транзисторная логика). Современные микросхемы, производимые по этой технологии обладают быстродействием, соизмеримым с быстродействием микросхем ЭСЛ. Однако в связи с особенностями внутреннего устройства микросхемы, еЈ потребление не зависит от скорости переключения логических вентилей. Решая задачу, требующую предельного быстродействия или задачу, в которой вентили переключаются только несколько раз в секунду, микросхема потребляет одинаковый ток. Поэтому выпускается несколько различных серий микросхем, выполненных по этой технологии, обладающих различным быстродействием и, соответственно различным током потребления.

В современном мире наибольшее распространение получила технология КМОП (комплементарные транзисторы с изолированным затвором). Особенностью этой технологии является то, что микросхемы построены по двухтактной схеме. Поэтому в статическом состоянии если верхний транзистор открыт, то закрыт нижний транзистор и наоборот. Это означает, что ток через вентиль не протекает ни в состоянии логической единицы, ни в состоянии логического нуля. То есть в состоянии покоя через микросхему протекают только токи утечки транзисторов и микросхема ток практически не потребляет.

Потребление микросхем КМОП возрастает только при увеличении скорости переключения логических вентилей. На предельных скоростях работы микросхемы еЈ потребление сравнивается и даже может превосходить потребление микросхем, выполненных по ТТЛ технологии.

Итак, первую задачу (потреблять ток в зависимости от требующегося в данный момент быстродействия) решает применение технологии КМОП (например микросхемы серий 1564, 74HC, 74AHC, универсальные процессоры AMD или PENTIUM). Именно поэтому в настоящее время подавляющее большинство микросхем выпускается именно по этой технологии.

Вторую задачу (уменьшение стоимости и габаритов) решают несколькими способами. Для жЈсткой логики это разработка специализированных БИС. Использование специализированных БИС позволяет уменьшить габариты устройства, но стоимость его снижается только при крупносерийном производстве. Для среднего и малого объЈмов производства такое решение неприемлемо. Тем не менее для крупносерийного производства альтернативе этой технологии нет, так как при этом реализуется наименьшая стоимость микросхем.

ЕщЈ одним решением уменьшения габаритов и стоимости устройства является применение программируемых логических схем (ПЛИС). В этих микросхемах присутствуют как бы два слоя. Один слой - это набор цифровых модулей, способных решить практически любую задачу. Второй слой хранит таблицу связей между модулями первого слоя. Эту таблицу можно программировать, и тем самым менять схему устройства, а значит и решаемую микросхемой задачу. Это направление активно развивается в настоящее время, но оно не входит в рамки рассмотрения данного курса.

Третий способ решения поставленной задачи заключается в том, что можно заставить одно очень быстродействующее устройство последовательно решать различные задачи, изменяя свою структуру во времени. Это микропроцессоры. В микропроцессорах возможен обмен предельного быстродействия на сложность реализуемого устройства. Именно по этой причине стараются максимально увеличить быстродействие микропроцессоров - это позволяет реализовывать все более сложные устройства в одном и том же объеме. Более того! В одном процессоре можно реализовать несколько устройств одновременно! Именно это решение задачи и рассматривается в данном учебном курсе.

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

  • универсальные микропроцессоры
  • микроконтроллеры
  • сигнальные микропроцессоры

Универсальные микропроцессоры используются для построения вычислительных машин. В них используются самые передовые решения по повышению быстродействия, не обращая особого внимания на габариты, стоимость и потребляемую энергию. В технике связи компьютеры используются для управления системами связи или устройствами связи, обладающими большими габаритами и стоимостью. Такие компьютеры, в которых работает только одна программа - программа управления, называются контроллерами. Слово контроллер образовалось от английского слова to control - управлять.

Микроконтроллеры используются для управления малогабаритными и дешЈвыми устройствами связи, такими как радиостанции или сотовые аппараты. Раньше эти микросхемы называли по их внутреннему устройству однокристальными микроЭВМ. В микроконтроллерах, в отличие от универсальных микропроцессоров, максимальное внимание уделяется именно габаритам, стоимости и потребляемой энергии.

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


Блок обработки сигналов микропроцессора

Принципы работы микропроцессора.

В настоящее время наметилось два направления развития микропроцессоров:

  • RISC процессоры (процессоры с сокращЈнным набором команд)
  • CISC процессоры (процессоры с полным набором команд)

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

В процессорах с сокращЈнным набором команд декодирование и исполнение команды производится аппаратурно, поэтому количество команд ограниченно минимальным набором. В этих процессорах команда и микрокоманда совпадают. Преимуществом этого типа процессоров является то, что команда может быть в принципе выполнена за один такт (не требуется выполнение микропрограммы), однако для выполнения тех же действий, которые выполняет команда CISC процессора, требуется выполнение целой программы.

В большинстве случаев быстродействие RISC процессоров выше чем CISC процессоров, однако при выборе процессора нужно учитывать все параметры в целом, т.к. тактовая частота может оказаться значительно ниже по сравнению с CISC процессором (особенно если в нЈм применяются специальные меры по повышению производительности), разрядность команды может оказаться выше чем у CISC процессора (что чаще всего и бывает). В результате общий объЈм исполняемой программы для RISC процессора превысит объЈм подобной программы для CISC процессора.

В качестве примера рассмотрим устройство процессора с полным набором команд. Здесь будет рассматриваться упрощЈнная модель процессора для облегчения понимания работы. CISC микропроцессор состоит из двух частей:

  • Блок обработки сигналов;
  • Блок микропрограммного управления.

Блок обработки сигналов микропроцессора.

Основным принципом работы любого цифрового устройства с памятью, в том числе и микропроцессора, является наличие цепи синхронизации. Этот сигнал, как и цепь питания, подводится к любому регистру цифрового устройства.

Блок обработки сигналов предназначен для считывания команд из системной памяти и выполнения считанных команд. Эти действия он осуществляет под управлением блока микропрограммного управления, который формирует последовательность микрокоманд, необходимую для выполнения команды. Схема одного из вариантов построения блока обработки сигналов приведена на рисунке 1.

Рисунок 1. Блок обработки сигналов.

В этой схеме явно просматривается, что отдельные биты микрокоманды (показанной внизу схемы) управляют различными блоками БОС, поэтому их можно рассматривать независимо друг от друга. Такие группы бит называются полями микрокоманды и составляют формат этой микрокоманды. Кроме бит, управляющих блоком обработки сигналов есть биты, управляющие блоком микропрограммного управления. Формат микрокоманды рассматриваемого процессора приведЈн на рисунке 3. Результат выполнения микрокоманды записывается по сигналу общей синхронизации CLK.

Для хранения и декодирования выполняемой команды выделим восьмиразрядный регистр, который назовЈм RI.

Для реализации более простой системы команд выберем аккумуляторный процессор. Соответственно необходимо один из регистров выделить в качестве аккумулятора ACC.

Так как мы выбрали для примера восьмиразрядный микропроцессор, то и все регистры в этом процессоре восьмиразрядные. Максимальное число, которое можно записать в такой регистр - 255, но для большинства программ такого объЈма памяти недостаточно. В приведЈнной на рисунке 1 схеме для того, чтобы получить 16-ти разрядный адрес используется два 8-ми разрядных регистра адреса. Теперь максимальное число, которое можно записать в этих двух регистрах будет 65535, что вполне достаточно для записи программ и обрабатываемых ими данных. Для того, чтобы различать регистр старшего и младшего байта адреса обозначим их как PCH - старший байт и PCL- младший байт. Это позволяет при помощи восьмиразрядного АЛУ формировать 16-ти разрядный адрес.

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

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

Рисунок 2. Формат регистра управления (CR).

Блок микропрограммного управления

Блок микропрограммного управления предназначен для формирования последовательности микрокоманд блока обработки сигналов. В простейшем случае его можно построить на счетчике с возможностью предзаписи и ПЗУ. Схема такого блока приведена на рисунке 3.

Рисунок 3. Блок микропрограммного управления.

В этой схеме адрес очередной микрокоманды формирует двоичный счЈтчик. Если требуется осуществить безусловный или условный переход, то новый адрес записывается из ПЗУ в этот счЈтчик как в обычный параллельный регистр по сигналу параллельной записи V. Переход к следующему адресу микрокоманды производится по сигналу общей синхронизации CLK.

Рисунок 4. Формат микрокоманды процессора.


Мультиплексоры

Мультиплексоры и демультиплексоры

Мультиплексорами называются устройства, которые позволяют подключать несколько входов к одному выходу. Демультиплексорами называются устройства, которые позволяют подключать один вход к нескольким выходам. В простейшем случае такую коммутацию можно осуществить при помощи ключей:

Рисунок 1. Коммутатор (мультиплексор), собранный на ключах.

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

Рассмотрим таблицу истинности логического элемента "И-НЕ":

Теперь один из входов элемента будем рассматривать как информационный вход электронного ключа, а другой вход - как управляющий. По таблице истинности отчетливо видно, что пока на управляющий вход Y подан логический уровень '0' сигнал со входа X на выход Out не проходит. При подаче на управляющий вход Y логической '1', сигнал, поступающий на вход X, поступает на выход Out. То есть логический элемент "И" можно использовать в качестве электронного ключа. При этом не важно какой из входов элемента "И" будет использоваться в качестве управляющего входа, а какой - в качестве информационного. ОстаЈтся только объединить выходы элеметов "И" на один выход. Это делается при помощи элемента "ИЛИ". Такая схема коммутатора приведена на рисунке 2.

Рисунок 2. Принципиальная схема мультиплексора, выполненая на логических элементах.

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

Рисунок 2. Принципиальная схема мультиплексора, управляемого двоичным кодом.

Мультиплексор изображается на принципиальных схемах как показано на рисунке 3.

Рисунок 3. Обозначение мультиплексора на принципиальных схемах.

Задача передачи сигнала с одного входа микросхемы на один из нескольких выходов называется демультиплексированием. Демультиплексор можно построить на основе точно таких же схем логического “И” существенным отличием от мультиплексора является возможность объединения нескольких входов в один без дополнительных схем. Для выбора конкретного выхода демультиплексора, как и в мультиплексоре, используется двоичный дешифратор. Cхема демультиплексора приведена на следующем рисунке:

Рисунок 4. Принципиальная схема демультиплексора, управляемого двоичным кодом.


Отладка программ.

После того, как программные модули были успешно оттранслированы, размещены по конкретным адресам и связаны между собой, для отладки программы можно воспользоваться любым из следующих методов:

  • внутрисхемным эмулятором
  • встроенным программным отладчиком
  • внешним программным отладчиком
  • отлаживаемым устройством с записанным в память программ двоичным кодом программы

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

Рисунок 1. Пример системы отладки программного обеспечения для микроконтроллеров.

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

При использовании интегрированной среды программирования предоставляется удобный интерфейс, позволяющий легко отлаживать разрабатываемую программу. В настоящее время стандартом де-факто стал интерфейс, похожий на программную оболочку Visual C. Пример внешнего вида такой программной оболочки приведЈн на рисунке 2.

Рисунок 2. Пример внешнего вида отладчика интегрированной системы отладки программного обеспечения.

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

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

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

При написании достаточно простых программ иногда для отладки программ используют только этот последний этап тестирования. Однако обнаружение, поиск и устранение ошибок при использовании только этого метода очень трудоЈмок! Это то же самое, что пытаться настроить аппаратуру без использования приборов!

Способы отладки программ.

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

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

Для отладки программ обычно применяют три способа:

  1. Пошаговая отладка программ с заходом в подпрограммы;
  2. Пошаговая отладка программ с выполнением подпрограммы как одного оператора;
  3. Выполнение программы до точки останова.

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

Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.

Если в программе существует достаточно большой участок программы, уже отлаженный ранее, то его можно выполнить, не контролируя переменные, на которые он воздействует. Использование точек останова позволяет пропускать уже отлаженную часть программы. Точка останова устанавливается в местах, где необходимо проверить содержимое переменных или просто проконтролировать, передаЈтся ли управление данному оператору.

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

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

Практически все отладчики позволяют проконтролировать содержимое рабочих регистров текущего банка.


Подпрограммы

Применение подпрограмм при программировании.

При написании программ часто при реализации алгоритма работы устройства приходится повторять одни и те же операторы (например операторы, работающие с параллельным или последовательным портом). Было бы неплохо использовать один и тот же участок кода, вместо того, чтобы повторять одни и те же операторы несколько раз.

Участок программы, к которому можно обращаться из различных мест программы для выполнения некоторых действий называется подпрограммой.

Проблема, с которой приходится сталкиваться при многократном использовании участков кодов, это в какое место памяти программ возвращаться после завершения подпрограммы? Обращение к подпрограмме производится из нескольких мест основной программы:

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

Для обращения к подпрограмме и возврата из неЈ в систему команд микропроцессоров вводят специальные команды. В микроконтроллерах семейства MCS-51 это команды LCALL, ACALL для вызова подпрограммы и команда RET для возврата из подпрограммы. Пример использования подпрограммы:

  ...
  MOV A,#56
  CALL PeredatByte
  ...
  MOV A,#37
  CALL PeredatByte
  ...

;********************************************
;Подпрограмма передачи байта
;через последовательный порт
;********************************************
PeredatByte:
  JB TI,$       ;Если предыдущий байт передан
  MOV SBUF,G_Per    ;то передать очередной байт
  RET

Внимание! Ни в коем случае нельзя попадать в подпрограмму любым способом кроме команды вызова подпрограммы CALL! В противном случае команда возврата из подпрограммы передаст управление случайному адресу! По этому адресу могут быть расположены данные, которые в этом случае будут интерпретированы как программа, или обратиться к внешней памяти, откуда будут считываться случайные числа.

Очень часто требуется из одной подпрограммы обращаться к другой подпрограмме. Такое обращение к подпрограмме называется вложенным. Количество вложенных подпрограмм называется уровнем вложенности подпрограмм. Максимально допустимый уровень вложенности подпрограмм определяется количеством ячеек памяти, предназначенных для хранения адресов возврата из подпрограмм.

Ячейки памяти, в которых хранятся адреса возврата из подпрограмм называются стеком. Логически эти ячейки памяти организованы так, чтобы считывание последнего записанного адреса производилось первым, а первого записанного адреса производилось последним. Такая логическая организация формируется специальным счЈтчиком. Этот счЈтчик называется указателем стека SP. Ячейка памяти, в которую в данный момент может быть записан адрес возврата из подпрограммы, называется вершиной стека. Количество ячеек памяти, предназначенных для организации стека, называется глубиной стека. Последняя ячейка памяти, в которую можно производить запись называется дном стека. Логическая организация стека приведена на следующем рисунке:

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

Например в микроконтроллерах семейства MCS-51 при занесении информации в стек содержимое указателя стека увеличивается (стек растЈт вверх), поэтому стек размещается в самой верхней части памяти данных. Для того, чтобы установить глубину стека 28 байт, необходимо вычесть из адреса максимальной ячейки внутренней памяти микроконтроллера глубину стека и записать полученное значение в указатель стека SP:

Кроме содержимого программного счЈтчика часто требуется запоминать содержимое внутренних регистров и флагов процессора, локальных переменных подпрограммы. Стек оказался удобным средством и для этой задачи. Сохранение локальных переменных в стеке позволило осуществлять вызов подпрограммы самой из себя (реализовывать рекурсивные алгоритмы). Это привело к введению в систему команд специальных команд работы со стеком. В микроконтроллерах семейства MCS-51 это команды PUSH и POP. Использование этих команд показывается на следующем примере:


Принципы построения параллельного порта.

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

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

В зависимости от направления передачи данных параллельные порты называются портами ввода, вывода или портами ввода вывода.

Структурная схема порта ввода приведена на рис 1.

PortIn.gif (2913 bytes)

Рис. 1. Структурная схема порта ввода.

 В качестве порта ввода может быть использована схема с открытым коллектором или с третьим (Z) состоянием. В настоящее время обычно используются схемы с третьим состоянием. Параллельное соединение таких схем называется шинным формирователем. Из порта ввода возможно только чтение информации.

Выход шинного формирователя подключается к внутренней шине. Значение сигнала с внешнего вывода порта считывается по сигналу "RD".

Для отображения этого шинного формирователя только в одну ячейку памяти адресного пространства микропроцессорного устройства в составе порта ввода-вывода всегда присутствует дешифратор адреса.

Так как с точки зрения программиста эта ячейка памяти ничем не отличается от регистра данных порта вывода, то по аналогии она называется регистром данных порта ввода.

Структурная схема порта вывода приведена на рис 2.

PortOut.gif (2701 bytes)

Рис. 2. Структурная схема порта вывода.

В качестве порта вывода может быть использован параллельный регистр. В порт вывода возможна только запись.

Данные с внутренней шины микроконтроллера записываются в регистр по сигналу "WR". Выходы "Q" регистра могут быть использованы как источники логических уровней для управления внешними устройствами.

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

Так как из порта ввода возможно только чтение, а в порт вывода возможна только запись, то для них обычно отводится один и тот же адрес в адресном пространстве памяти микропроцессора.

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

IOPort.gif (1665 bytes)

Рис. 3. Структурная схема параллельного порта ввода-вывода.

В некоторых микропроцессорах для портов ввода вывода выделяется отдельное адресное пространство. В этом случае для записи в порт и для чтения из порта используются отдельные сигналы чтения и записи. Чаще всего они называются IOWR# и IORD#.

Параллельные порты, предназначенные для обмена данными между компьютерами, или компьютером и принтером, устроены несколько иначе. Основным отличием обмена данных между компьютерами или контроллерами от обмена данными между компьютером и простым внешним устройством является большой объЈм передаваемых данных. В этом случае недостаточно выдачи на выход порта одного или даже нескольких байт информации, поэтому приходится передавать данные последовательно байт за байтом через один и тот же параллельный порт. Байты необходимо каким либо образом отличать друг от друга, поэтому вводится специальный сигнал синхронизации CLK, который позволяет отличать один байт от другого. Для формирования такого сигнала можно воспользоваться вторым параллельным портом, и получить его программным способом, но обычно этот сигнал формируется аппаратно из сигнала WR# при записи очередного байта в параллельный порт вывода. Временная диаграмма обмена данными через параллельный порт приведена на рисунке 4.

DiagParP.gif (2742 bytes)

Рис. 4. Временная диаграмма работы параллельного порта.

В лекции приведены только основы работы параллельного порта. Кому интересно познакомиться с особенностями работы параллельных портов может обратиться к специализированной литературе.

Далеко не полную информацию по LPT порту универсального компьютера можно посмотреть здесь.


Язык программирования ASM-51

Языки программирования для микроконтроллеров.

Программирование для микроконтроллеров как и программирование для универсальных компьютеров прошло большой путь развития от программирования в машинных кодах до применения современных интегрированных систем написания программ, отладки и программирования микроконтроллеров. В настоящее время исходный текст программы пишется на одном из языков программирования.

Процесс преобразования операторов исходного языка программирования в машинные коды микропроцессора называется трансляцией исходного текста. В настоящее время ручная трансляция программ практически не используется. Трансляция производится специальными программами- трансляторами.

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

Рисунок 1. Классификация программ-трансляторов языков программирования.

Сами языки программирования в свою очередь делятся на две группы:

  1. языки программирования "высокого" уровня
  2. языки программирования "низкого" уровня.

К языкам программирования "низкого" уровня относятся языки программирования в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.

Языки программирования "высокого" уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки "высокого" уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы - трасляторы для соответствующего процессора.)

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

В тех случаях, когда объЈм ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемлеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т.к. испортить можно всЈ!).

Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объЈм памяти программ (несколько десятков килобайт). Увеличение объЈма программы связано с несколькими факторами:

  1. Язык программирования расчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче (исключив не нужные в данном конкретном случае проверки или защиты).
  2. Программист не видит к чему приводит использование тех или других операторов языка программирования, поэтому может выбирать операторы, не оптимальные как с точки зрения длины машинного кода программы, так и с точки зрения быстродействия программы.
  3. Программист не использует подпрограммы там, где они могли бы сократить объЈм программы, так как на языке программирования высокого уровня это всего один или несколько операторов.

Первый из этих пунктов постепенно утрачивает своЈ значение с появлением всЈ более совершенных трансляторов. Третий пункт тоже решается тем же путЈм при применении различных видов оптимизаторов, входящих в состав компилятора. Однако в большинстве случаев оптимизатор не может определить одинаковые действия, если они отличаются хотя бы одной командой. Кроме того, оптимизатор работает только в пределах одного модуля!

Для программирования микроконтроллеров используются только компиляторы, поэтому рассмотрим подробнее виды этих трансляторов.

Виды компиляторов

Компиляторы бывают оценочные и профессиональные.

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

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

Оценочные компиляторы обычно предлагаются бесплатно фирмами - производителями микроконтроллеров. Только фирма Intel предложила в своЈ время профессиональный пакет разработки программ - язык программирования PLM-51 в состав которого входит профессиональный язык программирования ASM-51.

Профессиональные компиляторы разрабатываются и продаются отдельными фирмами. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм как FRANCLIN, IAR, KEIL. В состав современных средств написания и отладки программ для микроконтроллеров обычно входят эмуляторы процессоров или отладочные платы, текстовый редактор, компиляторы языка высокого уровня (чаще всего "C") и ассемблера, редактор связей и загрузчик программы в отладочную плату. Все программы обычно объединены интегрированной средой разработки программного проекта, позволяющую поддерживать один или несколько программных проектов.


Статические ОЗУ

Статические оперативные запоминающие устройства (ОЗУ)

В радиоаппаратуре часто требуется хранение временной информации, значение которой не важно при включении устройства. Такую память можно было бы построить на микросхемах EEPROM или FLASH -памяти, но, к сожалению, эти микросхемы дороги, обладают малым количеством перезаписей и чрезвычайно низким быстродействием при считывании и особенно записи информации. Для хранения временной информации можно воспользоваться параллельными регистрами. Так как запоминаемые слова не нужны одновременно, то можно воспользоваться механизмом адресации, который применяется в ПЗУ.

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

В микросхемах ОЗУ присутствуют две операции: операция записи и операция чтения. Для записи и чтения информации можно использовать различные шины данных (как это делается в сигнальных процессорах), но чаще используется одна и та же шина данных. Это позволяет экономить выводы микросхем, подключаемых к этой шине и легко осуществлять коммутацию сигналов между различными устройствами.

Схема статического ОЗУ приведена на рисунке 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.


Регистры

Регистром называется последовательное или параллельное соединение триггеров. Регистры обычно строятся на основе D триггеров. При этом для построения регистров могут использоваться как универсальные D триггеры, так и триггеры-защелки. При использовании для построения параллельного регистра триггеров-защелок регистр называется регистр-защелка. Параллельный регистр служит для запоминания многоразрядного двоичного слова. Количество триггеров, входящее в состав параллельного регистра определяет его разрядность. Схема четырЈхразрядного параллельного регистра приведена на рисунке 1, а его обозначение на принципиальных схемах на рисунке 2.

Рисунок 1. Схема параллельного регистра.

Рисунок 2. Обозначение параллельного регистра на принципиальных схемах.

При записи информации в параллельный регистр все биты (двоичные разряды) записываются одновременно.

Последовательный регистр (регистр сдвига) обычно служит для преобразования последовательного кода в параллельный и наоборот. Схема регистра, осуществляющего преобразование последовательного кода в параллельный, приведена на рисунке 3, а его изображение на принципиальных схемах - на рисунке 4.

Рисунок 3. Схема последовательного регистра.

Рисунок 4. Обозначение последовательного регистра на принципиальных схемах.

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

Рисунок 5. Схема универсального регистра.

Рисунок 6. Обозначение универсального регистра на принципиальных схемах.


Постоянные запоминающие устройства

Очень часто в различных применениях требуется хранение информации, которая не изменяется в процессе эксплуатации устройства. Это такая информация как программы в микроконтроллерах, начальные загрузчики и 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 мс. Схема управления для таких микросхем получилась сложная, поэтому наметилось два направления развития этих микросхем:

  1. ЕСППЗУ
  2. FLASH -ПЗУ

Электрически стираемые ППЗУ дороже и меньше по объему, но зато позволяют перезаписывать каждую ячейку памяти отдельно. В результате эти микросхемы обладают максимальным количеством циклов записи - стирания. Область применения электрически стираемых ПЗУ - хранение данных, которые не должны стираться при выключении питания. К таким микросхемам относятся отечественные микросхемы 573РР3, 558РР и зарубежные микросхемы серии 28cXX. Электрически стираемые ПЗУ обозначаются на схемах как показано на рисунке 9.

Рисунок 9. Обозначение электрически стираемого постоянного запоминающего устройства на принципиальных схемах.

В последнее время наметилась тенденция уменьшения габаритов ЭСППЗУ за счет уменьшения количества внешних ножек микросхем. Для этого адрес и данные передаются в микросхему и из микросхемы через последовательный порт. При этом используются два вида последовательных портов - SPI порт и I2C порт (микросхемы 93сXX и 24cXX серий соответственно). Зарубежной серии 24cXX соответствует отечественная серия микросхем 558РРX.

FLASH - ПЗУ отличаются от ЭСППЗУ тем, что стирание производится не каждой ячейки отдельно, а всей микросхемы в целом или блока запоминающей матрицы этой микросхемы, как это делалось в РПЗУ.

Рисунок 10. Обозначение FLASH памяти на принципиальных схемах.

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

Рисунок 11. Временная диаграмма чтения информации из ПЗУ.

На рисунке 11 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке RD - это сигнал чтения, A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние), D - выходная информация, считанная из выбранной ячейки ПЗУ.


Принципы построения последовательного порта.

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

  1. синхронные последовательные порты;
  2. асинхронные последовательные порты.

Синхронные последовательные порты

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

DiagSerP.gif (4407 bytes)

Рисунок 1. Временная диаграмма передачи одного кадра двоичной информации по последовательному порту.

Временная диаграмма, приведЈнная на рисунке 1, применяется в синхронных последовательных портах, которые используются чаще всего в сигнальных процессорах для обмена информацией с кодеками речи, аналого-цифровыми и цифро-аналоговыми преобразователями. На приведЈнной временной диаграмме показаны два сигнала синхронизации: сигнал тактовой синхронизации CLK и сигнал кадровой синхронизации FS. Сигнал кадровой синхронизации формируется аппаратно из сигнала WR# при записи очередного байта в параллельный порт вывода. Полярность сигналов синхронизации зависит от конкретного типа применяемых микросхем, поэтому в большинстве сигнальных процессоров возможна настройка полярности сигналов синхронизации.

УпрощЈнная схема синхронного последовательного порта приведена на рисунке 2. На этой схеме видно, что в состав последовательного порта входит параллельный порт, который позволяет подключаться к системной шине микропроцессора. Для преобразования параллельного кода, который поступает из системной шины в последовательный, используется сдвиговый регистр. При обращении центрального процессора к последовательному порту вырабатывается сигнал записи в последовательный порт, который подаЈтся на вход параллельной записи V универсального регистра. Этот же сигнал используется в качестве сигнала кадровой синхронизации FS. Сигнал тактовой синхронизации CLK, вырабатываемый отдельным генератором, подаЈтся на вход последовательного сдвига C универсального регистра порта.

PoslPort.gif (3025 bytes)

Рисунок 2. УпрощЈнная схема синхронного последовательного порта

Количество передаваемых в одном кадре бит может меняться от восьми до тридцатидвух. В качестве примера использования синхронного последовательного порта на рисунке 3 приведена схема подключения аналого-цифрового преобразователя фирмы Analog Devices к синхронному последовательному порту сигнального процессора той же фирмы.

SxrSPort.gif (3869 bytes)

Рисунок 3. Схема подключения кодека к синхронному последовательному порту.

В рассмотренной схеме синхронного последовательного порта на приЈмном конце необходимо подсчитывать количество тактовых импульсов, прошедшее после импульса кадровой синхронизации. Кроме того, в таком синхронном последовательном порту информация передаЈтся непрерывно, что, конечно, удобно для устройств с непрерывным потоком информации, как, например, в кодеках речи. Но существуют устройства, к которым необходимо обращаться только периодически, как, например, синтезаторы частоты, микросхемы приЈмников, блоков цветности телевизоров, микросхем памяти данных и многие другие устройства. В этих случаях используются другие виды синхронных последовательных портов такие как SPI порт и I2C шина. Временная диаграмма SPI интерфейса приведена на рисунке 4.

DiagSPI.gif (4889 bytes)

Рисунок 4. Временная диаграмма SPI интерфейса.

Основное отличие этого интерфейса от приведЈнного выше, заключается в том, что сигнал тактовой синхронизации передаЈтся только в момент действия импульса кадровой синхронизации. Активный уровень сигнала кадровой синхронизации длится до окончания передачи последнего бита в передаваемом кадре. По одним и тем же линиям передачи данных MISO (вход для главного, выход для ведомого) и MOSI (выход для главного, вход для ведомого) может передаваться информация к совершенно различным микросхемам. Выбор, для какой из микросхем предназначена информация, производится сигналом SS (выбор ведомого). В SPI интерфейсе в приЈмнике не требуется счЈтчик тактовых импульсов. Запись принятой информации производится по окончанию кадрового импульса.

Если в устройстве используется несколько микросхем, то количество линий выбора ведомого становится значительным, поэтому в таких случаях используется ещЈ один вид синхронного последовательного интерфейса: I2C шина. Временная диаграмма этого интерфейса приведена на рисунке 5. В I2C шине приЈм и передача данных, а также передача адреса микросхемы и адреса регистра внутри микросхемы, к которому осуществляется обращение, производится по одному и тому же проводу. Для подключения к этому проводу используются микросхемы с открытым коллектором. Нагрузкой для всех микросхем, подключенных к линии SDA служит внешний резистор. Естественно, что скорость передачи данных по такому порту будет ниже, по сравнению с SPI портом. Тактовая синхронизация в I2C шине передаЈтся по линии SCL. Начало работы с микросхемой обозначается особой комбинацией сигналов SDA и SCL, которая называется условием старта. Эта же комбинация одновременно осуществляет кадровую синхронизацию. Завершение работы с микросхемой обозначается ещЈ одной комбинацией сигналов SDA и SCL. В качестве примера микросхем, использующих интерфейс I2C можно назвать микросхемы EEPROM серии 24сXX.

DiagI2C.gif (4902 bytes)

Рисунок 5. Временная диаграмма I2C интерфейса.

Асинхронные последовательные порты

Рассмотренные синхронные последовательные порты позволяют достигнуть больших скоростей передачи данных, но провод, по которому ведЈтся передача синхросигнала, практически не несЈт информации. Такой сигнал можно было бы сформировать и на приЈмном конце линии передачи, если заранее договориться о скорости передачи. Единственная проблема - это то, что невозможно построить два абсолютно одинаковых генератора. Генераторы необходимо синхронизировать. Для синхронизации внутренних генераторов используется особое условие начала асинхронной передачи: старт. ВсЈ время, пока не ведЈтся передача информации, на линии присутствует стоп-сигнал единичного уровня. Перед началом передачи каждого байта передаЈтся старт-бит, сигнализирующий приемнику о начале посылки данных, за которым следуют информационные биты. Стартовый бит всегда передаЈтся нулевым уровнем с длительностью, равной длительности информационных бит. В некоторых случаях после передачи информационных бит может передаваться, бит паритета (четности). Завершается передача данных стоп-сигналом. Минимальная длительность стопового сигнала должна быть 1,5 длительности информационных бит, но обычно используют паузу между соседними пакетами данных две длительности информационного бита. Временная диаграмма передаваемых сигналов при асинхронной передаче приведена на рисунке 6.

DiagUART.gif (1878 bytes)

Рисунок 6. Временная диаграмма передаваемых сигналов при асинхронной передаче.

Продолжительность стопового бита не ограничена. Это позволяет регулировать скорость передачи в зависимости от скорости поступления информации.

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


Структурное программирование.

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

Программирование для микроконтроллеров во многом повторяет тот же путь. Переход от этапа к этапу зависит от доступных внутренних ресурсов микроконтроллеров. ЕщЈ несколько лет назад использование языков высокого уровня было невозможно из-за малого объЈма внутренней памяти программ. (В дешЈвых моделях микроконтроллеров эта ситуация сохраняется до сих пор.) В настоящее время с появлением микроконтроллеров и сигнальных процессоров с объЈмом внутренней памяти в несколько десятков килобайт появляется возможность объектного проектирования.

Применение структурного программирования позволяет увеличить скорость написания программ и облегчить отладку написанной программы. Структурное программирование возможно и на языках программирования assembler, где не предусмотрено структурных операторов, подобных структурным операторам языков программирования C, PASCAL, PL/M.

В настоящее время существует два способа написания программ: снизу вверх и сверху вниз. При написании программы снизу вверх приступить к отладке программы невозможно, не написав полностью всю программу. При написании программы сверху вниз на любом этапе написания программы она может быть оттранслирована и выполнена, при этом можно отследить все алгоритмические действия программы, написанные к этому времени. Процесс написания программы не отличается от процесса создания алгоритма. Более того, эти этапы создания программы можно объединить. Выполняемое алгоритмическое действие отображается в названии подпрограммы. Например:

ProchitatPort ;Прочитать порт

VklychitIndikator ;Включить индикатор

Основная идея структурного программирования заключаются в том, что существует только четыре структурных оператора. Используя эти структурные операторы можно построить сколь угодно сложную программу.

Первый структурный оператор называется линейная цепочка операторов. Любая задача может быть разбита на несколько подзадач. Выполнение подзадач может быть поручено подпрограмме, в названии которой можно (и нужно) отразить подзадачу, которую должна решать эта подпрограмма. На момент написания алгоритма (и программы) верхнего уровня нас не интересует, как будет решаться эта задача, поэтому вместо настоящей подпрограммы поставим подпрограмму-заглушку.

Алгоритмическое изображение оператора

Язык программирования С

Язык программирования asm-51

Второй структурный оператор называется условный оператор. Достаточно часто одна или другая задачи должны исполняться в зависимости от определЈнного условия, которое зависит от результатов выполнения предыдущей программы или от внешних устройств. Каждая из таких задач называется плечом условного оператора.

Алгоритмическое изображение оператора

Язык программирования С

Язык программирования asm-51

Условный оператор может использоваться в неполном варианте, когда одно из плеч алгоритма отсутствует:

Алгоритмическое изображение оператора

Язык программирования С

Язык программирования asm-51

Третий структурный оператор - это оператор цикла с проверкой условия после тела цикла. Такой оператор легко реализуется на языке программирования ассемблер при помощи команды условного или безусловного перехода. Отличие от условного оператора заключается в том, что передача управления осуществляется не вперЈд, а назад. На языках программирования высокого уровня такой оператор входит в состав языка (оператор do..while в языке программирования C или оператор repeat..until в языке программирования PASCAL).

Алгоритмическое изображение оператора

Язык программирования С

Язык программирования asm-51

ЧетвЈртый структурный оператор - это оператор цикла с проверкой условия до тела цикла. В отличие от предыдущего оператора тело цикла в этом операторе может ни разу не выполниться, если условие цикла сразу же выполнено. Этот оператор как и условный оператор невозможно реализовать на одной машинной команде.

Алгоритмическое изображение оператора

Язык программирования С

Язык программирования asm-51


Сумматоры

Построение двоичных сумматоров обычно начинается с сумматора по модулю 2. На рисунке 1 приведена таблица истинности этого сумматора.

Рисунок 1. Таблица истинности сумматора по модулю 2.

В соответствии с принципами построения произвольной таблицы истинности получим схему сумматора по модулю 2. Эта схема приведена на рисунке 2.

Рисунок 2. Принципиальная схема, реализующая таблицу истинности сумматора по модулю 2.

Сумматор по модулю 2 (схема исключающего "ИЛИ") изображается на схемах как показано на рисунке 3.

Рисунок 3 Изображение схемы, выполняющей логическую функцию исключающего "ИЛИ".

Сумматор по модулю 2 выполняет суммирование без учЈта переноса. В обычном двоичном сумматоре требуется учитывать перенос, поэтому требуются схемы, позволяющие формировать перенос в следующий двоичный разряд. Таблица истинности такой схемы, называемой полусумматором приведена на рисунке 4.

Рисунок 4. Таблица истинности полусумматора.

В соответствии с принципами построения произвольной таблицы истинности получим схему полусумматора. Эта схема приведена на рисунке 5.

Рисунок 5. Принципиальная схема, реализующая таблицу истинности полусумматора.

Полусумматор изображается на схемах как показано на рисунке 6.

Рисунок 6 Изображение полусумматора на схемах.

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

Рисунок 7. Таблица истинности полного двоичного одноразрядного сумматора.

В соответствии с принципами построения схемы по произвольной таблице истинности истинности получим схему полного двоичного одноразрядного сумматора. Эта схема приведена на рисунке 8.

Рисунок 8. Принципиальная схема, реализующая таблицу истинности полного двоичного одноразрядного сумматора.

Полный двоичный одноразрядный сумматор изображается на схемах как показано на рисунке 9.

Рисунок 9 Изображение полного двоичного одноразрядного сумматора на схемах.

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

Рисунок 10. Принципиальная схема многоразрядного двоичного сумматора.

Полный двоичный многоразрядный сумматор изображается на схемах как показано на рисунке 11.

Рисунок 11. Изображение полного двоичного многоразрядного сумматора на схемах.

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


Системная шина процессора.

Системная шина процессора предназначена для обмена информацией микропроцессора с любыми внутренними устройствами микропроцессорной системы (контроллера или компьютера). В качестве обязательных устройств, которые входят в состав любой микропроцессорной системы, можно назвать ОЗУ, ПЗУ, таймер и порты ввода-вывода. Структурная схема простейшего микропроцессорного устройства приведена на рисунке 1.

В состав системной шины в зависимости от типа процессора входит одна или несколько шин адреса, одна или несколько шин данных и шина управления. Несколько шин данных и адреса применяется для увеличения производительности процессора и используется только в сигнальных процессорах. В универсальных процессорах и контроллерах обычно применяется одна шина адреса и одна шина данных.

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

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

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

Рисунок 1. Структурная схема подключения микропроцессорных устройств к системной шине.

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

Адресное пространство микропроцессорного устройства.

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

Для шестнадцатиразрядной шины это будет число 65535 (64K). Адресное пространство этой шины и распределение памяти микропроцессорной системы, изображЈнной на рисунке 1, приведено на рисунке 2, а распределение памяти микропроцессорной системы, изображЈнной на рисунке 1, приведено на рисунке 3.

Рисунок 2. Адресное пространство шестнадцатиразрядной шины адреса.

Рисунок 3. Распределение памяти микропроцессора с шестнадцатиразрядной шиной адреса.

Микропроцессоры после включения питания и выполнения процедуры сброса всегда начинают выполнение программы с определЈнного адреса, чаще всего нулевого. Однако есть и исключения. Например процессоры, на основе которых строятся универсальные компьютеры IBM PC или Macintosh стартуют не с нулевого адреса. Программа должна храниться в памяти, которая не стирается при выключении питания, то есть в ПЗУ.

Выберем для построения микропроцессорной системы микросхему ПЗУ объЈмом 2 килобайта, как это показано на рисунке 1. При рассмотрении построения блока обработки сигналов мы договорились, что процессор после сброса начинает работу с нулевого адреса, поэтому разместим ПЗУ в адресном пространстве начиная с нулевого адреса. Для того, чтобы нулевая ячейка ПЗУ оказались расположенной по нулевому адресу адресного пространства микропроцессора, старшие разряды шины адреса должны быть равны 0.

При построении схемы необходимо декодировать старшие пять разрядов адреса (определить, чтобы они были равны 0). Это выполняется при помощи дешифратора адреса, который в данном случае вырождается в пятивходовую схему "ИЛИ-НЕ" Это связано с тем, что внутри ПЗУ уже есть одиннадцативходовый дешифратор адреса. При использовании дешифратора адреса, обращение к ячейкам памяти выше двух килобайт не приведЈт к чтению ячеек ПЗУ, так как на входе выбора кристалла CS уровень напряжения останется высоким.

Теперь подключим микросхему ОЗУ. Для примера выберем микросхему объЈмом 8 Кбайт. Для выбора любой из ячеек этой микросхемы достаточно тринадцатибитового адреса, поэтому необходимо дополнительно декодировать три оставшихся разряда адреса. Так как начальные ячейки памяти адресного пространства уже заняты ПЗУ, то использовать нельзя. Выберем следующую комбинацию цифр 001 и используем известные нам принципы построения схемы по произвольной таблице истинности. Дешифратор адреса выродится в данном случае в трЈхвходовую схему "И-НЕ" с двумя инверторами на входе. Схема этого дешифратора приведена на рисунке 1. ПриведЈнный дешифратор адреса обеспечивает нулевой уровень сигнала на входе CS только при комбинации старших бит 000. Обратите внимание, что так как объЈм ПЗУ меньше объЈма ОЗУ, то между областью адресов ПЗУ и областью адресов ОЗУ образовалось пустое пространство неиспользуемых адресов памяти.

И, наконец, так как все микропроцессоры предназначены для обработки данных, поступающих извне, то в любой микропроцессорной системе должны присутствовать порты ввода-вывода. Порт ввода-вывода отображается в адресное пространство микропроцессорного устройства как одиночная ячейка памяти, поэтому порт ввода вывода можно разместить по любому свободному адресу. Проще всего построить дешифратор числа FFFFh. В этом случае дешифратор превращается в обычную 16-ти входовую схему "И-НЕ", поэтому и выберем эту ячейку памяти в адресном пространстве микропроцессора для размещения порта ввода-вывода.

Способы расширения адресного пространства микропроцессора.

Известно, что размер адресного пространства определяется разрядностью счЈтчика команд микропроцессора. Достаточно часто при развитии микропроцессорной системы возможности адресного пространства исчерпываются. В таком случае приходится прибегать к методам расширения адресного пространства.

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

Рисунок 4. Использование параллельного порта в качестве переключателя страниц памяти.

В этой схеме параллельный порт используется в качестве простейшего контроллера памяти микропроцессорного устройства. При применении восьмиразрядного параллельного порта в микропроцессорной системе появились дополнительные восемь линий адреса. В результате адресное пространство микропроцессорной системы увеличилось до 16 Мегабайт. Структура нового адресного пространства приведена на рисунке 5, а принцип формирования нового адреса с использованием переключателя страниц приведЈн на рисунке 6.

Рисунок 5. Структура страничного адресного пространства.

Рисунок 6. Формирование адреса с использованием переключателя страниц.

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

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

Для формирования физического адреса используется параллельный двоичный сумматор. На входы этого сумматора подаЈтся содержимое базового регистра и содержимое счЈтчика команд. Суммирование производится со смещением содержимого базового регистра влево на несколько бит относительно счЈтчика команд (рисунок 8). В результате максимальный размер сегмента определяется разрядностью программного счЈтчика, а максимальная неиспользуемая область памяти – смещением базового регистра относительно программного счЈтчика.

Адресное пространство при использовании сегментного метода адресации приведено на рисунке 7.

Рисунок 7. Пример адресного пространства с разделением на сегменты.

Количество сегментов определяется количеством базовых регистров. Сегменты могут перекрываться в адресном пространстве, и тем самым может регулироваться размер памяти, который отводится под каждый конкретный сегмент памяти. В компьютерах семейства IBM PC имеются четыре базовых регистра, определяющих сегмент данных, сегмент программы, сегмент стека и дополнительный сегмент. Информацию в базовые регистры заносит операционная система при переключении задач.

Рисунок 8. Формирование адреса при сегментной адресации.

ЕщЈ одним распространЈнным способом увеличения адресного пространства является применение окон. При использовании окон производится расширение не всего адресного пространства, а только его части. Внутри адресного пространства выделяется некоторая область, которая называется окном. В это окно может отображаться часть другого адресного пространства.

При использовании окон может быть использован как страничный метод отображения адресного пространства, так и сегментный метод отображения адресного пространства в окно.

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

При использовании сегментного метода отображения, конкретная область адресного пространства, которая будет отображаться в окно, определяется содержимым базового регистра. Если разрядность адреса вспомогательного адресного пространства, отображаемого в окно основной памяти, совпадает с разрядностью базового регистра, то любая область вспомогательной памяти может быть отображена в основную память с точностью до байта.

Принцип построения оконной адресации при отображении страниц показан на рисунке 9.

Рисунок 9. Применение окна для расширения адресного пространства.

Оконная адресация часто используется при развитии микропроцессорных семейств, когда размера областей памяти, отведЈнных для конкретных задач в младших моделях семейства, не хватает для старших моделей семейства, а при этом нужно поддерживать аппаратную совместимость с младшими моделями семейства. В качестве примера можно привести микросхемы I81c96 фирмы INTEL или TMS320c5410 фирмы Texas Instrument, где для расширения области регистров специальных функций используется оконная адресация.


Состав семейства MCS-48

Микроконтроллеры этого семейства явились одним из первых представителей однокристальных ЭВМ - микроконтроллеров. Первоначально фирмой Intel была разработана микросхема 8048, на основе модификации которой и было построено всЈ семейство микроконтроллеров. В структуре этого микроконтроллера явно прослеживается наследие от микропроцессора 8085 (отечественный аналог 1821ВМ85). Отечественная промышленность тоже выпускала микроконтроллеры этого семейства. Производство микроконтроллера 8048 осуществлялось в Новосибирске (КР1816ВЕ48, КР1816ВЕ49, КР1816ВЕ35, 1850ВЕ49). В таблице 1 приведены параметры этих микросхем.

Таблица 1. Микросхемы, входящие в состав семейства MCS-48

Микроконтроллер | ОЗУ | ПЗУ | Таймер | Fт | порты | системная шина
8048 | 64 байт | 1К байт | 1 | 6 | 2 | есть
8049 | 128 байт | 2К байт | 1 | 11 | 2 | есть
8035 | 64 байт | - | 1 | 11/6 | 2 | есть
КР1816ВЕ48 | 64 байт | 1К байт | 1 | 6 | 2 | есть
КР1816ВЕ49 | 128 байт | 2К байт | 1 | 11 | 2 | есть
КР1816ВЕ35 | 64 байт | - | 1 | 11/6 | 2 | есть
КР1850ВЕ49 | 256 байт | 2К байт | 1 | 11 | 2 | есть

Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили популярность этому микроконтроллеру успех. К сожалению недостаточное количество параллельных портов и малые возможности внутреннего таймера привели к тому, что это семейство было быстро вытеснено семейством микроконтроллеров MCS-51.

Недостаточный объЈм внутренней памяти, как показал успех PIC-контроллеров фирмы microchip, не являлся определяющим в том, что это семейство микроконтроллеров исчезло с рынка. Возможно большую роль сыграло нежелание фирмы Intel снижать цены на свою продукцию. Стоимость отечественных микросхем семейства MCS-48 и MCS-51 практически не различались, поэтому естественно разработчики как только появилась возможность перешли на использование микроконтроллеров семейства MCS-51.


Принципы построения таймеров.

Таймеры предназначены для формирования временных интервалов, позволяя микропроцессорной системе работать в режиме реального времени.

Таймеры представляют собой обычные цифровые счЈтчики, которые подсчитывают импульсы от высокостабильного генератора частоты. К системной шине микропроцессора таймеры подключаются при помощи параллельных портов.

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

Обычно используются 16-ти разрядные таймеры, поэтому, для подключения такого таймера к 8-ми разрядному процессору требуется два параллельных порта. Кроме того, таймером нужно управлять. Таймер нужно включать и выключать, часто требуется определять не возникало ли переполнение таймера (факт переполнения легко запомнить в дополнительном триггере, подключенном к выходу переноса счетчика таймера). Этот триггер называется флагом переполнения таймера. Триггер (флаг) включения и выключения таймера и флаг переполнения таймера подключают к системной шине микропроцессора через дополнительный порт ввода вывода.

Структурная схема таймера, построенного по описанным выше принципам, приведена на рисунке 1.

Рисунок 1. Структурная схема таймера.

В зависимости от типа использованного цифрового счетчика таймеры бывают суммирующие или вычитающие. Если в таймере используется суммирующий счЈтчик, то таймер называется суммирующим. Если в таймере используется вычитающий счЈтчик, то таймер называется вычитающим.

Использование вычитающего счЈтчика позволяет проще задавать интервалы времени. В этом случае записываемый в таймер код будет соответствовать интервалу времени:

В случае использования суммирующего таймера код, записываемый в таймер для задания интервала времени, определяется из другой формулы:

В этой формуле код, который заносится в таймер, представляет собой дополнение кода интервала времени до максимального кода, который можно записать в таймер. Максимальный код таймера определяется по разрядности таймера. В рассмотренном примере разрядность таймера равна 16. Это означает, что максимальный код равен 65535.

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

Рисунок 2. Структурная схема свободнобегущего таймера с модулем сравнения.

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

Часто с одним свободно бегущим таймером работает несколько модулей сравнения.

Кроме модулей сравнения с свободнобегущим таймером работают модули захвата, которые позволяют аппаратно запоминать время какого-либо внешнего события без участия центрального процессора. Структурная схема свободнобегущего таймера с модулем захвата приведена на рисунке 3.

Рисунок 3. Структурная схема свободнобегущего таймера с модулем захвата.


Триггеры

Простейшая схема, позволяющая запоминать двоичную информацию, строится на основе простейших логических элементов, "ИЛИ" или "И". Такая схема, построенная на элементах "И" приведена на рисунке 1. Вход S (Set) позволяет устанавливать выход триггера Q в единичное состояние при подаче на его вход логического нуля. Вход R (Reset) позволяет сбрасывать выход триггера Q в нулевое состояние при подаче на его вход логического нуля.

Рисунок 1 Схема простейшего триггера на схемах "И". Входы R и S инверсные (активный уровень'0')

Точно так же можно построить RS триггер и на логических элементах "ИЛИ". Схема RS триггера, построенного на логических элементах "ИЛИ" приведена на рисунке 2. Единственное отличие будет заключаться в том, что сброс и установка триггера будет производиться единичными логическими уровнями.

Рисунок 2 Схема простейшего триггера на схемах "ИЛИ". Входы R и S прямые (активный уровень '1')

Так как триггер при построении его на различных элементах работает одинаково, то его изображение на принципиальных схемах тоже одинаково. Изображение простейшего триггера на принципиальных схемах приведено на рисунке 3.

Рисунок 3 Обозначение простейшего триггера на принципиальных схемах

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

Для таких цифровых схем требуются синхронные триггеры. Схема синхронного триггера приведена на рисунке 4, а обозначение на принципиальных схемах на рисунке 5.

Рисунок 4 Схема синхронного триггера на схемах "И"

Рисунок 5 Обозначение синхронного триггера на принципиальных схемах

В приведенной схеме для записи логического 0 и логической 1 требуются разные входы, что не всегда удобно. Поэтому для запоминания дискретной информации применяются D триггеры. Схема такого триггера приведена на рисунке 6, а обозначение на принципиальных схемах на рисунке 7.

D_trg.gif (1564 bytes)

Рисунок 6 Схема D триггера (защелки)

D_trg_S.gif (1333 bytes)

Рисунок 7 Обозначение D триггера (защелки) на принципиальных схемах

Во всех приведенных схемах синхросигнал работает по уровню, поэтому триггеры называются триггеры-защЈлки. Легче всего объяснить появление этого названия по временной диаграмме, приведенной на рисунке 8.

DiagTrgZ.gif (5000 bytes)

Рисунок 8. Временная диаграмма D триггера (защелки)

По этой временной диаграмме видно, что триггер-защелка хранит данные на выходе только при нулевом уровне на входе синхронизации. Если же на вход синхронизации подать активный высокий уровень, то напряжение на выходе триггера будет повторять напряжение, подаваемое на вход этого триггера. Входное напряжение запоминается только в момент изменения уровня напряжения на входе синхронизации C с высокого уровня на низкий уровень. Входные данные как бы "защелкиваются" в этот момент. отсюда и название - триггер-защелка.

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

D_trg_F.gif (2144 bytes)

Рисунок 9 Схема универсального D триггера

Рисунок 10 Обозначение универсального D триггера на принципиальных схемах


Написание программ для микропроцессоров.

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

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

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

Рисунок 2.25. Алгоритм программы-монитора.

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

Рассмотрим пример реализации такого алгоритма работы программы. Для написания программы воспользуемся принципами структурного программирования, рассмотренными ранее. В этом случае для проверки работоспособности программы можно воспользоваться программами-заглушками. Исходный текст такой программы приведЈн на рисунке 2.26.

Рисунок 2.25. Пример реализации программы-монитора на языке СИ.

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

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

Объявим глобальную переменную SkanCode, в которой будем хранить значения электрических сигналов на выводах микроконтроллера, подключенных к контактам клавиатуры.

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


Поиск на сайте

Поиск на сайте Виртуального компьютерного музея осуществляется средствами поисковой системы Яндекс. На сайте Яндекса вы можете ознакомиться с подробным описанием языка запросов, узнать, как сделать поиск наиболее эффективным или воспользоваться формой расширенного поиска.

Запрос:
Уточнение:
Зона поиска:

Примеры правильных запросов:
компьютеры "Сетунь"
Ванневар Буш
испытания систем противоракетной обороны
ламповые ЭВМ