rss
Навигация
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-payrss
Последние записи
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет
Каменты [еще]
2017-05-17 11:25:31 [articles] Владимир:
2016-12-20 17:49:41 [articles] Виталик:
2016-12-01 23:34:25 [news] Meteor:
2016-11-11 03:35:47 [articles] Tata10:
2016-07-27 14:28:19 [articles] Сергей:
2016-05-17 09:56:26 [articles] юра:
2016-04-29 18:03:48 [articles] agatsky.dn:
Теги
Друзья
Блог малова Лучшие стихи зая =) Мед в Красноярске Daniil V. Savenkoff Blog | То, что мне когда-то пригодилось... Велкам в друзья!

Программирование LPT под FreeBSD

Сентября
2011 года
06
Теги: freebsd, программинг, lpt,
Раздел: zgbox.ru -> Статьи -> FreeBSD -> Программирование LPT под FreeBSD
Просмотров: 8250
В этой статье я хочу поделиться опытом программирования LPT порта под FreeBSD.

Познать программирование lpt меня толкнула идея подключения разных девайсов к этому порту. Сначала мне захотелось научиться принимать информацию с простых устройств таких как объемник или простой тумблер который прикручен к входной двери и замкнут когда она закрыта, разомкнут когда открыта. На основе этого сделал охранную систему. Также сделал мониторинг напряжения 220 через этот порт.

Затем захотелось включать разные девайсы с помощью порта, например такие как электромагнитный замок, настольная лампа, мигалка, чайник и пр.

Статья не претендует на роль учебника или полной техдокументации низкоуровневого программирования порта со всеми вытекающими ньюансами. Тут только мой опыт, который возможно кому-то пригодится в начинаниях работы с LPT портом под FreeBSD.

image

Начнем с описания


Для более легкого понимания сути нашел рисунок (см. выше) где изображен порт и назначение его ног (пинов). Все 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 битов где каждый бит соответствует одной ноге.

Визуальное представление:
image


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

Там где пинов меньше 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
и получаем готовый исполняемый файл myprog

Более подробный актуальный пример


В качестве рабочего примера работы с LPT портом выкладываю в архиве исходники своей программы pr23 (название от фанаря) которая умеет работать со всеми пинами порта с 1 по 17 не включая землю есессно =)

Файл lptprog.tar Программа+исходники для работы с пинами LPT порта из FreeBSD. Позволяет смотреть состояние пинов и подавать на них сигнал 0 или 1 Размещен
размер 0.03 mb 2011-09-01 19:44:26
Скачан 375

Суть: программа может показывать в каком состоянии находится любой пин, в "on" если на нем сейчас +5 вольт или off если на нем нет ничего.
В исходниках программы также есть функции перевода из десятичной системы в двоичную и обратно.

Работает следующим образом:
хотим мы например узнать в каком состоянии сейчас 1й пин, запускаем
zgBsd# ./pr23 1
on
Второй пин:
zgBsd# ./pr23 2
off
Видим что первый пин в on а второй off в итоге если мы воткнем два светодиода первый длинной ногой в 1й пин, второй ногой на землю, а второй светодиод длинной ногой во второй пин и второй ногой на землю то увидим что 1й диод будет гореть а второй нет.

Если мы хотим выключить 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 [ответить]
Очень интересная статья большое спасибо за нее!!!
=ZG= IP:95.170.187.9 2012-03-15 21:05:30 [ответить]
рад стараться =]
mirsum 2012-03-19 01:34:26 [ответить]
А можно откомпилировать или запустить программу на линукс debian?
=ZG= IP:95.170.187.9 2012-03-19 15:05:57 [ответить]
Думаю можно, по сути все должно быть тоже самое, ну может придется немного изменить исходники. В общем, нужно пробовать и смотреть по факту и ошибкам (если они будут) при компиляции.
Сам я под линуксами компилить не пробовал, да и нету их под рукой.
iq 2013-02-28 18:06:56 [ответить]
как мне скачять праграму?
=ZG= IP:95.170.187.9 2013-02-28 19:39:20 [ответить]
так кнопка же download где файл выложен в статье
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)
----------------------------------------------------
это оч интересует плиз

Добавление комментария

Ваше имя: (Антиспам) Какой сейчас год?
Ваш комментариий: