Vol-Alchevsk
Ucoz.net


Меню сайта
Реклама
вложение денег в акции
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

УПРАВЛЕНИЕ: LPT, COM, USB, IR


LPT-ПОРТ




Следует учитывать, что USB-Lpt адаптеры к принтерам реализуют только часть функций "аппаратного" Lpt порта, существуют сложности адресации, к управлению внешними устройствами они, как правило - непригодны. Программа для экспериментов с Lpt портом: lpt.zip.


Выводы порта можно разделить на четыре группы: это 'земля' (8 выводов, обозначены черным цветом) - контакты 18-25. Красным цветом обозначены 8 выводов двунаправленного регистра Data (контакты 2-9), программируемого и возможна установка логических уровней (0-5в) извне. Адрес: 0x378 - в 16-ричной системе или 888 в десятичной (на рис. написано &H378 - это тоже самое что и 0x378, первое обозначение присуще языку Pasсal и ему подобным). Осталось еще два регистра. Однонаправленный регистр Status (контакты 10-13, 15). Управлять им можно только извне, через внешнее устройство (имеется в виду изменять данные на нем, читать можно из любого регистра в любую сторону). Он имеет адрес 0x379 - в 16-ричной системе или 889 в десятичной. И регистр Control (контакты 1, 14, 16-17). Он имеет всего 4 контакта и может управляться только программой. Его адрес: 890 в десятичной системе.


Работа из под Delphi. Регистрируем библиотеку inpout32.dll.


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
var Port: word; Data: Byte;

Посылка данных из окошек:

Data:= StrToInt(Edit1.Text); Port:= StrToInt(Edit2.Text); Out32(Port, Data);

Аналогично делаем для чтения данных.

Port:= StrToInt(Edit3.Text); Data:= Inp32(Port); MessageDlg('Value: '+ IntToStr(Data), mtInformation, [mbOK], 0);


Допустим, на выводе регистра Data под номером 3 (3 - это номера вывода LPT порта) нужно установить логическую 1 (т.е. чтоб между ножкой и землей было +5 В) и на остальных выводах этого регистра (2,4-9 выводы порта) были нули. В операционных системах, позволяющих получить прямой доступ к регистру, пишем код (опираясь на функцию Out32 библиотеки inpout32.dll):


int Address=888;
int data=2;
Out32(Address, data);


Ниже размещен пример вывода кода 245:




Считать данные из порта (Inp32 это функция для чтения данных из порта библиотеки inpout32.dll):


int Address=888;
int data;
data = Inp32(Address);


На выводах порта 2,4,6-9 сейчас +5 В а на выводах 3,5 0 В. (см. рис. выше). Как уже упомянуто выше, в регистр Data данные записать может и внешнее устройство.


Исходно, на всех выводах регистра Status (10-13, 15) находится высокий уровень напряжения +5 В. Заземлением можно менять уровень до нуля (подача данных извне). Он имеет инвертированные выводы и рабочими являются биты под номерами 4-7, а 0-3 не используются. Чтение:


int Address=889; //адрес регистра Status
int data;
data = Inp32(Address);


После первого замыкания выводов Status, начинают мигать выводы Data и Control. Это связано с тем, что порт LPT предназначен для подключения принтера, а выводы Status он использует, для того, чтобы сообщить компьютеру служебную информацию. Изменения на выводах Status регистрирует драйвер операционной системы. Он же проводит и ответные действия, для нас наблюдаемые в виде периодического изменения состояния других выводов. Тут уж ни чего не поделаешь. Обычно, в начале работы с портом далается замыкание какой-нибудь линии регистра Status на землю, примерно через минуту драйвер утихомирится. После этого порт свободен, и новые операции над регистром Status не приводят к неконтролируемым процессам в порту.


Особенности ввода информации в компьютер через стандартные порты обсуждаются также здесь: http://www.pcports.ru/, Com-Lpt-Win32.


COM-ПОРТ, ТИПОВЫЕ СХЕМЫ


COM-порт, контакты.


1 DCD <- Carrier Detect

2 RXD <- Receive Data

3 TXD -> Transmit Data

4 DTR -> Data Terminal Ready

5 GND == System Ground

6 DSR <- Data Set Ready

7 RTS -> Request to Send

8 CTS <- Clear to Send

9 RI <- Ring Indicator


Первый контакт, DCD, передает сигнал начала передачи данных. В принципе, он необязателен, но в условиях с большим количеством помех бывает весьма полезен. RXD — контакт, принимающии данные. Это один из трех необходимых сигналов. TXD — передача данных, так что очевидно, что он тоже незаменим. DTR, DSR, RTS и CTS служат только для проверки и подтверждения отправки-получения данных. Обычно классический нульмодем не превышает длины в полтора метра, а при такой длине шнура трудно навести какие-либо помехи. RI — сигнал начала связи, который сохранился как историческая реликвия и практически никогда не использовался, даже в дремучие времена DOS. И наконец, GND — «земля».


Мышью используются следующие контакты разъема: RXD (2) – для передачи данных, GND (5) – земля, DTR, RTS (4, 7) – положительное питание, TXD (3) – отрицательное питание. В ряде случаев информационный сигнал подают на ножку 1 (DCD), мышь, как видно, его не использует (но не модем!). Выходной сигнал можно подавать не только на DCD но и на другие контакты CTS, DSR.


В ИК-системах считывания данных с помощью com-порта контакты 5, 9 объединяют, это земля. Контакты 7, 8 служат для подпитки внешней схемы (VCC), обычно далее следует стабилитрон на 5 вольт и резистивно-емкостной мост стабилизации (резистор на 100 ом и конденсатор на десять микрофарад). Это плюс по питанию, допустим, ИК-фототранзистора. Между 6 и 7 ножками размещают резистор в 3 Ком внешней нагрузки, на ножку 6 (DSR) поступает информативный сигнал с фоторезистора (OUT).


В Delphi порт и RTS (7, питание) инициализируется командами:


var port : hfile; IpEvtMask : dword;
begin port:= CreateFile('COM1',GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,0,0); EscapeCommFunction(port,SETRTS);


Перехват события (состояния):

setCommMask(port,EV_DSR); getCommMask(port,IpEvtMask); WaitCommEvent(port,IpEvtMask,nil); ShowMessage('Прошло событие');


Установка события означает что состояние линии изменилось на противоположное, например с 0 в 1. Изменения на DCD (1 вывода Com-порта) отлавливаются при помощи события EV_RLSD. Разумеется после окончания работы порт надо закрыть функцией CloseHandle(port); end.



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



Из рисунка видно, что исходное состояние линии последовательной передачи данных - уровень логической 1. Это состояние линии называют отмеченным - MARK. Когда начинается передача данных, уровень линии переходит в 0. Это состояние линии называют пустым - SPACE. Если линия находится в таком состоянии больше определенного времени, считается, что линия перешла в состояние разрыва связи - BREAK. Стартовый бит START сигнализирует о начале передачи данных. Далее передаются биты данных, вначале младшие, затем старшие.


Если используется бит четности P, то передается и он. Бит четности имеет такое значение, чтобы в пакете битов общее количество единиц (или нулей) было четно или нечетно, в зависимости от установки регистров порта. Этот бит служит для обнаружения ошибок, которые могут возникнуть при передаче данных из-за помех на линии. Приемное устройство заново вычисляет четность данных и сравнивает результат с принятым битом четности. Если четность не совпала, то считается, что данные переданы с ошибкой. Конечно, такой алгоритм не дает стопроцентной гарантии обнаружения ошибок. Так, если при передаче данных изменилось четное число битов, то четность сохраняется и ошибка не будет обнаружена. Поэтому на практике применяют более сложные методы обнаружения ошибок.


В самом конце передаются один или два стоповых бита STOP, завершающих передачу байта. Затем до прихода следующего стартового бита линия снова переходит в состояние MARK. Использование бита четности, стартовых и стоповых битов определяют формат передачи данных. Очевидно, что передатчик и приемник должны использовать один и тот же формат данных, иначе обмен будет невозможен. Другая важная характеристика - скорость передачи данных. Она также должна быть одинаковой для передатчика и приемника.


Скорость передачи данных обычно измеряется в бодах (по фамилии французского изобретателя телеграфного аппарата Emile Baudot - Э. Бодо). Боды определяют количество передаваемых битов в секунду. При этом учитываются и старт/стопные биты, а также бит четности. Иногда используется другой термин - биты в секунду (bps). Здесь имеется в виду эффективная скорость передачи данных, без учета служебных битов.


Пусть var x : byte; dw : dword; установка параметров передачи в Delphi: getcommstate(com,dcb); dcb.baudrate := cbr_9600; dcb.bytesize := 8; dcb.parity := 2; setcommstate(com,dcb); команда чтение байта: readfile(com,x,1,dw,nil);


Если приемник качает информацию по DCD, нужен таймер, который будет считать время между изменениями DCD и установкой событий. Промежуток Т между 2 событиями равен нулевому биту в команде или адресе, 2Т соответственно равен 1. Время Т таймера обычно равно промежутку между старт битом и битом синхронизации. Набивая полученными битами байт - получаем искомое число - команду переданную с пульта, вначале идут несколько бит адреса блока команд и только потом сама команда. Плюс нужна поправка на пропуск в цикле каждого второго события, который сигнализирует о том, что сигнал на DCD вернулся в исходное состояние. В принципе по нему можно перезапускать таймер.


Итак, по событию запустить таймер для измерения интервала. По следующему событию учесть полученный интервал в таймере. Пропустить несколько событий (сколько - зависит от пульта). Запустить таймер. По наступлению события смотреть, было ли событие от таймера, или в событии от таймера смотреть, было ли событие от порта. Ориентируясь на это добавлять сдвигом в байт бит (0 или 1) в цикле N раз (сколько зависит от пульта). По окончанию цикла дождаться еще 1 события (стоповый бит). Проанализировать, что за байт получился и предпринять какие то шаги. Не забыть закрыть порт по выходу из программы.


USB-ПОРТ



Возможен доступ с помощью конвертора FT232BM. Это английская микросхема, которая имеет вход UART (или параллельный, аналог LPT, если это FT245BM) и выход USB. Также она имеет драйвер, распространяемый бесплатно. Установив этот драйвер на ПК, вы можете подключить ваше устройство к любому USB порту вашего ПК. При этом, как только ОС обнаружит устройство, USB таинственным образом исчезает из списка портов, а вместо него появляется "виртуальный" порт COMn, где n - номер, как правило, следующий за последним из реальных СОМ портов. См. приложения, включая интерфейс USB-АЦП.



Шина USB (Universal Serial Bus - универсальная последовательная шина) появилась по компьютерным меркам довольно давно - версия первого утвержденного варианта стандарта появилась 15 января 1996 года. Разработка стандарта была инициировна весьма авторитетными фирмами - Intel, DEC, IBM, NEC, Northen Telecom и Compaq.


Основная цель стандарта, поставленная перед его разработчиками - создать реальную возможность пользователям работать в режиме Plug&Play с периферийными устройствами. Это означает, что должно быть предусмотрено подключение устройства к работающему компьютеру, автоматическое распознавание его немедленно после подключения и последующей установки соответствующих драйверов. Кроме этого, желательно питание маломощных устройств подавать с самой шины. Скорость шины должна быть достаточной для подавляющего большинства периферийных устройств. Попутно решается историческая проблема нехватки ресурсов на внутренних шинах IBM PC совместимого компьютера - контроллер USB занимает только одно прерывание независимо от количества подключенных к шине устройств.


Возможности USB следуют из ее технических характеристик:

  • Высокая скорость обмена (full-speed signaling bit rate) - 12 Mb/s
  • Максимальная длина кабеля для высокой скорости обмена - 5 m
  • Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Mb/s
  • Максимальная длина кабеля для низкой скорости обмена - 3 m
  • Максимальное количество подключенных устройств (включая размножители) - 127
  • Возможно подключение устройств с различными скоростями обмена
  • Отсутствие необходимости в установке пользователем дополнительных элементов, таких как терминаторы для SCSI
  • Напряжение питания для периферийных устройств - 5 V
  • Максимальный ток потребления на одно устройство - 500 mA


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


Кабели и разъемы


Сигналы USB передаются по 4-х проводному кабелю


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


Номер контакта Назначение Цвет провода
1 V BUS Красный
2 D- Белый
3 D+ Зеленый
4 GND Черный
Оплетка Экран Оплетка


Здесь GND - цепь "корпуса" для питания периферийных устройств, VBus - +5V также для цепей питания. Шина D+ предназначена для передачи данных по шине, а шина D- для приема данных. Кабель для поддержки полной скорости шины (full-speed) выполняется как витая пара, защищается экраном и может также использоваться для работы в режиме минимальной скорости (low-speed). Кабель для работы только на минимальной скорости (например, для подключения мыши) может быть любым и неэкранированным. Разъемы, используемые для подключения периферийных устройств, показаны на рисунке выше.

ИК-СВЯЗЬ С РОБОТАМИ



СВЕДЕНИЯ ПО ИК-УПРАВЛЕНИЮ


Для компорта продается набор ИК-управления.


Схема устройства приведена ниже:



У обычных компьютерных ИК приёмников жёстко прошит протокол IRDA, что не позволяет им принимать сигналы от пультов ДУ, т. к. протоколы пультов и ИК приёмников совершенно несовместимы. Разработаны некоторые программы и устройства перехвата ИК-управления, см. ИК-приемники, SlyControl, ИК-порт. Команды передаваемые ИК передатчиком - последовательный набор байт или один байт, в котором есть старт бит, бит синхронизации, 4-5 бит адрес команды, 4-8 бит сама команда, стоповый бит. Приемник обычный TSOP-17xx. Часть систем ДУ использует ШИМ-модуляцию передаваемых данных.


КОММЕНТАРИИ К ТИПОВЫМ СХЕМА ИК-ПРИЕМНИКА ИЗ СЕТИ


Вот одна из схем, распространяемых интернетом. В COM-порту нет нужных нам 5 вольт, но есть сигнальные линии, выходной уровень которых близок к 12 вольтам, а тока может оказаться (см. далее) достаточно для следующей схемы.



Всего нужны пять деталей. Самая дорогая - фотоприемник типа ТК-19 (TSOP1738, SFH56-38 и др.) - стоит 60 рублей. Еще желателен, но не обязателен стабилизатор напряжения (можно заменить 5-вольтовым стабилитроном). 78L05 подойдет или отечественный КРЕН5A (точнее, КР142ЕН5А (В)), ценою 5 рублей. Остальные детали - сопротивление 4,7 кОм (для некоторых фотоприемников имеет смысл увеличить номинал до 10 кОм), конденсатор 4,7 мкФ/10 В и диод КД521 или подобный. Понадобится также разъём для COM-порта типа "мама".


Сходные схемы. Диод КД521 (можно и 522 и др. подобные кремниевые), конденсатор 10мкф, 16v. ИК приемник TK1833, выпуклостью к себе, слева-направо: DCD (сигнал), GND (общий), RTS (питание +).



Первое, что сразу заметно в первой схеме - это попытка нагрузить достаточно слабый выход IR-приемника на COM-порт. У того же достаточно распространенного TSOP1736 - выходное сопротивление порядка 25-30 кОм. Т.е. при питании 5В размах напряжения на выходе (при нагрузке 12 кОм) не превысит 1.5-2В (что оказалось недостаточно на 4х компах из 5ти, в экспериментах). Транзистор можно поставить KT315. Стабильность работы даже на длинный шнур значительно возрастает.


Первенец ИК-управления в стране - фирма IRLink. Сегодня вышла на торговлю модулями связи в магазины Key по Санкт-Петербургу. Тесты ИК-устройств роботов от Lego показывают высокую НЕСТАБИЛЬНОСТЬ распознавания управляющих сигналов вследствие отличия их от сигналов, вырабатываемых телевизионными пультами. Обычный модуль не имеет инжектора, который нужен для управления роботом. Модуль с инжектором находится в стадии разработки.

Вход на сайт
Реклама
Меню 2
Copyright MyCorp © 2024Бесплатный хостинг uCoz