Проектирование устройств сопряжения (1083567), страница 24
Текст из файла (страница 24)
outportb(CONTROL, DIVISOR);
//Запись младшего и старшего байт делителя:
outportb(LOW_DIV, В_9600);
outportb(HIGH_DIV, B_9600 >> 8);
//Запись управляющего слова, соответствующего выбранному режиму:
outportb(CONTROL, BIT_8+STOP_2+NOPARITY);
//Запрет прерываний:
outportb(INT_REG, 0);
}
Теперь приведем текст функции передачи байта:
int out_sym(int symbol)
{
long timeout;
timeout=clock();
//Ожидаем окончания передачи предыдущего байта, ]
//следя за временем передачи:
do
{
if((clock() - timeout) == 3)
return -1; //Время истекло
while ((inportb(STATUS) & DATA_OUT) == 0);
//Предыдущий байт передан успешно, передаем дальше:
outportb(OUT_REG, symbol);
}
return 0;
}
Функция clock(), описанная в файле TIME.H, возвращает значение системной переменной, которая увеличивается на 1 каждые 55 мс (по прерываниям от системного таймера). Таким образом, возврат по условию ((clock()-timeout) == 3) означает невозможность передать предыдущий символ за время, большее 110 мс, что с избытком превосходит время, необходимое для передачи байта даже при работе на скорости 110 бит/с. Такая ситуация может возникнуть если, например, отвалился провод, по которому на микросхему УАПП поступает тактовая частота, или она (микросхема) сгорела на работе да так, что бит DATA_OUT постоянно находится в состоянии 0.
Немногим сложнее выглядит функция приема байта:
int in_sym (int *symbol, timeout, *error_code)
{
long tmp;
tmp=clock();
//Ожидаем приема байта, следя за временем:
do
{
if((clock() - tmp) >= timeout)
return 1; //Время истекло
*error_code=inportb(STATUS);
} while ((*error_code & DATA_IN) == 0);
//Может, была ошибка при приеме?
if((*error_code & (FRAME_ERR+OVERRUN)) != 0)
{
//Тогда возвращаем соответствующий код:
return 2;
}
else
{
*symbol=inportb(IN_REG); return 0;
}
}
Для надежного приема байта отнюдь не следует безмерно увеличивать значение timeout (например, до одной недели), поскольку если всего лишь не подсоединен разъем RS-232C, выйти из программы окажется невозможно.
Напишем небольшую программу, которая будет проводить внутренний тест передачи-приема вводимых с клавиатуры символов. Параметром запуска будет служить номер последовательного порта 1 - СОМ1, 2-СОМ2. По умолчанию будем работать с портом СОМ 1.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "serial.h"
#define ESC 27
main(int argc, char *argv[])
{
int tmpint, //Переменная для всяких нужд
symbol, //Символ для передачи
symbol2, //Символ для приема
error_code; //Код ошибки для функции in_sym()
if(argc == 1) //Если нет параметров
{
BASE=0x3F8;
}
else //Если есть:
{
sscanf(argv[1], "%d", tmpint);
if(tmpint == 1)
{
BASE=0x3F8;
}
else
{
BASE=0x2F8;
}
}
//Инициализируем порт
init_ser();
//Переводим его в режим внутреннего теста:
outportb(MODEM, LOOPBACK);
//"Вечный" цикл:
while(1)
{
symbol=getch();
if(symbol == ESC) exit(0);
if(out_sym(symbol) != 0)
{
printf("\nОшибка передачи !");
exit(1);
}
else
{
if(in_sym(&symbol2, 10, &error_code) != 0)
{
printf("\nОшибка приема !");
exit(2);
}
else //Т.е. нет ошибки приема
{
printf("\nПередано: %02Х Принято %02Х", symbol, symbol2);
}
}
} /* конец вечного цикла while */
} /* конец функции main */
4.6. Отладка контроллеров на базе однокристальной микроЭВМ
Как уже отмечалось в первой главе, особенность контроллеров, содержащих микроЭВМ, состоит в том, что, с одной стороны, их схемотехническое проектирование довольно просто (обычно используются стандартные схемы включения), а, с другой стороны, они требуют специальных средств для разработки и отладки программного обеспечения. Достоинством таких контроллеров является их высокая гибкость и универсальность, а недостатком (по сравнению с УС на жесткой логике) — малое быстродействие.
В процессе отладки рассматриваемых контроллеров можно выделить два этапа. Первый из них предполагает проверку функционирования аппаратной части. То есть в основном требуется проверить правильность разводки печатной платы и исправность использованных микросхем (схема соединения - стандартная). На втором этапе требуется проверить реальное функционирование всего контроллера в целом, включая и программное обеспечение однокристальной микроЭВМ. Здесь надо уже быть уверенным, что аппаратура работает нормально.
Следует отметить, что при отладке аппаратуры (на первом этапе) нельзя полностью проверить исправность самой однокристальной микроЭВМ, так как проконтролировать правильность выполнения всех команд и всех возможных последовательностей команд чисто физически невозможно (как и для любого микропроцессора). Но обычно этого и не требуется. Если выяснится, что данная микросхема не выполняет должным образом требуемые программы, ее можно просто заменить.
Таким образом, отладка аппаратуры контроллера будет сводиться практически только к отладке элементов обрамления (внешние ОЗУ и ППЗУ, регистры, буферы, схема управления, внешние порты). При этом микросхему микроЭВМ надо удалить и эмулировать ее циклы обмена с помощью специальных отладочных средств. В качестве таких средств очень удобно использовать персональный компьютер и универсальный контроллер параллельного обмена информацией, описанный во второй главе. Эмуляция производится аналогично случаю системы статической отладки для УС, сопрягаемых с ISA (см. раздел 2.3.1). При этом внешние линии контроллера параллельного обмена с помощью кабеля присоединяются к выводам контактирующего устройства (панельки, колодки) микроЭВМ. После проведения полного цикла отладки аппаратуры можно вставлять обратно микросхему микроЭВМ и переходить к отладке программного обеспечения (точнее к совместной проверке аппаратуры и программ).
В принципе, отладку программного обеспечения можно проводить полностью на персональном компьютере, используя программную модель нашего устройства. Но в этом случае не стоит сильно удивляться, когда прекрасно работающая на модели программа будет вести себя совсем не так хорошо в реальности. Любая модель по определению ограничена. Поэтому гораздо разумнее проверять функционирование программ непосредственно на плате УС. Для этого совсем не надо каждый раз перезаписывать программное ППЗУ микроЭВМ (рассматриваем случай с внешним ППЗУ), достаточно использовать эмулятор ППЗУ, подключенный к компьютеру и соответствующие программные средства.
Идея эмулятора ППЗУ очень проста. Коды управляющих программ контроллера, написанных и оттранслированных с помощью персонального компьютера, мы записываем в ОЗУ, которое затем включается в схему контроллера вместо ППЗУ. После этого проверяется работа контроллера в целом. В случае необходимости программы очень легко поменять и снова перезагрузить их в ОЗУ. Полностью отлаженные на реальной рабочей схеме контроллера программы записываются в ППЗУ. Таким образом, процесс отладки существенно упрощается.
Рис. 2.14. Структурная схема эмулятора ППЗУ.
Структура эмулятора (рис. 2.14) помимо собственно микросхемы ОЗУ объемом 32 К х 8 содержит интерфейсную часть (ИЧ), 15-разрядный регистр адреса, 16-разрядный двухканальный мультиплексор адреса и сигнала выбора ОЗУ и два 8-разрядных буфера данных. Схема работает в одном из двух возможных режимов (сигнал РЕЖИМ): записи информации из компьютера в ОЗУ и эмуляция ППЗУ.
В режиме записи информации ОЗУ находится в состоянии записи, мультиплексор пропускает на свои выходы код адреса ОЗУ с регистра адреса, нижний (по схеме) буфер данных открыт и пропускает на входы данных ОЗУ данные с ИЧ, верхний (выходной) буфер данных закрыт. Для записи каждой ячейки ОЗУ сначала в регистр адреса по сигналам ЗА1 и ЗА2 записывается адрес этой ячейки, а затем в нее производится запись данных по сигналу ЗД.
В режиме эмуляции ОЗУ переводится в режим чтения, мультиплексор пропускает адрес и сигнал CS с отлаживаемого контроллера, нижний буфер данных закрыт, а верхний (выходной) передает данные из ОЗУ на отлаживаемый контроллер. То есть ОЗУ выступает в качестве ППЗУ.
Сопряжение эмулятора с компьютером можно осуществлять различными способами: через ISA, через Centronics и даже через RS-232С (так как протокол обмена предельно прост, и скорость обмена с компьютером абсолютно некритична). Стоит отметить, что для отладки самой схемы эмулятора весьма полезной оказывается возможность проверки правильности информации, записанной в ОЗУ. Для реализации этого режима требуется использовать двунаправленный буфер данных для обмена с ИЧ. Но схема эмулятора при этом несколько усложнится, и протокол обмена с ней уже не будет настолько простым.
Приложения
Приложение 1. Габаритные размеры платы ISA
На рис. П.1 приведены габаритные размеры платы ISA, a также размеры всех разъемов и вырезов платы. Отметим, что на рисунке указана только максимальная длина платы, но эта длина может изменяться и ограничена она снизу только размерами одного разъема (правого по рисунку) для 8-битных устройств или размерами двух разъемов для 16-битных устройств.
Расстояния между центрами печатных проводников контактов разъемов должны составлять 2,54 мм.
Платы должны изготавливаться из фольгированного стеклотекстолита толщиной 1,6 мм (отклонение не больше 0,2 мм). Коробление платы не должно превышать 1,3 мм на всей длине платы. Максимальная высота компонентов на собранной плате не должна превышать 10 мм.
Рис. П.1. Размеры печатной платы ISA (все размеры в миллиметрах).
Приложение 2. Другие интерфейсы компьютера типа IBM PC
Системная магистраль EISA
Магистраль EISA (Extended Industry Standard Architecture) была предложена в 1989 году рядом наиболее крупных производителей компьютеров типа IBM PC (AST, Compaq, Epson, Hewlett-Packard, NEC, Olivetti, Tandy, Wise и Zenith). Необходимость разработки такой магистрали стала ясной, когда выяснилось, что быстродействие магистрали ISA становится сдерживающим фактором на пути повышения производительности компьютеров на базе новых процессоров (i80386, i486 и т.д.). Компьютеры нового поколения должны были обеспечивать 32-разрядный обмен, в том числе в режиме ПДП, автоматическую конфигурацию системы и некоторые другие возможности, недоступные для ISA. Фирма IBM предлагала для этих целей свою магистраль MCA (Micro Channel Architecture), которая однако была полностью несовместима (как по сигналам, так и по разъему) с ISA, что предполагало полный отказ от всех изготавливавшихся ранее плат расширения.
EISA явилась не революционным, как МСА, а эволюционным шагом в развитии архитектуры, что обеспечило ей гораздо больше шансов на развитие. Она, с одной стороны, имела все преимущества высокопроизводительной 32-разрядной шины, а с другой стороны, была полностью совместима с ISA "сверху вниз" и не требовала перехода на совершенно новую элементную базу. Вообще говоря, новую магистраль предполагалось использовать, в первую очередь, в высокоскоростных файл-серверах, но ее достоинства обеспечили ей более широкий спектр применения.
Разработчики новой магистрали позаботились не только об информационной и электрической, но и о конструктивной совместимости с ISA. Разъем EISA состоит из двух рядов контактов, один из которых (верхний) предназначен для сигналов ISA, а другой (нижний) — для дополнительных сигналов EISA. Поэтому в EISA-разъемы можно вставлять также 8- или 16-разрядные ISA-платы.
EISA имеет 32 разряда адресной шины, что позволяет адре совать до 4 Гбайт памяти. Предельная скорость передачи информации по ней в специально предусмотренном так называемом пакетном режиме может достигать 33 Мбайт/с. На магистрали может находиться несколько задатчиков, включая, конечно, центральный процессор, контроллер ПДП, контроллер регенерации динамической памяти. Управление предоставлением магистрали централизованно выполняется специальным арбитром по циклическому принципу. Для арбитража используются особые линии магистрали, индивидуальные для каждого разъема расширения (всего таких разъемов не может быть более 15).
По сравнению с ISA в EISA добавлено несколько новых сигналов:
ВЕ0 ... ВЕЗ — разрешение байтов;
М/IO — память/устройство ввода/вывода — признак типа цикла обмена;
-START — идентификация начала цикла магистрали;
-CMD — разрешение управления временной диаграммой цикла магистрали;
-MS BURST — признак групповой (пакетной) передачи от за-датчика;
-SL BURST — признак групповой (пакетной) передачи от исполнителя;
-ЕХ32, ЕХ16 — признак 32- и 16-разрядных данных;
EXRDY — идентификация окончания цикла магистрали текущим задатчиком;
-MREQ k — признак запроса на захват магистрали от k-го потенциального задатчика (возможно объединение запросов по ИЛИ). Сигнал индивидуален для каждого из 15 разъемов расширения магистрали;
-MACK k — признак разрешения на захват магистрали k-му задатчику. Сигнал индивидуален для каждого из 15 разъемов расширения магистрали;
D16 ... D31 — дополнительные разряды данных;
LA2 ... LA16, LA24 ... LA31 — дополнительные разряды адреса (не фиксируемые до конца цикла, как и LA17 ... LA23 в ISA), распределение дополнительных сигналов по нижней части магистрального разъема EISA представлено в табл. П.1. Специальные механические ключи, устанавливаемые в нижней части разъема, обеспечивают возможность правильного использования ISA- и EISA-совместимых модулей.
Контакт | Сигнал |
А1 | -CMD |
А2 | -START |
A3 | EXRDY |
А4 | ЕХ32 |
А5 | GND |
А6 | Kod |
А7 | EX16 |
А8 | -SL BURST |
А9 | -MS BURST |
А10 | W/R |
А11 | GND |
А12 | RES |
А13 | RES |
А14 | RES |
А15 | GND |
А16 | Kod |
А17 | BE1 |
А18 | LA31 |
А19 | GND |
А20 | LA30 |
А21 | LA28 |
А22 | LA27 |
А23 | LA25 |
А24 | GND |
А25 | Kod |
А26 | LA15 |
А27 | LA13 |
А28 | LA12 |
А29 | LA11 |
А30 | GND |
А31 | LA9 |
В1 | GND |
В2 | +5 В |
ВЗ | +5 В |
В4 | X |
В5 | X |
В6 | Kod |
В7 | X |
В8 | X |
В9 | + 12 В |
В10 | М/IO |
В11 | LOCK |
В12 | RES |
В13 | GND |
В14 | RES |
В15 | ВЕ3 |
В16 | Kod |
В17 | BE2 |
В18 | ВЕ0 |
В19 | GND |
В20 | +5 В |
В21 | LA29 |
В22 | GND |
В23 | LA26 |
В24 | LA24 |
В25 | Kod |
В26 | LA16 |
В27 | LAM |
В28 | +5 В |
В29 | +5 В |
В30 | GND |
В31 | LA10 |
С1 | LA7 |
С2 | GND |
СЗ | LA4 |
С4 | LA3 |
С5 | GND |
С6 | Kod |
С7 | D17 |
С8 | D19 |
С9 | D20 |
С10 | D22 |
С11 | GND |
С12 | D25 |
С13 | D26 |
С14 | D28 |
С15 | Kod |
С16 | GND |
С17 | D30 |
С18 | D31 |
С19 | MREQ k* |
D1 | LA8 |
D2 | LA6 |
D3 | LA5 |
D4 | +5 В |
D5 | LA2 |
D6 | Kod |
D7 | D16 |
D8 | D18 |
D9 | GND |
D10 | D21 |
D11 | D23 |
D12 | D24 |
D13 | GND |
D14 | D27 |
D15 | Kod |
D16 | D29 |
D17 | +5 В |
D18 | +5 В |
D19 | MACK k* |
Табл. П.1. Дополнительные контакты разъема EISA (Kod — ключ, RES — резерв, X — географическая адресация, * — раздельные линии для каждого разъема магистрали).