Программирование параллельного порта на уровне PIN'ов средствами Lazarus в Linux. |
19.01.2006 Сергей Иванчиков |
Например подключить цветомузыку, или создать программируемое устройство, да мало ли для чего ещё может приспособить LPT порт радиолюбитель. Например на masterkit есть конструктор 'набор реле для для подключения к порту LPT', после чего получаем готовое 8-канальное устройство коммутации нагрузки.
Конечно необходим установленный Lazarus, с root-правом запуска среды, например через команду SUDO. Исполняемый файл также нужно будет запускать через SUDO, естественно, если не работать от root'а.
Для начала необходимо разобраться с цоколёвкой порта LPT, ведь необходимо же знать на каком выводе порта ловить сигнал.
Для снятия сигнала используются выводы 2–9 порта, резисторы можно не использовать, (лучше все же использовать с сопротивление около 400 ом, во избежание сгорания порта) при использовании резисторов выше 600 ом свечение светодиодов заметно уменьшится.
Линии порта с 2 по 9 соответствуют байту, причём вывод 2 младший бит, а вывод 9 старший бит. Каждому биту соответствует свой вес в двоичной системе счисления:
Для того, чтобы зажечь светодиод номер 1 необходимо заслать в порт значение 1, чтобы зажечь светодиод номер 2 необходимо заслать в порт значение 2, а если хочется зажечь одновременно светодиоды 1 и 2 засылаем в порт значение 3.
То есть, переводим двоичный код в десятичный: 0000 0011 = 3
. Единицы в данном случае соответствуют
включенным светодиодам. Программно это реализовать не сложно1.
Для того чтобы считывать данные из порта используются линии 10, 11, 12, 13, 15 порта при замыкании на 0 этих выводов, будет изменяться содержимое порта по адресу $379. Тут также значение байта со своими битами.
Программная реализация на самом деле очень проста: для начала необходимо объявить файловую переменную
типа TfileStream
, после этого открыть файл устройства, сместиться от начала файла на величину
$378
равную адресу порта, записать туда значение, закрыть файл. Всё.
бросаем на форму timer и парочку edit'ов
... var Form1: TForm1; f:TfileStream ;// n:integer; ch,a:byte; implementation ... procedure TForm1.Timer1Timer(Sender: TObject); begin n:=$378; ch:=strtoint(edit1.Text); f:=TFileStream.Create('/dev/port',fmOpenReadWrite); // открываем файл для записи и чтения f.Seek(n, soFromBeginning);// смещаемся на величину n f.Write(ch,1);// записываем в порт величину введенную в edit1 f.Seek(n+1, soFromBeginning);// смещаемся еще на 1 относительно n f.Read(a,1);// читаем байт по адресу n+1 f.Free; // освобождаем память edit2.Text:=inttostr(a);// в edit2 пишем значения байта по адресу n+1 end; ...
В примере не показан обработчик ошибок в случае некорректного ввода значений. При проведении эксперимента ни один порт ни на одном компьютере не сгорел.
PS: Удачи в экспериментах и пусть порты остаются не сгоревшими!
1) Начиная с того, что Free Pascal позволяет указать
число в двоичной системе счисления (“%xxxxxxxx
”, где “x
” — ноль или единица),
и заканчивая множествами (например, “set of 0..7
”). — прим. ред.