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

Попытка записи в порт 212h не приведет ни к каким последствиям.

5.6.4. Некорректные операции

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

При работе схемы по оцифровке внешнего сигнала:

● чтение из порта 211h является корректной операцией и в результате приведет к получению флага занятости;

● запись в порт 211h не приведет изменениям в работе схемы, так как схема отключена от шины данных, а штатная обработка такого обращения не предусмотрена;

● чтение из порта 212h приведет к следующему. Будет выставлен сигнал , но данные получены не будут, так как высокий уровень сигнала с выхода D9 блокирует как чтение из микросхем памяти, так и подключение к шине данных. Им же заблокированы получение адреса от счетчика D7 и сигнала  от схемы выбора адреса. То есть полученные данные будут фиктивными. На текущее состояние работы схемы никакого влияния оказано не будет, однако при снятии сигнала выбора содержимое счетчика D7 будет увеличено на 1, что приведет впоследствии к ошибочному съему данных.

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

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

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

● запись в порт 210h приведет к сбросу схемы и запуску оцифровки, то есть текущая информация будет потеряна;

● чтение из порта 210h приведет к запуску одновибратора и открытию выходов формирователя D14, но не окажет влияния на остальную схему, поскольку запись в регистр D5 ведется только при обращении к порту 210h на запись, а работа АЦП блокируется низким уровнем сигнала с выхода D9; буферные схемы D18 и D20 заблокированы им же;

● чтение из порта 211h не будет некорректной операцией и приведет к получению флага занятости;

● запись в порт 211h не приведет к изменениям в состоянии микросхем памяти,  поскольку они подключаются к шине данных только на время обращения к порту 212h, более того, запись в них заблокирована низким уровнем сигнала с выхода D9. Записи в регистр также не будет, поскольку формирователь D14 отключен.

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

5.7. Программа-драйвер устройства

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

Для большего удобства оформим эти процедуры в отдельный модуль. В таком случае, подключение такого модуля к программе на Си можно выполнить директивой #include “имя_модуля.h”.

Содержимое файла driver.h:

/*Запуск преобразования. В качестве параметра передается требуемое число семплов */

void StartConversion(int NumOfSamples);

/*Получение флага готовности. Входных параметров не требует. Возвращает флаг готовности */

char GetBusyFlag(void);

/*Получение отсчетов в память. В качестве входных параметров принимается указатель на область памяти для хранения отсчетов и их количество */

void GetSamples(char* pSamples, int NumOfSamples);

Содержимое файла driver.c:

#include <conio.h>

#include “driver.h”

#include <alloc.h>

void StartConversion(int NumOfSamples)

{

     outp(0x0220, NumOfSamples+1);

}

char GetBusyFlag(void)

{

     return inp(0x0211);

}

void GetSamples(char* pSamples, int NumOfSamples)

{

     int i, tempNOS;

     short* pTempSamples;

     tempNOS++ = NumOfSamples/2;

     pTempSamples = (short*)calloc(tempNOS, sizeof(short));

     for (i=0; i<tempNOS; i++)

          pTempSamples[i] = inpw(0x0212);

     pTempSamples = (byte*)pTempSamples;

     for (i=0; i<NumOfSamples; i++)

          pSamples[i] = pTempSamples[i+1];

     free(pTempSamples);

}