Студопедия
rus | ua | other

Home Random lecture






Организация памяти в семействе МСS-51


Date: 2015-10-07; view: 554.


 

Вся серия МСS-51 имеет гарвардскую архитектуру – раздельное адресное пространство программ и данных [2]. Память программ предназначена для размещения программного кода, а память данных используется для размещения стека и хранения данных пользователя. Каждое из пространств имеет размер 64к. Такое разделение позволяет осуществить доступ к памяти данных по 8-ми битным адресам, разрядность которых позволяет осуществить их быструю обработку процессором. Для использования 16-ти битных адресов данных применяют регистр указатель DPTR.

Программная память доступна только для чтения (если не применять её искусственное объединение с памятью данных с помощью внешних цепей). Память данных отделена от памяти программ. Для обращения к внешней памяти данных микроконтроллер генерирует сигналы RD (чтения) и WR (записи). Внешняя память программ и внешняя память данных могут комбинироваться (объединяться) путём совмещения сигналов RD и PSEN по схеме логического «И» для получения строба чтения внешней памяти (программ данных).

При необходимости пользователь может расширить память программ установкой внешней микросхемы ПЗУ. При считывании команд из внешней памяти формируется инверсный сигнал PSEN (Program Store Enable) (в некоторых книгах РМЕ) для всех адресов, кроме области внутреннего ПЗУ. На рис. 15 изображено адресное пространство памяти программ.

 
 

 


 

 

Память программ может быть целиком внешней (вывод ЕА заземлён, т.е. ЕА = 0), т.е. размещаться на внешней микросхеме ПЗУ, либо комбинированной ЕА = 1 (вывод ЕА подключается к Vcc (+5В)). В последнем случае младшие 4к (8, 16, 32 – для различных модификаций) размещаются на внутреннем ПЗУ, а остальные адреса на внешней МС. Так в микросхеме с 4к ПЗУ адреса с 000H по OFFFH располагаются во внутреннем ПЗУ, а адреса с 1000H по FFFFH во внешнем. В 8-ми к байтном – к внутреннему по адресам 000H-1FFFH, к внешней – 2000H – FFFFH. Для 16к – 0000H и 4000H–FFFH соответственно.

 

Подключение микросхемы внешней памяти программ

 

Аппаратная реализация подключения внешней памяти приведена на рис. 16. Порт Р0 является мультиплексированной шиной адреса и данных. То есть линии порта переключаются с выдачи младшего байта адреса ячейки внешней памяти на приём байта команды, считываемой из адресуемой ячейки. Вначале на линии порта выдаётся младший байт программного счётчика (PCL), после чего он переводится в 3-е (высокоимпедансное состояние) для чтения байта из памяти программ. В период установки на линиях Р0 младшего байта программного счётчика, сигнал ALE фиксирует его на внешней защёлке адреса. В качестве защёлки используется микросхема регистра-защёлки, например К580ИР82. Поступивший на входы D байт младшего адреса ячейки памяти запоминается и выдаётся по спаду сигнала ALE на выход

 
 

Q, откуда он поступает на адресные входы микросхемы памяти А0 – А7. При этом вход D регистра-защёлки по спаду сигнала ALE отключается от линии порта (переходит в высокоимпедансное состояние). Одновременно в порт Р2 выдаётся старший байт программного счётчика (РСН). Байт данных (считывание команды) выдаётся из ПЗУ через выводы D0 – D7 в микроконтроллер по стробу сигнала PSEN, который поступает на ввод OE микросхемы памяти. Таким образом обеспечивается использование одних и тех же линий порта Р0 для предачи младшего байта адреса и приёма байта, содержимого ячейки памяти. Ввод CS (Сhip Select – выбор микросхемы) используется, когда применяется несколько микросхем памяти для обращения к требуемой. Если используется одна микросхема памяти, то этот ввод заземляется.

Адрес в пространстве программной памяти всегда 16-разрядный, хотя её объём может быть и меньше 64 к. Поэтому при разрядности старшего байта адреса памяти программ меньшей 8 нельзя использовать освободившиеся линии порта Р2 для других целей. Например, для адресации памяти объёмом 2к байт требуется 11-разрядный адрес, при этом в порту Р2 реально адресуется 3 линии, однако 5 незадействованных линий использовать нельзя, так как на них при обращении к памяти данных будут выдаваться нули при обращении к внешней памяти программ.

На рис. 17 приведена диаграмма, показывающая формирование сигналов при работе микропроцессора с внешней памятью программ. При работе с внешней памятью программ сигнал PSEN (Program Store Enable – источник программного кода доступен) (в некоторых книгах обозначается как РМЕ) формируется дважды в каждом машинном цикле независимо от количества байт в команде. Если второй байт в текущей команде не используется, то он игнорируется микроконтроллером. В дальнейшем при переходе к выполнению следующей команды этот байт будет введён вторично.

Если выполняется команда movx два сигнала PSEN не формируются,

формируется один, т.к. порт Р0 освобождается для адресации и обмена данными с внешней памятью данных. Когда микроконтроллер работает с внутренней памятью программ, PSEN не формируется и адрес на портах Р0 и Р2 не выдаётся. Тем не менее, сигнал ALE будет формироваться дважды в машинном

 
цикле всегда, за исключением команды MOVX (в этом случае один сигнал ALE пропускается).

 
 

Расположение векторов прерываний в памяти программ

 

После сигнала сброса (RST) микроконтроллер всегда начинает выполнение программы с адреса 0000H. Начиная с адреса 0003, с интервалом в 8 байт расположены вектора (начальные адреса подпрограмм обработки прерываний) прерываний:

0003H - External interrupt 0 (внешнее прерывание 0 – вывод INT0);

000BH - Timer 0 (прерывание от Т/С 0);

00013H - External interrupt 1 (внешнее прерывание 1 – вывод INT1);

001BH - Timer 1 (прерывание от Т/С 1);

0023H - (прерывание от последовательного порта);

Прерывание заставляет процессор осуществить переход на соответствующий прерыванию адрес, с которого начинается выполнение подпрограммы обработки прерывания. Например, прерывание от Т/С 0 осуществляет переход на адрес 000ВH, если обработчик прерывания имеет небольшой размер, то он может полностью разместиться в 8-ми байтах между векторами прерываний. Более длинная подпрограмма обработки прерываний, используя команду перехода, может быть размещена в любом другом месте памяти, не затрагивая другие векторы прерываний, если соответствующие им прерывания используются.

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

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

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

jmp 30H ; команда обхода подпрограммы прерывания, необходима для ;предотвращения несанкционированного входа в

;подпрограмму;

ORG 23H ; директива компилятору расположить команду CLR RI по ; адресу 23H;

CLR RI ; начало подпрограммы обработки прерывания;

mov @R0, SBUF ;продолжение подпрограммы обработки прерывания;

INC R0 ; команда подпрограммы;

RETI ; команда возврата из подпрограммы;

После компиляции по незадействованным адресам памяти программ до адреса 23Н будут записаны команды nop (no operation – нет действия), а первая команда подпрограммы CLR RI будет располагаться по адресу 23Н.

Память данных

Память данных предназначена для приёма, хранения и выдачи информации, используемой в процессе выполнения программы. Память данных обычно бывает оперативной, то есть данные в ячейках памяти стираются при выключения питания. В последее время появились микроконтроллеры с флэш-памятью данных. По месту расположения различают память данных, расположенную на кристалле микроконтроллера (внутренняя (резидентная) память данных), и память расположенную на специальной микросхеме (внешняя память данных). Адресное пространство памяти данных базовой модели микроконтроллера приведено на рис. 18. В адресном пространстве памяти данных находятся регистры специальных функций, занимающие адреса 80H - FFH. Общий объём адресного пространства внутренней памяти данных составляет 256 байт. Из них 128 байт приходится на 8-битовые ячейки ОЗУ. Остальные 128 байт занимают адреса регистров специальных функций. Чтение и запись в ячейки ОЗУ производится командой mov. Например, запись байта данных из акуммулятора в ячейку ОЗУ с адресом 20h происходит по команде

mov 20H, A.

Другой пример, чтение байта данных из ячейки с адресом 20H и запись его регистр R4, происходит по команде

mov R4, 20H.

Ячейки внутренней памяти данных могут адресоваться косвенно через адреса, помещённые в регистры R0 или R1. Например,

mov 20H, @R1;

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

Часть ячеек ОЗУ, начиная с адреса 20H по адрес 2FH, помимо байтовой имеют битовую адресацию. Иначе это свойство называют прямой адресацией битов. При битовой адресации в ячейку памяти данных записываются или читаются из неё отдельные биты. Схема адресного пространства с иллюстрацией битовой адресации представлена на рис. 19. Битовая адресация весьма удобна, для установки признаков (флагов) пользователя. Например, при управлении некоторым количеством устройств признаком того, что устройство включено можно считать установку бита в 1, а признаком выключения устройства – установку этого бита в 0. Таким образом в одном байте можно разместить восемь признаков, а в побитно адресуемых ячейках памяти 128 признаков. Например, при использовании микроконтроллера в автомобиле таким образом могут устанавливаться признаки закрытия каждой двери, багажника, включения ламп сигналов поворота, фар, подфарников и т. д. Проверка соответствующих битов покажет в каком из 2-х состояний находится управляемый объект.

При записи значения бита в ячейку значения других битов этой ячейки остаются неизменными. Каждый бит в ячейках памяти с прямой адресацией битов имеет свой адрес. Например, нулевой бит ячейки с адресом 20H имеет адрес 00, первый бит этой ячейки имеет адрес 00. Нулевой бит ячейки 21H имеет адрес 08. Седьмой бит ячейки с адресом 2FH имеет адрес 127 (или

 
 

в 16-ричной системе – 7FH). Пересылка битов осуществляется только через бит "С" регистра PSW. Пересылка означает копирование значения бита из источника в приёмник. Этот бит называют битовым акуммулятором. Например, если необходимо в первый бит ячейки с адресом 20H переслать значение нулевого бита акуммулятора, то сначала этот бит пересылается в бит "С". Затем из бита "С" – в первый бит ячейки с адресом 20H. Приведём соответствующий выше сказанному фрагмент программы по пересылке бита в ячейку ОЗУ:

mov C, ACC.1 ; Пересылка 1-го бита акуммулятора в бит С;

mov 01, C ; Пересылка бита "С" в первый бит ячейки 20 H;

 

Cуществует эквивалентный способ программирования пересылки бита:

mov 20H.1, C ; Пересылка значения бита "С" в первый бит ячейки 20 H;

 

Подключение микросхемы внешней памяти данных

 

Микросхема внешней памяти данных подключается аналогично подключению микросхемы внешней памяти программ (рис. 16). Отличие состоит в том, что вместо ввода PSEN с микросхемой памяти соединяются вводы микроконтроллера RD и WR. Цикл чтения данных из внешней памяти данных производится при выполнении команды MOVX по стробу RD. Цикл записи аналогичен, но вместо RD используется WR. При обмене адрес А0…А7 фиксируется во внешнем регистре по спаду АLE, а приём и выдача данных стробируются сигналами RD и WR.

На рис. 20 приведена схема подключения памяти данных объёмом 2 к. Для адресации памяти такого объёма достаточно 11-ти разрядов шины адреса. Поэтому для адресации старшего байта адреса достаточно 3-х линий порта Р2. Используются линии Р2.0, Р2.1, Р2.2.

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

movx @DPTR, A;

Это команда записи байта из акуммулятора в ячейку внешней памяти, адрес которой указан в регистре DPTR. Символ @ означает косвенную адресацию. Для чтения используется команда

movx A, @DPTR;

Обмен данными с внешней памятью всегда происходит через акуммулятор и косвенную адресацию через регистр DPTR (Data pointer –указатель данных) или через регистры общего назначения R0 и R1. При использовании регистра DPTR автоматически генерируется 16-разрядный код ячейки внешней памяти данных. Поэтому использовать свободные линии порта Р2 (в описенном выше примере это линии порта Р2.3-Р2.7) для других целей нельзя. Это конечно недостаток способа. Обычно программисту всегда не хватает линий портов. Однако достоинствами являются автоматическая генерация адресов и возможность параллельного подключения микросхемы внешней памяти программ.

 
 

Второй вариант организации обмена называется страничным. Внешняя память данных разбивается на страницы размером 256 байт. Старший байт адреса задаёт номер страницы, а младший байт адреса задаёт адрес ячейки в данной странице. Для автоматической адресации младшего адреса ячейки памяти данных используется косвенная адресация через регистры R0 или R1. Так для записи в ячейку используется команда

movx @R0, A;,

а для чтения – команда

movx A, @R0;

В регистр R0 предварительно помещается адрес ячейки, находящейся внутри страницы внутри страницы. Для обмена можно также использовать регистр R1 вместо R0. Старший байт адреса ячейки, определяющий номер страницы, задаётся пользователем. Например, пусть внешняя память данных имеет объём 2 к. Для её адресации необходимо 11 разрядов. Следовательно номер страницы определяется комбинацией нулей и единиц трёх линий порта Р2. Для задания нулевой страницы необходимо на 3-х линиях порта Р2 задать комбинацию 000. Это можно сделать, записав в программе следующий код

clr P2.0 ; запись 0 на линию Р2.0;

clr P2.1 ; запись 0 на линию Р2.1;

clr P2.2 ; запись 0 на линию Р2.2;

movx @R0, A ; автоматическая генерация младшего байта адреса ячейки внутри нулевой страницы.

Для задания, например, 2-ой страницы необходимо задать на линиях порта Р2 комбинацию 010. Это двоичное число в десятичной форме соответствует числу 2. Соответствующий программный код будет выглядеть следующим образом

clr P2.0 ; запись 0 на линию Р2.0;

setb P2.1 ; запись 1 на линию Р2.1;

clr P2.2 ; запись 0 на линию Р2.2;

movx @R0, A ; автоматическая генерация младшего байта адреса ячейки внутри 2-ой страницы.

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

 

Начальная установка микроконтроллера

 

Инициализация (сброс) микросхемы микроконтроллера осуществляется сигналом RST (Restart – возобновлять) (активный высокий уровень напряжения) при условии подачи на микроконтроллер внешнего сигнала синхронизации или при включенном кварце. Вход RST является входом внутреннего триггера Шмита (компаратор с гистерезисом, чтобы не было многократного срабатывания микроконтроллера от пульсации напряжения на выводе RST). Для того, чтобы сброс гарантированно произошёл, длительность сигнала высокого уровня на RST должна быть не менее 2-х машинных циклов микроконтроллера (24 периода синхрочастоты ¦ВQ). При поступлении внешнего сигнала сброса на вход RST микроконтроллер формирует сигнал сброса.

Внешний сигнал сброса является асинхронным по отношению к внутренней синхронизации микроконтроллера поскольку он не привязан к временной сетке микроконтроллера. Состояние вывода RST проверяется в фазе S5P2 каждого машинного цикла. После подачи сигнала высокого уровня на вход RST микроконтроллер продолжает работу в течение времени от 19 до 31 периода частоты XTAL (BQ) (формируются ALE, PSEN и т.п.), после чего ALE и PSEN устанавливаются в "1" и находятся в этом состоянии всё время, пока на входе RST присутствует сигнал сброса. После подачи на RST уровня "0" проходит от 1 до 2-х машинных циклов до начала формирования ALE и PSEN.

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

1) устанавливает счётчик команд и все регистраторы SFR, кроме защёлок портов, указателя стека и регистра SBUF, в ноль;

2) указатель стека принимает значение 07Н;

3) запрещает все источники прерываний, работу т/с и последовательного порта.

4) выбирает нулевой банк ОЗУ, подготавливает порты Р0-Р3 для приёма данных и определяет выводы ALE и PSEN, как входы для внешней синхронизации;

5) в регистрах PSON, IP, IE резервные биты принимают случайные значения, а все остальные биты сбрасываются в "0".

6) в регистрах SBUF устанавливаются случайные значения;

7) устанавливает фиксаторы-защёлки портов Р0-Р3 в "1".

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

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

Для возобновления нормальной работы микроконтроллера при зацикливании применяется устройство, называемое сторожевым таймером. В литературе он обозначается как WDT (Watch dog timer – наблюдающая сторожевая собака). Сторожевой таймер отсчитывает интервал времени, внутри которого нормально работающая программа микроконтроллера должна сбросить сторожевой таймер в нулевое состояние. То есть заставить его вновь начать с нуля отсчёт интервала времени. Если сброса в течение этого интервала не происходит, следовательно, произошёл сбой в работе программы. По истечении заданного интервала времени с выхода таймера на вход RST поступает сигнал сброса микроконтроллера. После инициализации программа начинает выполняться с нулевого адреса. Таким образом автоматически восстанавливается корректная работа программы.

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

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

 

Микроконтроллер содержит внутренний резистор, включенный между RST и выводом. Если использовать только внутренний резистор, то ёмкость конденсатора может быть уменьшена до 1 мкФ. Чтобы при включении сброс был гарантировано, выполнен, вывод RST должен удерживаться в состоянии высокого уровня в течение времени, достаточного для запуска тактового генератора плюс ещё два машинных цикла. Время запуска генератора зависит от частоты его работы. Для 10 МГц tзапуска = 1мс, для 1 МГц – 10 мс. Работа схемы происходит следующим образом. При включении питания конденсатор начинает заряжаться через резистор, расположенный на кристалле микроконтроллера между выводами 9 и 20. В начальный момент переходного процесса конденсатор сопротивление конденсатора равно нулю. Всё напряжение питания падает на внутреннем резисторе. То есть на вход RST поступает напряжение, соответствующее уровню логической единицы. Некоторое время, определяемое постоянной временем заряда RC, напряжение на выводе RST уменьшается, но остаётся большим минимального уровня логической единицы. Этого времени должно быть достаточно для запуска процедуры инициализации микроконтроллера.

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

Таймеры-счётчики

В базовой модели микроконтроллера имеются два 16-ти разрядных таймера-счётчика – Т/С0 и Т/С1. Каждый из них независимо может быть запрограммирован на работу в качестве таймера (отчёт времени через подсчёт внутренних импульсов синхронизации – машинных циклов), либо счётчика (подсчёт событий на внешнем входе). Таймер-счётчик предназначен для подсчёта внешних событий, организации программно-управляемых временных задержек и измерения временных интервалов.

В состав блока таймера-счётчика входят:

1) два 16-ти разрядных регистра Т/С0 и Т/С1;

2) восьмиразрядный регистр режимов таймера-счётчика (ТМОД);

3) восьмиразрядный регистр управления (ТСОN);

4) схема инкремента;

5) схема фиксации INT0, INT1, T0, T1;

6) схема управления флагами;

7) логика управления таймерами счётчиками;

Два 16-ти разрядных регистра Т/С0 и Т/С1 выполняют функцию хранения содержимого счёта. Каждый из них состоит из пары 8-ми разрядных регистров, соответственно ТН0, ТL0 и TH1, TL1. Причём регистры ТН0, TH1- старшие, а ТL0, TL1 – младшие, 8-ми разрядов. Каждый из 8-ми разрядных регистров имеет свой адрес и может быть использован как регистр общего назначения, если таймер-счётчик не используется.

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

Регистр режимов таймеров-счётчиков, TMOD предназначен для приёма и хранения кода, определяющего:

- один из 4-х режимов работы каждого таймера-счётчика;

- работу в качестве таймеров или счётчиков (определения источника тактирования таймера-счётчика);

- управление таймера-счётчика от внешнего вывода;

Обозначение разрядов регистра TMOD приведено ниже:

 
 

 

 


Биты ТМОД.7 ТМОД.6 ТМОД.5 ТМОД.4 ТМОД.3 ТМОД.2 ТМОД.1 ТМОД.0
Обоз. GATE 1 C/T 1 M1.1 M0.1 GATE 0 C/T 0 M1.0 M0.0

 

GATE 1 ТМОД.7 Разрешение управления таймером Т/С 1 от внешнего вывода INT1. При GATE 1 =1 управление разрешено. При GATE 1=0 запрещено.
C/T 1 ТМОД.6 Определение работы C/T 1 как: C/T 1=0–таймера; C/T 1=1 счётчика
M1.1 M0.1 ТМОД.5 ТМОД.4 Определение одного из 4-х режимов работы Т/С1
GATE 0 ТМОД.3 Разрешение управления Т/С0 от внешнего вывода INT0. При GATE 0=1 управление разрешено, при GATE 0=0 запрещено.
C/T 0 ТМОД.2 Определение работы Т/С0 как: C/T 0=0–таймера, C/T 0=1 запрещено.
M1.0 M0.0 ТМОД.1 ТМОД.0 Определение одного из 4-х режимов работы Т/С0.

 

М1.Х М0.Х Режим

 

Примечание: Все биты TMOD устанавливаются программно: биты 0 -3 определяют работу Т/С0, биты 4 – 7 определяют работу Т/С1.

Схема инкремента работает следующим образом.

При работе в качестве таймера содержимое таймера-счётчика инкрементируется в каждом машинном цикле, т.е. таймер-счётчик является счётчиком машинных циклов. Поскольку машинный цикл состоит из 12 периодов частоты синхронизации МИКРОКОНТРОЛЛЕР ¦XTAL, то частота счёта равна ¦XTAL/12.

При работе таймера-счётчика в качестве счётчика внешних событий содержимое регистра таймера-счётчика инкрементируется в ответ на переход из "1" в "0" сигнала на счётном входе микроконтроллера (вывод Т0 для Т/С0 и Т1 для Т/С1). Счётные входы аппаратно проверяются в фазе S5P2 каждого цикла. Когда проверки показывают высокий уровень в одном цикле и низкий уровень в другом цикле, регистр таймера-счётчика инкрементируется. Новое (инкрементированное) значение заносится в регистр таймера-счётчика в фазе S3P1 машинного цикла, непосредственно следующего за тем, в котором был обнаружен переход из "1" в "0". Т.к. для распознавания такого перехода требуется 2 машинных цикла (24 периода частоты синхронизации), то максимальная частота счёта таймера-счётчика в режиме счётчика равна ¦XTAL/24. Чтобы уровень сигнала на счётном входе был гарантированно зафиксирован, он должен оставаться неименным в течение как минимум одного цикла.

Регистр управления TCON предназначен для приёма и хранения управляющего слова:

 
 

 

 


Биты ТСОN.7 ТCОN.6 ТCОN.5 ТCОN.4 ТCОN.3 ТCОN.2 ТCОN.1 ТCОN.0
Обоз. TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

 

TF1 ТCОN.7 Бит переполнения таймера-счётчика. Устанавливается по переходу счётчика из FFH в 00H. Если при этом прерывание от Т/С1 разрешено, то установка флага вызывает прерывание. Флаг сбрасывается аппаратно при передаче управления программе обработки прерывания. Флаг может быть так же установлен и сброшен программно.
TR1 ТCОN.6 Бит включения Т/С1. Устанавливается и сбрасывается программно. Доступен по чтению.
TF0 ТCОN.5 Бит переполнения Т/С0. Функция аналогична TF1, но для TF0.
TR0 ТCОN.4 Бит включения Т/С0, аналогичен TR1, но для TF0.
IE1 ТCОN.3 Флаг запроса внешнего прерывания по входу INT1 (P3.3). Сбрасывается, устанавливается аппаратно, программно и инициирует вызов программы обработки прерывания. Сброс флага выполняется аппаратно при обслуживании прерывания только в том случае, если прерывание было вызвано по фронту сигнала. Если прерывание было вызвано уровнем сигнала на входе INT1, то сброс флага должны выполнить подпрограмму обслуживания прерывания, воздействуя на источник прерывания для снятия им запроса.
IT1 ТCОN.2 Бит, определяющий вид прерывания по входу INT1. Если IT1=0, то прерывание по уровню (низкому). Если IT1=1, то прерывание по фронту (переход из "1" в "0").
IE0 ТCОN.1 Флаг запроса внешнего прерывания по входу INT0 (P3.2). Действует аналогично IE1.
IT0 ТCОN.0 Бит, определяющий вид прерывания по входу INT0. Аналогичен IT1.

Схема инкремента предназначена:

- для увеличения на 1 в каждом машинном цикле содержимого регистров Т/С0, Т/С1, для которых установлен режим таймера и счёт разрешён;

- для увеличения на 1 содержимого регистров Т/С0 и Т/С1, для которых установлен режим счётчика и на соответствующем входе Т0 для Т/С0 и Т1 для Т/С1 зафиксирован счётный импульс;

Схема фиксации INT0, INT1, Т0, Т1 представляет собой четыре триггера. В каждом машинном цикле S5P2 в них запоминается информация с выводов INT0, INT1, Т0, Т1.

Схема управления флагами вырабатывает и снимает переполнения Т/С и флаги запросов внешних прерываний.

Логика управления Т/С синхронизирует работу Т/С0 и Т/С1 в соответствии с запрограммированными режимами работы и синхронизирует Т/С с микроконтроллером.

 

Режимы работы таймера-счётчика

 

Режим работы каждого таймера-счётчика определяет значение битов М0, М1 в регистре ТМОD. Т/С0 и Т/С1 имеют 4-ре режима работы. Режимы 0, 1, 2 одинаковы для обоих таймеров-счётчиков Т/С0 и Т/С1 полностью независимы друг от друга. Работа Т/С0 и Т/С1 в режиме 3 различна. При этом установка режима 3 в Т/С0 влияет на режимы работы Т/С1.

Режим 0: М0 = 0, М1 = 0. В этом режиме имеет место 13-ти разрядный счётный регистр, в котором регистр ТНх работает как 8-ми разрядный счётчик, а регистр TLx (5 его младших разрядов) используется как 5-ти битный предделитель на 32. Напомним, что в регистрах TLx в этом режиме значащими являются 5 младших разрядов. Рассмотрим логику работы в нулевом режиме на примере Т/С1 (рис.22).

 

 


 

 

OSC - источник синхронизации ¦XTAL . Бит С/Т1 регистра ТМОD определяет работу Т/С в качестве таймера (бит Т/С1 = 0), или счётчика (бит Т/С1 = 1). Счёт начинается при установке бита TR1 регистра ТCОN в состояние "1".

При необходимости управления счётом извне бит GATE1 регистра ТМОD устанавливается в состояние "1" , тогда при TR = 1 счёт будет разрешён, если на входе INT1 установлено состояние "1" и запрещён, если в "0". Таким образом внешнее устройство может включать и выключать таймер-счётчик.

Установка TR1 в состоянии "0" выключает Т/С 1независимо от состояния других битов. При переполнении Т/С1 (переход содержимого регистра Т/С1 из состояния все единицы в состояние все нули) устанавливается флаг TF1.

Т/С0 работает в таком режиме аналогично и независимо (его биты управления TR0, GATE0, Т/С0, вход INT0, вход Т0). Режим введён для функциональной совместимости с ранее выпускавшимся микроконтроллером MCS48.

Режим работы 1. Биты М1 = 0, М0 = 1. Режим аналогичен режиму 0. Отличие состоит в том, что установка режима 1 превращает Т/С в устройство на основе 16-ти разрядного регистра, состоящего из программно доступных пар TLх и THx.

Режим работы 2. Биты М1 = 1, М0 = 0. В этом режиме таймер-счётчик Т/С представляет собой устройство на основе 8-ми разрядного регистра TL0 для Т/С0 и TL1 для Т/С1. При каждом переполнении TL0 кроме установки в регистре ТCОN флага TF0 происходит автоматически перезагрузка содержимого из TH0 в TL0. Соответственно для Т/С1 при переполнении TL1 в регистре ТCОN устанавливается флаг TF1 и происходит перезагрузка TL1 из ТН1. Перезагрузка не влияет на содержимое регистров ТН0 и ТН1 (рис. 23).

 
 

 


Назначение битов управления TR0, TR1, GATE0, GATE1, C/T0, C/T1 такое же, как в режиме 0.

Приведём пример программирования таймера. Пусть необходимо Т/С0 запрограммировать работать в режиме 1 в качестве таймера, а Т/С1 – в качестве 1 счётчика, включить таймер и счётчик, а затем выключить. Приведём фрагмент соответствующего программного кода. Установка режимов работы Т\С0 и Т\С1 проводится путём занесения в регистр TMOD двоичного числа 01010001 с помощью команды mov.

 
 

 


 

setb TR0 ; включение таймера Т/С0

setb TR01 ; включение счётчика Т/С1

clr TR0 ; выключение таймера Т/С0

clr TR1 ; выключение счётчика Т\С1

Можно включить таймер и счётчик одновременно,

 
 

 

 


а также выключить Т\С0 и Т\С1 одновременно

mov TCON, # 00000000 b

 

В некоторых типах микроконтроллеров имеется функциональное устройство, называемое программируемой счётной матрицей PCA (Program Count Array – программируемая счётная матрица). Оно представляет собой 16-разрядный таймер-счётчик, состояние которого передаётся в 5 модулей захвата-сравнения, управляемых внешними событиями. Появление события на входе любого модуля может фиксировать состояние счётчика, сравнивать его состояние с заданным, осуществлять быстрый вывод кода состояния таймера-счётчика, формировать сигнал с широтно-импульсной модуляцией [3].

 

Организация прерываний

 

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

Архитектура базовой модели обеспечивает поддержку 5-ти источников прерываний:

-2-х внешних INT0 с вектором 0003Н

INT1 с вектором 0013Н

-2-х прерываний от таймеров

Т/С0 с вектором 000ВН

Т/С1 с вектором 001ВН

- прерываний от последовательного порта

с вектором 0023Н.

Для сигнала внешнего прерывания INT0 имеется вход P3.2 микроконтроллера, для INT1 – Р3.3.

 

Разрешение прерываний

 

Каждый вид прерываний индивидуально разрешается или запрещается установкой соответствующих бит регистра IE (Interrupt Enable – прерывание включено). Регистр содержит также и бит общего запрещения ЕА (Enable All – разрешены все), при нулевом значении которого блокируются все прерывания. При ЕА = 1 не блокируются прерывания, разрешённые индивидуально соответствующими битами.

Структура регистра IE приведена в таблице:

 

Бит IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0
Обозначение (имя бита) ЕА Х Х ES ET1 EX1 ET0 EX0

При значении бита "1" соответствующее прерывание разрешено. При значении бита "0" - прерывание запрещено.

ЕА - управление всеми источниками прерываний одновременно. Если ЕА = 1, то прерывания могут быть разрешены индивидуальными разрешениями ЕХ0, ЕТ0, ЕХ1, ЕТ1, ЕS;

Х - резервный разряд, предусмотренный разработчиками микроконтроллера для дальнейших разработок;

ES - управление прерыванием от последовательного порта. ЕS = 1– разрешение. ЕS = 0 – запрещение;

ЕТ1 - управление прерыванием от Т/С1. ЕТ1 = 1- разрешение. ЕТ1 = 0 – запрещение;

ЕХ1 - управление от внешнего источника INT1, ЕХ1=1- разрешение. ЕХ1 = 0 - запрещение;

ЕТ0 - управление прерыванием от Т/С0. ЕТ0=1- разрешение. ЕТ0=0 - запрещение;

ЕХ0 - управление от внешнего источника INT0, ЕХ0 = 1- разрешение; ЕХ0 = 0 – запрещение.

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

mov IE, #10010000 b;

 

Приоритеты прерываний

 

При появлении запросов от нескольких источников очередность их обслуживания определяется с помощью механизма приоритетов прерываний. В архитектуре МСS-51 имеет место 2-х ступенчатый механизм определения приоритетов. В исходной системе прерываний базовой модели приоритеты имеют 2 уровня: "высокий" и "низкий" и определяются значениями битов в регистре IP (Interrupt priority – приоритет прерываний). Единица определяет высокий приоритет, ноль – низкий.

Структура регистра IP представлена в таблице

 

Бит IР.7 IР.6 IР.5 IР.4 IР.3 IР.2 IР.1 IР.0
Обозначение (имя бита) Х Х Х РS РT1 РX1 РT0 РX0

Х - резервный разряд;

РS - установка уровня приоритета прерываний от последовательного порта;

РТ1- установка уровня приоритета от переполнения Т/С1;

РХ1- установка уровня приоритета прерывания от внешнего прерывания INT1;

РТ0 - установка уровня от переполнения Т/С0;

РХ0 - установка уровня от внешнего прерывания INT0;

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

 

  Источник Флаг Приоритет внутри уровня
1. Вход INT0 IE.0 высший
2. Таймер/счётчик 0 TF0  
3. Вход INT0 IE.1  
4. Таймер/счётчик 1 TF.0  
5. Последовательный порт IR+TI низший

 

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

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

Если какое либо прерывание уже обслуживается, то его процедуру может прервать только прерывание с более высоким приоритетом. Механизм приоритетов прерываний использует два внутренних программно-недоступных флага текущего уровня обслуживания прерывания (первой ступени). Приём на обслуживание прерывания устанавливает флаг того уровня приоритета, к которому относится запрос. Этот флаг определяет порог чувствительности системы прерываний. Команда RETI в конце процедуры обслуживания очищает флаг своего уровня и, таким образом, ликвидирует порог чувствительности.

Вид прерывания по входам INT0 и INT1 и флаги запроса прерывания устанавливаются в регистре TCON:

 

 
 

 

 


Биты ТСОN.7 ТCОN.6 ТCОN.5 ТCОN.4 ТCОN.3 ТCОN.2 ТCОN.1 ТCОN.0
Обоз. TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

 

IE1- флаг запроса прерывания по входу INT1;

IT1- бит, определяющий вид прерывания по входу INT1:

IT1 = 0 - прерывание по уровню (низкому);

IT1 = 1 - прерывание по фронту (переход из "1" в "0");

IE0- флаг запроса прерывания по входу INT0;

IT0- бит, определяющий вид прерывания по входу INT0:

IT0 = 0 - прерывание по уровню (низкому);

IT0 = 1 - прерывание по фронту (переход из "1" в "0")

Таким образом, биты 3-х регистров IE0, IР, TCON определяют параметры прерываний.

 

Алгоритм обработки прерывания

 

На рис. 26 представлена схема алгоритма обработки прерывания. До поступления запроса прерывания микроконтроллер выполняет текущую программу. После получения запроса прерывания микроконтроллер устанавливает флаг запроса прерывания в соответствующем регистре. Далее происходит завершение команды выполняемой программы. Далее микроконтроллер проверяет, маскируется (запрещается) или нет в регистре IE прерывание по данному запросу. Если прерывание не разрешено, то продолжается выполнение текущей программы. Если прерывание разрешено, то проверяется в этом же регистре, есть ли общее разрешение прерываний (установлен ли бит ЕА в 1?). Если нет, то продолжение текущей программы. Если да, то проверяется приоритет поступившего прерывания. Дело в том, что запрос прерывания может поступить при выполнении подпрограммы обработки прерывания от другого источника. Если приоритет поступившего прерывания ниже, или такой же, как приоритет текущей подпрограммы обработки прерывания, то продолжается выполнение текущей программы. Если выше, то начинает выполняться подпрограмма обработки прерывания по поступившему запросу. Поле окончания подпрограммы обработки прерывания (подпрограмма заканчивается командой reti (return interrupt)), микроконтроллер продолжит выполнение прерванной программы. Адрес возврата в текущую программу на время выполнения подпрограммы сохраняется в стеке. Это адрес команды, которая следует за последней выполненной командой в текущей программе.

 

 

 
 

Каждое из внешних прерываний INT0, INT1 может быть активизировано по уровню "0" или по фронту (переход из "1" в "0") сигналов на выводах микроконтроллера Р3.2 и (или) Р3.3. Это определяется состоянием битов IT0 и IT1 регистра TCON. Если бит IT = 0, то прерывание будет происходить по уровню сигнала (низкому). Ели бит IT = 1– то по фронту (переход из "1" в "0"). При поступлении запроса внешнего прерывания INT0 или INT1 устанавливается флаг IE0 или IE1 регистра TCON соответственно. Установка флага вызывает соответствующее прерывание. Очистка флага IE0 или IE1 производится следующим образом: при прерывании по фронту IE0 или IE1 сбрасывается аппаратно (автоматически внутренними средствами микроконтроллера) при обращении к соответствующей подпрограмме обработки прерывания. С прерыванием по уровню, флаг очищается по мере снятия запроса внешнего прерывания, т.е. в IE0 и IE1 отслеживаются состояния выводов INT0 и INT1.

Чтобы внешнее прерывание по уровню было распознано, необходимо удержание низкого уровня INT0 или (и) INT1 в течение не менее одного цикла. Это объясняется тем, что проверка выводов INT0 и INT1 выполняется аппаратно в каждом машинном цикле. В случае внешнего прерывания по фронту флаг IE0 или IE1 будет установлен, если две последовательные проверки входа (INT0 или INT1) покажут в одном машинном цикле "1", а в следующем "0". В этом случае на входе длительностью в один цикл должен быть высокий уровень, а за ним следовать длительностью в один цикл низкий уровень. Если внешнее прерывание активизируется по уровню, запрос должен удерживаться до начала обслуживания подпрограммы обработки прерывания и сниматься до завершения этой подпрограммы для предотвращения повторного обслуживания. В случае, когда прерывания по INT0 или INT1 вызываются уровнем, флаги IЕ0 или IЕ1 автоматически сбрасываются, а затем, если соответствующий Р3.2 или Р3.3 вход находятся в состоянии логического «0» вновь устанавливаются. Поэтому, в случае, когда прерывание по входам INT0, INT1 вызывается уровнем, программная установка в «1» флагов IЕ0, IЕ1 вызовет прерывание, после чего соответствующий флаг IЕ будет автоматически сброшен при переходе к подпрограмме обработки прерывания.

Прерывания от таймеров-счётчиков вызываются установкой флагов TF0 и TF1 регистра TCON, которые устанавливаются при переполнении соответствующих регистров таймеров-счётчиков. Кроме режима "3". Очистка флагов TF0 и TF1 производится аппаратно при переходе к подпрограмме обслуживания прерывания.

Прерывание от последовательного порта вызывается установкой флага прерывания приёмника RI или флага прерывания передатчика TI в регистре SCON. В отличие от всех остальных флагов, RI и TI сбрасываются только программным путём обычно в пределах подпрограммы обработки прерывания, где определяется, какому из флагов RI или TI соответствует прерывание. Каждый из перечисленных источников прерываний может быть индивидуально разрешён или запрещён установкой или сбросом бита в регистре IЕ. Регистр IЕ содержит бит ЕА, сброс которого в "0" запрещает сразу все прерывания. Необходимым условием прерывания является его разрешение в регистре IЕ. Все биты, которые вызывают прерывания (IЕ0, IЕ1, TF0, TF1, RI, TI) могут быть программно установлены или сброшены с тем же результатом, что и в случае их аппаратной установки или сброса. То есть прерывания могут программно вызываться или ожидающие обслуживания прерывания могут программно ликвидироваться. Кроме того, прерывания INT0 и INT1 могут вызываться программной установкой Р3.2=0 и Р3.3=0.

Рассмотрим пример программирования при использовании внешних прерываний. Пусть при поступлении сигнала на вход INT0 требуется инвертировать бит р1.0 порта р1, а при поступлении сигнала на вход INT1 необходимо инвертировать бит р1.3 того же порта. При этом оба прерывания должны быть активизированы по фронту. Код этой программы на ассемблере будет следующим.

sjmp m1 ; обход подпрограммы обработки прерывания для

; исключения захода в неё без появления запроса

; прерывания;

org 03H ; директива компилятору об установке первой команды

; под программы обработки прерывания от входа INT0 на

; вектор;

cpl p1.0 ; инверсия бита p1.0;

reti ; команда выхода из подпрограммы обработки прерывания

; от входа INT0;

org 13H ; директива компилятору об установке первой команды

; подпрограммы обработки прерывания от входа INT1 на

; вектор;

cpl p1.3 ; инверсия бита p1.3;

reti ; команда выхода из подпрограммы обработки прерывания

; от входа INT1;

;====================================================;

; установка значений битов в регистрах управления прерываниями;

m1: mov IE, # 00000101b ; индивидуальное разрешение прерывания

; от INT0 и INT1;

mov IP, # 00000100b ; присвоение прерыванию от входа INT1 старшего

; приоритета;

mov tcon, # 00000101b ; выбор вида реакции на сигналы прерывания

; INT0 и INT1 по фронту;

setb EA ; установка бита, снимающего блокировку

; индивидуально разрешённых прерываний;

m2: sjmp m2 ; бесконечный цикл для ожидания

; поступления сигналов прерываний;

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

 

Обработка прерываний и время отклика

 

Фиксация запроса на прерывание происходит в фазе S5P2 каждого машинного цикла. В этой фазе уровни на выводах INT0 и INT1 инвертируются и защёлкиваются (устанавливаются) во флаги прерывания IЕ0 и IЕ1, устанавливаются флаги прерывания от последовательного порта RI и TI, при переполнении таймеров-счётчиков устанавливаются флаги TF0 и TF1. Анализ (опрос флагов) выполняется внутренними средствами микроконтроллера в следующем после установки (защёлкивании) флагов машинном цикле (цикл опроса флагов). И только после выполнения последнего цикла текущей команды производится аппаратный вызов соответствующей подпрограммы обслуживания прерывания, эквивалентной команде LCALL (аппаратный LCALL). Обращение к подпрограмме обслуживания прерывания задерживается (блокируется) при выполнении хотя бы одного из следующих условий:

- уже производится обработка прерывания с таким же или высшим приоритетом;

- текущий машинный цикл (цикл опроса флага) не является последним циклом выполняемой команды;

- выполняемая команда текущей программы является командой RETI или любой командой обращения к регистрам IE, IP.

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

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


Схема реакции микроконтроллера на запрос прерывания приведена ниже:

Наиболее быстрой реакцией считается вариант, когда цикл 2 является последним циклом текущей команды, кроме RETI, команд обращения к IE и IP. Длительность этой реакции, если запрос установился к началу фазы S5P2, составляет 38 периодов. Наиболее медленной реакцией на прерывание является вариант, когда запрос формируется в состоянии S6Р1 цикла 1, (фиксация происходит в фазе S5P2 цикла 2, а цикл 3, где происходит опрос флага, будет началом команды МUL и DIV (48 TXTAL). Эта реакция составит 86 периодов тактовой частоты.

Если запрос прерывания с более высоким уровнем приоритета зафиксируется во время аппаратного вызова подпрограммы обслуживания прерывания с низким уровнем приоритета, а именно в фазе S5P2 1-го цикла аппаратной команды LCALL, то по окончании процедуры текущего вызова сразу же начнётся выполнение процедуры аппаратного вызова по поступившему запросу.

Аппаратно-реализуемая команда LCALL загружает содержимое счётчика команд РС в стек (при этом содержимое регистра PSW в стек не записывается), после чего записывает в РС адрес, соответствующей подпрограмме обработки прерывания. При этом в ячейку стека с младшим адресом загружаются разряды 0-7 счётчика команд, а в следующую ячейку стека – разряды 8-15 счётчика команд.

Подпрограмма обслуживания прерывания продолжается до выполнения RETI. Команда RETI восстанавливает состояние логики прерывания и загружает в счётчик команд 2 байта адреса возврата из 2-х верхних ячеек стека. Восстановление логики прерывания заключается в следующем: при переходе по вектору на подпрограмму обработки прерывания автоматически, до выполнения команды RETI, независимо от состояния бит регистра IE запрещаются все прерывания с уровнем приоритета, равным уровню приоритета обслуживаемого прерывания. Поэтому вложенные прерывания с равными уровнями приоритета невозможны. Команда RETI снимает этот запрет. При использовании команды RET восстанавливается только состояние счётчика команд, состояние логики прерывания команда RET не меняет, т.е. логика считает, что обслуживается прерывание, подпрограмма обработки которого была закончена командой RET.

 

 

Последовательный порт

 

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

Последовательный порт микроконтроллеров MCS-51 предназначен для обмена данными с внешними устройствами (персональным компьютером, микроконтроллерами, датчиками). Работа порта может происходить в одном синхронном режиме (режим 0) и трёх асинхронных режимах (режимы: 1, 2, 3). Поддерживается последовательный обмен в многопроцессорных системах.

Для обмена используются два сигнальных провода (линии TхD и RхD и провод земли. Под скоростью передачи понимается частота следования битов в байте. Единица скорости передачи бит/с (Бод) или соответственно в тысячу и миллион раз большие кбит/с (кБод) и Мбит/с (МБод).

При синхронном обмене синхросигнал выдаётся по линии (вывод Р3.1), а данные принимаются или передаются по линии (вывод Р3.0). В этом режиме обеспечивается максимально возможная скорость приёма и передачи данных с частотой ¦XTAL /12. Однако, этот режим используется для коротких (единицы метров) линий связи.

При асинхронном обмене данные передаются по линии TхD, а принимаются по линии RхD. Приём и передача данных могут происходить одновременно (так называемый дуплексный режим), поскольку регистр данных SBUF состоит из 2-х частей. Чтобы передать данные необходимо произвести запись в регистр SBUF, а для приёма информации необходимо прочитать содержимое регистра SBUF. Приёмник буферизирован, т.е. возможен приём следующего байта, когда предыдущий ещё находится в регистре SBUF. Однако, если подпрограмма обслуживания не успела прочесть байт данных к моменту завершения приёма следующего байта, то этот следующий принятий байт затрёт предыдущий. Приём и передача обслуживается битами прерывания RI и TI, которые формируют запрос прерывания (общий) от последовательного порта. Режимы асинхронного обмена отличаются скоростью передачи и числом бит в посылке (форматом кадра).

Применение различных скоростей передачи обусловлено, во-первых, уровнем искажений сигналов в линии связи, во-вторых, скоростными возможностями обмена внешних устройств. Чем длиннее линия связи, тем больше искажается сигнал, тем меньшей должна быть скорость передачи. Искажение проявляется увеличением длительностей переднего и заднего фронтов передаваемых импульсов напряжения. Оно обусловлено различной скоростью распространения по длинной линии гармоник прямоугольного импульса (дисперсией). В результате происходит перекрытие фронтов импульсов, что приводит к появлению ошибок при передаче данных. На рис. 27 изображены сигналы на входе линии и принятые сигналы на другом конце линии передачи после усиления. При передаче комбинации битов 101 принимается комбинация 111. Ошибка возникает при перекрытии переднего и заднего фронтов импульсов. При достаточном снижении скорости передачи в той же линии (рис. 28) перекрытия фронтов не происходит, и комбинация битов передаётся безошибочно.

Управляется последовательный порт с помощью установки требуемой комбинации битов в регистре SCON (Serial Control – управление последовательным портом):

 

Биты SСОN.7 SCОN.6 SCОN.5 SCОN.4 SCОN.3 SCОN.2 SCОN.1 SCОN.0
Обоз. SM0 SM1 SM2 REN TB8 RB8 TI RI

Цель управления – установка режима работы порта и формата кадра при передаче

Биты регистра SCON являются прямоадресуемыми. Биты SM0 и SM1 определяют режим работы в соответствии со следующей таблицей:

 

SM0 SM1 Режим Наименование Скорость передачи
Синхронный ¦XTAL /12
        8-ми битовый универсальный асинхронный приёмник/передат- чик (УАПП) 8 бит данных в кадре Переменная, задаётся Т/С1
9-битовый (УАПП) ¦XTAL /64 или ¦XTAL /32
9-битовый (УАПП) Переменная, задаётся Т/С1

Остальные биты имеют следующие значения:

SM2 – разрешение обмена в многопроцессорных системах. В режиме 0 должен быть установлен в 0, сброшен. В режиме 1 при SM2 = 1 бит RI не устанавливается, если принятый стоп-бит равен 0. В режимах 2 и 3 при SM2 = 1 бит RI не устанавливается, если принятый 9-ый бит данных RB8 = 0;

REN – разрешение приёма последовательных данных. При REN=1 приём разрешён. Устанавливается и сбрасывается программным обеспечением для разрешения и запрета приёма;

ТВ8 – девятый бит передаваемых данных в режимах 2 и 3. Устанавливается и сбрасывается обеспечением. Например, в него можно поместить значение бита Р. из регистра PSW для повышения достоверности передаваемой информации (контроль по паритету). Например, можно передавать чётное число единиц или только нечётное число единиц в байте.

RB8- девятый бит принятых данных в режимах 2 и 3. В режиме 1, если SM2 = 0, RB8 является принятым стоп-битом (в него заносится стоп-бит). В режиме 0 не используется.

TI - Флаг запроса прерывания передатчика. Устанавливается аппаратно в конце времени выдачи 8-го бита в режиме 0 или в начале стоп-бита в других режимах. Сбрасывается программным обеспечением (подпрограммой обработки прерывания от последовательного порта).

RI - Флаг запроса прерывания приёмника. Устанавливается аппаратно в конце времени приёма 8-го бита в режиме 0 или через половину интервала стоп-бита в режимах 1, 2, 3 при SM2 = 0. При SM2 = 1 смотри описание бита SM2. Сбрасывается программно (подпрограммой обработки прерывания от последовательного порта).

Кроме бита регистра SСОN последовательный порт управляется битом SMOD регистра PCON. В основном регистр PCON управляет режимами энергопотребления. Бит SMOD управляет опцией удвоения скорости обмена. При SMOD = 1 скорость обмена данными через последовательный порт в режимах 1, 2, 3 удваивается.

 

Асинхронные режимы (1, 2, 3)

 

Как и в синхронном режиме, в асинхронном (по-русски не синхронном) порт работает на базе сдвигового регистра, но 9-разрядного. В асинхронном режиме отсутствуют импульсы синхронизации приёма или передачи каждого бита, передающиеся от передатчика к приёмнику по отдельной линии, что лежит в основе синхронного режима. Здесь синхронизируется лишь момент начала обмена специальным старт-битом, который передаётся передатчиком перед посылкой каждого байта. Фронт старт-бита (переход из 1 в 0) привязывает фазу тактирующих импульсов приёмника к границе смены битов, посылаемых передатчиком. Для реализации асинхронного режима необходимо, чтобы период следования тактирующих импульсов приёмника был как можно ближе к периоду следования битов посылаемых передатчик. При обмене данными в асинхронном режиме микроконтроллер может одновременно передавать и принимать данные по линиям TxD и RxD соответственно. Такой режим называется дуплексным.

Асинхронные режимы 1, 2, 3 отличаются форматом кадра (число бит в посылке) и наличием фиксированной или переменной скорости передачи.

 

Режим 1

В режиме 1 приём/передача данных осуществляется в формате 8-ми разрядного УАПП (универсального асинхронного приёмопередатчика). В зарубежной литературе и технических описаниях он имеет аббревиатуру UART. Через TхD передаются, а через RхD принимаются 10 бит: старт-бит (0), 8-бит данных стоп-бит (1). При приёме стоп-бит заносится в бит RВ8 регистра SСОN. Скорость (частота) приёма/передачи определяется частотой переполнения Т/С1 ¦OV.

Рассмотрим схему синхронизации последовательного порта (рис. 31).

 
 

Схема синхронизации предназначении для задания временной сетки работы приёмника и передатчика порта. Подчеркнём, что импульсы синхронизации не выходят из порта во внешние линии передачи и приёма, а используются внутри приёмника и передатчика. При значении бита SMOD = 1 регистра PCON частота ¦1 импульсов, поступающих на вход двух делителей на 16, равна частоте ¦OV переполнения Т/C1. Если SMOD = 0, то частота переполнения предварительно делится на два и ¦1 = ¦OV/2. Делители на 16 предназначены для получения импульсов синхронизации приёмника СИНХР Rx и передатчика СИНХР Tx. Делители на 16 работают следующим образом. После прихода 16-и импульсов на вход делитель вырабатывает на выходе импульс синхронизации и вновь начинает счёт до 16-и. Два делителя на 16 обеспечивают дуплексную работу последовательного порта. Делитель на 16 приёмника сбрасывается с приходом старт-бита для совмещения импульсов синхронизации приёмника с границами смены битов, принимаемого байта. Делитель на 16 приёмника вырабатывает для специального устройства бит-детектора импульсы в фазах, прихода седьмого, восьмого и девятого импульсов, поступающих на вход делителя.

Рассмотрим работу последовательного порта при передаче в режиме 1 с помощью временной диаграммы (рис. 32).

Передача инициируется любой командой записи байта в регистр SBUF. Например, mov SBUF,@R0. В этом примере в регистр передатчика загружается байт из ячейки внутренней памяти данных (ОЗУ), адрес которой указан в регистре R0.

При выполнении команды записи в SBUF формируется импульс "Запись в SBUF", по которому предназначенный к передаче байт загружается в младшие восемь разрядов регистра сдвига передатчика. В девятый разряд регистра сдвига передатчика при этом заносится 1 (стоп-бит). Реально передача начинается в фазе S1P1 машинного цикла, следующего за ближайшим после импульса "Запись в SBUF" переполнением делителя на 16 вцепи сигнала "Синхр Тх". Таким образом, начало передачи синхронизировано делителем на 16 (импульсом "Синхр Тх"). Период сигнала "Синхр Тх" определяет время, в течение которого передаваемый бит будет находиться на выходе ТхD (время трансляции бита). Передача начинается установкой активного (низкого) уровня сигнала "Посылка". Его появление вызывает выдачу на выход TxD старт-бита (0). Через время трансляции одного бита, задаваемого сигналом "Синхр Тх", становится активным сигнал "Данные", который разрешает выдачу содержимого регистра сдвига передатчика на выход TxD (ввод Р3.0). При появлении этого сигнала старт-бит на выходе сменяется битом D0 регистра сдвига передатчика. По окончании времени трансляции бита D0 формируется импульс "Сдвиг". В результате содержимое регистра сдвига передатчика сдвигается на один разряд и бит D0 на выводе TxD сменяется битом D1.

 
 

Всего формируется 9 импульсов "Сдвиг". В результате на выход TxD выдаются 8 бит данных и стоп-бит. По окончании выдачи всех бит посылки устанавливается флаг прерывания передатчика TI и снимаются сигналы "Посылка" и "Данные". Далее точно таким же образом передаётся требуемое количество байтов.

Работа последовательного порта при приёме происходит в соответствии следующей временной диаграммой (рис. 33). Приём начинается при обнаружении перехода сигнала на входе RxD из 1 в 0. Для отслеживания такого перехода вход RxD аппаратно опрашивается с частотой f1. Это частота на входе делителя на 16 передатчика схемы синхронизации. Когда переход из 1 в 0 на входе RxD обнаружен, немедленно сбрасывается счётчик-делитель на 16 схемы синхронизации приёмника. В результате происходит совмещение моментов переполнения счётчика делителя на 16 схемы синхронизации с границами смены битов принимаемой посылки на входе RxD. Шестнадцать состояний счётчика-делителя на 16 делят время, в течение которого каждый бит принимаемой посылки присутствует на входе RxD, на 16 фаз. В фазах 7, 8 и 9 специальное устройство бит-детектор считывает со входа RxD три значения принимаемого бита. По мажоритарному принципу 2 из 3-х выбирает одно из них и подаёт его на вход регистра сдвига приёмника. При этом формируется импульс сдвиг для регистра сдвига приёмника. В результате содержимое регистра сдвига сдвигается на один разряд и принятый бит заносится в регистр сдвига приёмника. Всего формируется 10 импульсов "Сдвиг". Регистр сдвига является 9-разрядным. Поэтому после 10-го импульса "Сдвиг" в регистре сдвига приёмника находятся биты данных D0 – D7 и стоп-бит. Старт-бит теряется. После 10-го импульса "Сдвиг" данные из регистра сдвига загружаются в регистр SBUF, а стоп-бит загружается в разряд RB8 регистра SCON. Одновременно устанавливается флаг прерывания приёмника RI. Загрузка принятых данных в SBUF, стоп-бита в RB8 и установка флага RI происходит, если при генерации 10-го импульса "Сдвиг" выполняются следующие два условия: 1) RI = 0 и 2) либо SM2 = 0, либо принятый стоп-бит равен 1. В противном случае принятая посылка теряется, а флаг RI не устанавливается. Одновременно, независимо от выполнения приведённых условий, последовательный порт вновь начинает отслеживать переход из 1 в 0 на входе RxD.

 
 

Если мажоритарный отбор при приёме старт-бита показывает ненулевое значение, то сразу начинается отслеживание перехода из 1 в 0 на входе RxD.

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

 


<== previous lecture | next lecture ==>
Синхронизация микроконтроллера | Режимы 2 и 3 работы последовательного порта
lektsiopedia.org - 2013 год. | Page generation: 0.07 s.