Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Практическая реализация




Begin

Var

Asm

End.

Begin

Var

End.

Begin

Var

End.

Begin

Var

base: integer;

base:=$3F8; {Присвоение переменной base баз. адреса}

port[base+4]:=2; {Установить RTS}

readln; {Ждать нажатия Enter}

port[base+4]:=0; {Сбросить все выходы порта}

 

Эти строчки приведут к установке +12в на выводе 7 порта.

Сразу напрашивается вопрос - как запитать несколько выходов сразу. Ответ - просто сложить коды выходов. Например, мы хотим «зажечь» выходы RTS и DTR. Тогда пишем:

port[base+4]:=3;

 

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

 

port[base+4]:=port[base+4] and (not 2);

 

 

Для экспериментов с портом удобно собрать индикатор, состоящий из вилки DB-9F и припаянных к ней светодиодов последовательно с резистором на 1.5 кОм между GND и нужным выходом (Рис. 1). Зачем два светодиода? Просто для COM порта логической единице на входе приемника соответствует уровень напряжения -3... -12 В. Логическому “0” соответствует напряжение +3... +12 В. Между уровнями +3... -3 В существует зона нечувствительности, обуславливающая гистерезис приемника. Состояние на выходе приемника изменяется только при пересечении напряжением порога +3 или -3 В. Таким образом, в отличие от LPT, где используются ТТЛ уровни (уровень “1” при токе нагрузки 14 мА, не менее +2.4 В, уровень “0” при токе нагрузки 14 мА, не более +0.4 В) одной полярности, у COM-а полярность сигнала меняется от -12 до +12 вольт. При этом ток нагрузки на один выход COM порта не должен превышать 10 мА.

Но это ещё не всё. Логика в COM порту ещё и инверсная! Это значит, что активным уровнем у неё считается ноль, а пассивным – единица. Таким образом, «зажигая» вывод, мы устанавливаем на нём “0” (+12в), а «сбрасывая» - “1” (-12в). Это нужно учитывать.

Теперь разберёмся, как читать состояние входов.

Как уже говорилось выше, порт возвращает “0”, если на входе “0”, и “N”, если на данном входе “1”. Причём в некоторых случаях (особенно, при работе с LPT) “N” может быть равно сумме кодов ножек, если “1” присутствует не на одном входе.

Осуществляется приём следующим образом:

e:=port[b+n] and m;

Где:

e – переменная типа byte, в которую сохраняют принятое значение.

b – адрес БР порта.

n – номер подрегистра.

m – весовой коэффициент входа (см. таблицу 1).

Для проверки этой записи соединим перемычкой выход RTS(7) и вход CTS(8) и запустим приведённый ниже код:

program prim2;

uses crt,dos;

base,result: integer;

e:byte;

base:=$3F8;

port[base+4]:=2; {Установить RTS}

e:=port[base+6] and 16; {Присвоить e состояние CTS}

if e=16 then result:=1 {Если e=16, то result=1}

else result:=0; {...иначе result=0}

writeln('Принятое состояние = ',result); {Вывод результата}

readln; {Ждать нажатия Enter}

port[base+4]:=0; {Сбросить все выходы порта}

 

На экране должно появиться сообщение: «Принятое состояние = 1».

Отправляя в порт значения от 0 до 3 можно видеть, как изменяется состояние на любом выходе.

К сожалению, работать таким образом с выводами TxD и RxD нельзя, т.к. они относятся к асинхронному приёмопередатчику, встроенному в контроллер порта. Работает он по протоколу RS232 и управление им куда боле сложное.

Настало время LPT.

Приёмы работы с ним абсолютно такие же, однако надо помнить, что LPT способен работать аж в 4 режимах (Centronics, SPP, ЕРР, ЕСР) и их вариациях. Причём в каждом режиме назначение и активный уровень выводов могут отличаться. Режим, устанавливающийся ОС при загрузке по умолчанию - SPP (Standart Parallel Port). Переключать режимы из своей программы можно записывая “1” в соотв. биты управления.

 

Сигнал. Контакт вилки DB-25F. Направление. Подрегистр. Вес.
DATA 0   Передача (SPP).    
DATA 1   Передача (SPP).    
DATA 2   Передача (SPP).    
DATA 3   Передача (SPP).    
DATA 4   Передача (SPP).    
DATA 5   Передача (SPP).    
DATA 6   Передача (SPP).    
DATA 7   Передача (SPP).    
Error   Приём.    
Select   Приём.    
PaperEnd   Приём.    
/Busy   Приём.    
Ack   Приём.    
/Selectln   Передача.    
Init   Передача.    
/AutoLF   Передача.    
/Strobe   Передача.    
GND 18-25 Земля. Х Х

 

Как видно, порт имеет 3 ПР. [base+0], или просто [base] – это основной регистр порта. Служит для вывода информации на ножки DATA0(2) – DATA7(9). Как и в COM, для того, чтобы зажечь конкретную ножку, нужно послать в [base] её код. Несколько – сумму кодов. Это очень удобно, т.к. порт сам преобразует десятичное число (в диапазоне 0-255) в обычный 8-и разрядный код. Таким образом, к выводам порта можно напрямую подключать ЦАП-ы, микросхемы-драйверы 7-и сегментных индикаторов и т.д.

Например, подключив к LPT микросхему КР514ИД1(ИД2) можно выводить числа на внешний 7-и сегментный дисплей. Пример такой схемы можно увидеть здесь: (http://ra9wof.qrz.ru/files/Shemes/Digital/kr514id.htm). Простейший код для этой схемы такой:

program prim3;

uses crt,dos;

base,data: integer;

Randomize; {Инициализация генератора сл. чисел.}

base:=$378;

repeat {Повторять…}

data:=random(9); {data = сл. число от 0 до 9}

Port[base]:=data; {Отправить data в порт}

Delay(600); {Задержка.}

Until KeyPressed; {…пока не нажата любая клавиша.}

Port[base]:=0; {Сбросить все выводы.}

 

Данная программа генерирует случайное число от 0 до 9 и отправляет его в порт. Порт выдвигает на выводы его 8-и разрядный код (но мы используем лишь первые 4 разряда), который преобразуется микросхемой-драйвером в код для семисегментного индикатора, который и отображает его в привычной нам десятичной форме.

Микросхем может быть и две (входы первой м-мы подключают к разрядам 0-3, второй – к 4-7). Тогда можно выводить числа от «00» до «99». Только в этом случае лучше применить микросхемы К176ИД2(ИД3) или аналогичные, без псевдографики.

Прежде чем выводить числа на двухразрядный дисплей, их надо преобразовать в BCD (Binary Coded Decimal) представление.

Например, если требуется на индикаторе показать число 16 (десятичное), то в порт надо записать 0x16h, что является представлением числа 16 (десятичное) в формате BCD. Как очевидно, 0x16h = 22 (десятичное), что не одно и то же.

Например: (число в формате integer -> код для записи в порт)

0x09h -> 0x09h
0x0Ah -> 0x10h
0x0Bh -> 0x11h
...
0x10h -> 0x16h
0x11h -> 0x17h
...
0x16h -> 0x22h
и т.д.

Указанная операция в pascal/delphi выполняется следующим образом:

Port[base]:=((data div 10) shl 4) or (data mod 10);

Где data – исходный байт.

 

Подрегистры [base+1] и [base+2] являются служебными. Первый - для чтения битов состояния, второй - для записи битов управления. Работают с ними так же, как с RTS и CTS COM-а. Единственной особенностью [base+2] является то, что 4 (16) и 5 (32) биты являются настроечными. Если Ваш компьютер поддерживает стандарт ЕРР (все компьютеры, начиная с Пентиум1), то чётвёртым битом Вы сможете разрешить прерывание от принтера (“1” - разрешить прерывание по спаду ACK(10)), а пятым битом перевести линии порта d0-d7 в режим принятия данных (“1” - режим ввода, “0” - режим вывода).

Значок «слеш» (/) перед наименованием сигнала означает, что данный сигнал инвертирован. Для инвертированных линий активным уровнем считается “0”, а пассивным “1”.

Так, выходы 1, 14, 17 порта являются инвертированными. Это значит, что по умолчанию на них высокий уровень напряжения. На выходе же 16 по умолчанию уровень низкий. Отправляя в этот ПР весовые коэффициенты инвертированных ножек мы будем «гасить» соотв. вывод. “Ноль”, посланный в порт, «зажгёт» все выходы (кроме 16), а число “15” (битов то всего 4) изменит состояния на противоположные.

Аналогично для входов: при отключённом передатчике на инверсных входах будет держаться “1”, а на прямых “0”.

В любом случае, не пренебрегайте инициализацией! Какое бы состояние ни должно выставиться на выходах по умолчанию (даже если оно Вас устраивает), хорошим тоном программирования является «ручная» установка этого состояния из программы при её старте (т.к. по целому ряду причин начальное состояние выходов порта разных компьютеров может отличаться). Это существенно повышает надёжность проектируемой системы.

Также следует отметить, что вход ACK соединен с питанием +5 В через резистор 10 кОм. Это сделано для исключения ложных прерываний, т.к. прерывание генерируется по отрицательному перепаду сигнала на входе ACK.

 

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

 

MOV DX,0378H;DX теперь содержит адрес порта.

MOV AL,data;data - то, что послать. Тип byte.

OUT DX,AL;Запись байта в регистр данных.

IN AL, DX; Читаем регистр данных.

end;

 

К слову сказать, запись [$378+1] эквивалентна записи [$379]. Так что в указанном коде можно сразу указывать адрес к нужному ПР и не производить лишнее сложение программно.

Можно поступить и проще. Для Дельфи был разработан модуль vv55rWin, содержащий процедуры работы с портами, написанные на ассемблере указанным выше способом. Его (а так же его исходник) можно найти в папке Progy\Unit.

Называются эти процедуры inport(port) и outport(port,aa,data). Где:

port – полный адрес к нужному ПР.

data – информация, отправляемая в порт.

aa – зарезервированный параметр, всегда должен быть нулевым.

Например, программа prim2 в переводе на «Дельфийский» примет вид:

 

 

aa,e:word;

port,base,data:word;

{.........}

aa:=0;

base:=$3F8;

port:=base+4;

data:=2;

outport(port,aa,data);

sleep(10);

port:=base+6;

e:=inport(port) and 16;

port:=base+4;

data:=0;

outport(port,aa,data);

end;

 

Управлять конкретными выводами порта из под Дельфи можно и с помощью API. Это хоть и сложнее, зато такая программа будет работать на любом Windows, в т.ч. на NT, 2000, XP (приведённые выше примеры работоспособны лишь в 95/98/МЕ). Вот и всё по работе на низком уровне.

Не раз на страницах журналов и в сети встречалась идея применения лазерной указки в охранной технике. Было предложено немало схем блоков контроля, однако ни одна из них не сравнится с возможностями даже самого древнего 286 компьютера. Простая приставка к COM порту компьютера и несложная программа под ДОС способны создать неприступный барьер даже для сравнительно хорошо экипированного взломщика.

Принцип работы системы таков: программа в цикле, с помощью функции Randomize, вычисляет случайное число. Это число преобразуется в N разрядный двоичный код, который сохраняется в N разрядном массиве. Далее, этот массив побитно читается и биты передаются через выход RTS (и далее – через луч указки) на фотоприемник, сигнал с которого усиливается элементами DD1.4 – DD1.3, подключёнными ко входу CTS COM порта. Далее код снова преобразуется в десятичную форму и сравнивается с отправленным. Если равенство не выполняется M раз подряд, программа выставляет “1” на выходе DTR (и на RTS, чтобы луч во время тревоги не гас), к которому подключено исполнительное устройство (сирена, пиропатрон и т.п.) на время T.

Константы N, M и T можно изменять в широких пределах. Например, чем больше N, тем больше возможных комбинаций будет иметь код (их число определяется по формуле 2N), но тем больше времени потребуется на передачу N бит, ведь частотные возможности светодиода указки не безграничны, да и фотодиоды имеют достаточно большое время восстановления после засветки.

Таким образом, перекрытие луча или засвечивание фотоприёмника взломщику не поможет. Также, становится невозможным подбор кода для подмены, ведь он меняется по случайному закону. Единственный способ нелегально отключить систему – добраться до компьютера.

Схема приставки изображена на рис. 2:

Рис. 2. Принципиальная схема приставки.

 

Микросхема DD1 выполняет сразу несколько функций – преобразователя уровня (за счёт свойств её входных и выходных каскадов), усилителя для фотодиода и фильтра помех (т.к. имеет входной гистерезис 400 мВ). Резистор R5 подбирают исходя из требуемой яркости свечения лазера. С одной стороны, чем ярче он светится, тем чётче реагирует на него фотоприёмник. С другой же стороны, чем больший ток течёт через светодиод, тем быстрее идёт его деградация. Учитывая невысокое качество изготовления китайских указок, такой излучатель прослужит недолго.

Для питания у-ва можно использовать сам компьютер, подключив вход платы к свободному шлейфу питания БП (контакты +5В и GND). Если доступа внутрь компьютера нет, +5В можно взять с гнезда USB, однако нагрузка на него не должна превысить 1А.

Приставка может работать и совместно с LPT. В этом случае номиналы R1 и R2 следует уменьшить до 100 Ом.

Все резисторы – МЛТ 0,125. Конденсатор С1 – К50-35 или аналог. С2 – любой керамический однослойный. Полный аналог микросхемы 74HC14 – КР1564ТЛ2, Диод VD1 заменим на КД522, транзистор КТ3102ЕМ – на любой другой npn с током коллектора не менее 100 mA, а VT2 – 200 mA (зависит от тока реле). Защитный диод D1 – на КД213, 1N4001 – 1N4007. Фотодиод – любой, надо лишь подобрать номинал R6 для надёжного срабатывания у-ва на необходимом расстоянии. Реле – любое, срабатывающее от 5 вольт. Например, РЭС55А.

Если расстояние между указкой и фотодиодом предполагается больше 10м или просто наблюдается нечёткая работа приёмника, у-во можно снабдить усилителем, схема которого показана на рис. 3.

Рис. 3. Схема усилителя.

Микросхема К1056УП1 – специализированный усилитель для фотодиодов. Заменима на К1054УП1 или TBA2800 с учётом немного иных схем включения.

Текст программы для этой приставки выглядит так:

program security;

uses crt, dos;

const n=8; {число бит}

const m=3; {число допустимых пропусков}

const b=$3F8; {базовый адрес порта}

const t=1000000; {время работы сирены (мкС) }

 

type mas=array[1..n] of integer;




Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 507; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.067 сек.