У варианта с разветвителем есть несколько минусов: при расширении колличества подключенных устройств необходима модификация схемы, порт не сможет уже выполнять свои функции при использовании устройств со стандартными программами. Поэтому, я считаю, что проще использовать вариант с адресацией.
При этом если компьютеру нужно опросить устройство, он выставляет на ШД адрес. LPT-порт состоит из 3-х регистров(1 доступен только по записи, 1- только по чтению, 1-ипо записи и по чтению). При этом устройство, получая и опознав адрес, отвечает по доступному по чтению биту, и этим битом прерводит в Z-состояние шинники остальных устройств, исключая вмешательство их в работу. При этом ты работаеш так как если бы у тебя к порту было бы подключено только одно устройство. Закончив обмен информацией, компьютер прередает по другому биту доступного по записи порта сигнал завершения передачи, после чего устройство снимает сигнал занятости ШД.
Внешние устройства так же могут вызывать обмен с компьютером, выдавая сигнал занятости ШД, а на ШД выдавать свой адрес. Т.о. компьютер будет "знать", какое устройство его вызывает.
Так же устройства могут взаимодействовать и между собой. А выставив исуственно сигнал занятости (например, переключателем отключив от порта и соединив с лог. 0 или лог.1) можно полностью исключить влияние всех подключенных к порту устройств.
А програмно это будет выглядеть так:
Код:
|
#define ADRES1 0x00
#define ADRES2 0x01
int i=0,data_bus=0;
.
.
.
outport(0x378,ADRES1)
for(i=0;i‹10;i++)
{
sleep(100);
data_bus=inport(0x379);
if(data_bus & 1)
{
i=10;
//здесь организуешь обмен данными
.
.
.
outport(0x37a,1); //передаем сигнал завершения прердачи
}
} |