Навигация |
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-pay![]() |
Последние записи |
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет |
Каменты [еще] |
Теги |
Друзья |
Программирование LPT под FreeBSD
Сентября
2011 года
06
2011 года
Теги: freebsd, программинг, lpt, Раздел: zgbox.ru ![]() ![]() ![]() |
Просмотров: 8164 |
Познать программирование lpt меня толкнула идея подключения разных девайсов к этому порту. Сначала мне захотелось научиться принимать информацию с простых устройств таких как объемник или простой тумблер который прикручен к входной двери и замкнут когда она закрыта, разомкнут когда открыта. На основе этого сделал охранную систему. Также сделал мониторинг напряжения 220 через этот порт.
Затем захотелось включать разные девайсы с помощью порта, например такие как электромагнитный замок, настольная лампа, мигалка, чайник и пр.
Статья не претендует на роль учебника или полной техдокументации низкоуровневого программирования порта со всеми вытекающими ньюансами. Тут только мой опыт, который возможно кому-то пригодится в начинаниях работы с LPT портом под FreeBSD.

Начнем с описания
Для более легкого понимания сути нашел рисунок (см. выше) где изображен порт и назначение его ног (пинов). Все 25 пинов порта разделены на три части, или три адреса работая с которыми мы общаемся с нужными нам пинами. Землю мы условно назовем 4й частью которая не имеет адреса.
Первая часть - пины с 2 по 9 это пины вывода данных, тоесть когда на какойто пин из ПК посылается логическая единица то на нем появляется +5 вольт. Имеет адрес 378
Вторая часть - пины 10,11,12,13,15 - это ввод данных, то есть когда эти пины замыкаются на землю (на любой с 18 по 25 пин). То на этих пинах появляется логическая единица. Соответственно если не замкнуты - то логический ноль. Заметьте что 15й пин инвертированный, на нем будет лог 0 если он замкнут на землю и лог 1 если разомкнут. Адрес пинов 379
Третья часть - пины 1,14,16,17 - это тоже пины вывода данных как и пины первой части, но 17й пин инвертированный, то есть в то время когда на простых пинах появляется +5 вольт при посылки на них единицы, то на 17 пине будет +5 вольт при посылке на него логического ноля и наоборот. Адрес пинов 37А
Четвертая часть - пины с 18 по 25, как уже было сказано выше это все земля или минус.
Итого мы имеем 5 пинов для получения информации из внешнего мира и 12 для вывода.
Адреса и принцип работы с портом
Посылая одно определенное десятичное число (например 192) на какойто адрес порта (например 378), оно преобразуется в двоичное 8 битное, и за одну "посылку в порт" может одновременно включить одни пины этого адреса и выключить другие.
Это как так!? о_О
Представим что у нас есть 8 пинов (например первая часть порта), их можно представить как последовательность из 8ми битов где каждый бит соответствует определенному пину и может иметь значение только 1 или 0.
В общем у нас есть 8 пинов и 8 битов где каждый бит соответствует одной ноге.

То есть посылая десятичное число на определенный адрес, оно преобразуется в двоичное и включает определенную последовательность пинов.
Там где пинов меньше 8ми, (во второй или 3й части), используется 5 и 4 бита из 8ми. В итоге если например на третей части включить все ноги с учетом что 17я инвертированная нужно послать число 7 или это будет 00000111 в двоичной. 5й бит в двоичном числе отвечает за 17 ногу если я не ошибаюсь =) С учетом того что он инвертированный, посылая на него 0 - имеем +5 вольт на выходе.
Ну надеюсь с этим понятно.
Теперь, если нам нужно включить какието пины (послать на них +5 вольт) нужно знать какой бит двоичного числа какой ноге соответствует, поставить единицы в нужных местах, получиться двоичное число типа 11001001 затем нужно перевести это число из двоичной системы в десятичную, в результате чего получится число 201 которое нужно будет просто отправить на выбранный адрес порта. В итоге получим включенную и выключенную последовательность ног.
В адрес можно писать и с адреса можно читать. Например послали мы какуюто последовательность бит в десятичном виде, включившую пины. Теперь можно в любой момент открыть/закрыть порт, завершить/запустить софт, затем снова открыть порт, прочитать данные с адреса в итоге получим ту последовательность которую посылали.
Но не во все адреса можно писать, например в адрес 379 (вторая часть) писать не имеет смысла т.к. Это пины ввода, на них появляются единицы и нули только при замыкании их на землю.
Для перевода из десятичной системы в двоичную и обратно можно воспользоваться обычным виндовозным калькулятором в инженерном режиме. Запускаем калькулятор, врубаем инженерный режим, отмечаем Dec, пишем число в десятичной, затем жмем Bin и получаем его в двоичной и обратно.
Программинг на С под FreeBSD
Суть программирования порта сходится к следующему алгоритму:
1. Подключить необходимые модули
2. Подключиться к девайсу /dev/io
3. Прочитать десятичное число с выбранного адреса порта
4. или записать десятичное число в выбранный адрес порта
5. Отключиться от /dev/io при завершении приложения
чтоб изменить последовательность влкюченных/выключенных пинов нужно прочитать число из порта, перевести из десятичной в двоичную, изменить по своему усмотрению затем измененное перевести из двоичной в десятичную и отправить полученное число по нужному адресу =)
Пример простой программы на C которая подключается к порту, получает десятичное число с порта в переменную aaa и отправляет в порт число в переменной bbb.
Листинг prog.c
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <machine/cpufunc.h>
#include <iostream>
#include <math.h>
#include <string>
using namespace std;
int main()
{
//задаем переменную fd и открываем ввод вывод на запись и чтение в /dev/io
int fd = open("/dev/io", O_RDWR);
//если не удалось открыть /dev/io то пишем еррор мол not open lpt
if (fd==-1) {
printf("not open lpt\n");
exit(-1);
}
//объявляем переменные aaa и bbb
unsigned int aaa,bbb;
//читаем данные с адреса порта в переменную aaa
aaa=inb(0x379);
//выводим на экран че там в порту.
printf("%d\n", aaa);
//посылаем в порт значение переменной bbb
bbb=201;
outb(0x378,bbb);
//закрываем порт
close(fd);
return 0;
}
Как откомпилить исходники?
Да просто, создаем редактором файл например prog.c, пишем в нем наш код, сохраняем. Затем выполняем
#CC prog.c -o myprog
Более подробный актуальный пример
В качестве рабочего примера работы с LPT портом выкладываю в архиве исходники своей программы pr23 (название от фанаря) которая умеет работать со всеми пинами порта с 1 по 17 не включая землю есессно =)
Суть: программа может показывать в каком состоянии находится любой пин, в "on" если на нем сейчас +5 вольт или off если на нем нет ничего.
В исходниках программы также есть функции перевода из десятичной системы в двоичную и обратно.
Работает следующим образом:
хотим мы например узнать в каком состоянии сейчас 1й пин, запускаем
zgBsd# ./pr23 1
on
zgBsd# ./pr23 2
off
Если мы хотим выключить 1й диод и включить второй то выполняем:
zgBsd# ./pr23 1 off
zgBsd# ./pr23 2 on
Скачиваем и распаковываем непосредственно из под freebsd
zgBsd# mkdir /usr/local/etc/lpt
zgBsd# cd /usr/local/etc/lpt
zgBsd# fetch -o lptprog.tar.gz 'http://zgbox.ru/get.php?fid=25'
zgBsd# tar -xzvf lprptog.tar.gz
x pr23
x pr23.c
zgBsd# ll
total 52
-rw-r--r-- 1 root wheel 30720 1 сен 19:44 lptprog.tar.gz
-rwxr-xr-x 1 root wheel 15899 1 сен 19:37 pr23
-rw-r--r-- 1 root wheel 4961 1 сен 19:36 pr23.c
Что можно подключить к LPT порту?
помимо принтеров, сканеров, программаторов и прочего сложного оборудования можно подключить:объемник (датчик изменения объема помещения)
датчик дыма.
кнопку
светодоиды
сделать мониторинг 220, телефонной линии и тд.
датчики закрытости окон, дверей, замков (по принципу простой кнопки)
реле, через оптрон, чтоб управлять электроприборами на 220 вольт или любыми другими. Подсветку например включать\выключать итд.
Или включать/выключать электроклапан на системе водоснабжения. Управлять электронасосом
Можно сделать лазерный периметр из указки и подключить его.
Или включать/выключать соседний ПК нажимая его кнопку power через реле. (ну всмысле замыкая контакты power sw)
Все ограничивается только вашей фантазией
Вот такие пироги...
Каменты, пожелания, замечания? =)
Комментарии к записи:
Костя | 2011-10-21 12:39:59 [ответить] |
Статья понравилась, просто и доходчиво. |
Антон | 2012-03-06 15:55:43 [ответить] | ||||
Очень интересная статья большое спасибо за нее!!!
|
mirsum | 2012-03-19 01:34:26 [ответить] | ||||
А можно откомпилировать или запустить программу на линукс debian?
|
iq | 2013-02-28 18:06:56 [ответить] | ||||
как мне скачять праграму?
|
iq | 2013-02-28 22:00:50 [ответить] |
ну там 0,03mb и нет инстала |
Алексей | 2013-08-09 14:38:39 [ответить] |
Спасибо большое, классная прога, добавил к NAS4Free |
andreosh | 2013-11-14 15:08:03 [ответить] |
Спасибо за хорошие статьи!!! |
Alexandr | 2014-04-15 06:11:40 [ответить] |
Или включать/выключать соседний ПК нажимая его кнопку power через реле. (ну всмысле замыкая контакты power sw) ---------------------------------------------------- это оч интересует плиз |