Синхронизация, магистральные циклы.
Синхронизация микроконтроллеров 8051 осуществляется с использованием внутреннего инвертирующего усилителя, который может быть превращен в синхрогенератор посредством подключения к выводам XTAL1 и XTAL2 внешнего кварцевого резонатора. Вывод XTAL1 является входом, а вывод XTAL2 выходом внутреннего усилителя. Для синхронизации может быть использован и внешний синхрогенератор. Схемы подключения внешнего резонатора и синхрогенератора приведены на рис. 3.6.
Внутри микроконтроллера частота внешнего синхросигнала делится на 2. Период внутреннего синхросигнала определяет длительность интервала времени, который фирма Intel называет состоянием Si («state»), а мы будем называть тактом. Этот интервал состоит из двух фаз Р1 и Р2. Более крупной единицей времени является машинный цикл, включающий шесть тактов S1..S6. По длительности он равен 12 периодам внешнего синхросигнала.
Машинный цикл сложит в основном для целей внутреннего микропрограммного управления. При описании последовательности сигналов или событий фазам в машинном цикле присваивают номера с S1P1 no S6P2. Цикл выполнения каждой команды состоит из одного, двух или четырех машинных циклов.
Рис. 3.6 - Подключение времязадающих цепей:
использование внутреннего генератора (а);
использование внешнего генератора для HMOS версии (б);
использование внешнего генератора для CHMOS версии (в)
Протоколы обмена микроконтроллеров семейства MCS-51 по магистрали реализованы в виде комбинаций следующих трех типов магистральных циклов (рис. 3.7):
• ввод кода команды из внешней памяти программ без обращения к внешней памяти данных;
• чтение из внешней памяти данных;
• запись во внешнюю память данных.
Первый тип магистрального цикла (рис. 3.7а) является основным, имеет длительность 6 тактов (12 периодов XTAL). Он характеризуется выработкой двух импульсов сигнала ALE, который служит для промежуточной фиксации младшего байта адреса при обращении к внешней памяти (из порта Р0 в регистр-защелку). В этом типе магистрального цикла сигнал ALE стробирует адрес памяти программ, источником которого является счетчик команд (регистры РСН и PCL). Сигнал PSEN# является сигналом чтения кода из внешней памяти программ. В этом типе магистрального цикла он также вырабатывается дважды. Оба сигнала становятся активными первый раз на фазе S1P2, а второй раз на фазе S4P2. Во время второй выборки производится чтение следующего байта кода. Если этот байт в данной команде не нужен, он игнорируется, а счетчик команд не инкрементируется. Этот тип магистрального цикла является основным, поскольку отсутствие обращения к внешней памяти данных позволяет реализовать с его помощью самые короткие команды (рис. 3.8а,б) длительностью в один машинный цикл (6 тактов, 12 периодов Fosc). Поскольку сигнал ALE вырабатывается постоянно, с частотой Fosc/6, он может быть использован для целей внешней синхронизации.
Второй тип магистрального цикла (рис.3.76) имеет длительность 12 тактов и характеризуется тем, что второй сигнал ALE на фазе S1P2 второго машинного цикла не вырабатывается. Сигнал PSEN# остается пассивным с фазы S4P2 первого машинного цикла до фазы S6P1 следующего цикла, запрещая чтение байта кода. Второй импульс сигнала ALE стробирует фиксацию адреса памяти данных, источником которого в микроконтроллере является регистр DPTR (DPH и DPL) или регистр Ri (при косвенной адресации). Во втором случае содержимое регистра выдается через порт Р0, а старшие восемь разрядов определяются значением в регистре порта РО. Далее, начиная с фазы S1P1 первого цикла до фазы S4P1 второго цикла, становится активным сигнал RD#. Он стробирует ввод данных через порт Р0. Последующие импульсы сигналов ALE и PSEN# вводят код следующего байта команды.
Третий тип магистрального цикла (рис. 3.7в) имеет длительность 12 тактов и в основном аналогичен второму типу. Отличие заключаются в том, что активным становится сигнал разрешения записи WR#.
Особенностью архитектуры MCS-51 является то, что циклы всех команд формируются из циклов магистрали и имеют строго определенную длительность. Примеры циклов ряда характерных команд приведены на рис. 3.8.
Самыми короткими по времени выполнения являются однобайтные и двухбайтные команды, выполняемые за один машинный цикл (рис. 3.8а,б). Это команды с быстрыми операциями, не использующие обращений к внешней памяти данных. В однобайтных командах (рис. 3.8а) информация хранится в ячейках внутренней памяти данных или регистрах. По второму импульсу сигнала ALE читается код операции следующей команды, который игнорируется. В начале следующей команды он читается вновь. В двухбайтных командах (рис. 3.86) во втором байте хранятся данные, либо адрес внутренней ячейки памяти. В этом случае второй импульс ALE стробирует ввод второго байта текущей команды.
а) Выборка из внешней памяти программ
б) Чтение из внешней памяти данных
в) Запись во внешнюю память данных
Рис. 3.7 - Типы магистральных циклов
а) Команды 1 байт, 1 цикл, например INC A
б) Команды 2 байта, 1 цикл, например ADD A,#data
в) Команды 1 байт, 2 цикла, например INC DPTR
г) Команда MOVX (1 бант, 2 цикла)
Рис. 3.8 - Примеры циклов команд
Еще одну группу характерных команд составляют однобайтные команды длительностью два машинных цикла (рис. 3.8в). Это команды с медленными операциями, не использующие обращений к внешней памяти данных. Такими операциями являются, например, наращивание указателя данных DPTR, операции умножения и деления, возврат из подпрограммы. В командах такого типа после чтения кода операции по первому сигналу ALE три раза подряд выбирается один и тот же следующий байт кода, который игнорируется.
Короткими, но медленными, являются команды типа MOVX с обращением к внешней памяти данных. Они однобайтные, но выполняются за два машинных цикла (рис. 3.8г). После выборки кода операции команды по первому импульсу ALE следующий импульс выбирает следующий байт кода, который игнорируется. Далее импульс ALE стробирует адрес внешней памяти данных, по которому производится операция чтения или записи. По последнему импульсу ALE вводится следующий байт кода.