LINUX.ORG.RU
ФорумTalks

[тупак] светодиоды через LPT

 


0

1

Вот решил сделать это: http://linsovet.com/linux-example-programming-lpt-led

Для Ъ:

В этом посте я расскажу о способах подключения к LPT и его программировании. Не судите строго - моя первая статья. Во-первых нужно узнать что же из себя представляет LPT порт, что и как мы к нему будем подключать/ Приведу информацию с Википедии. IEEE 1284 (порт принтера, параллельный порт, LPT) — международный стандарт параллельного интерфейса для подключения периферийных устройств персонального компьютера.В основном используется для подключения к компьютеру принтера, сканера и других внешних устройств (часто использовался для подключения внешних устройств хранения данных), однако может применяться и для других целей (организация связи между двумя компьютерами, подключение каких-либо механизмов телесигнализации и телеуправления). На данный момент нас будут интересовать только выводы 2-9 и еще выводы 18-25. Выводы со 2-ого по 9-ый представляют из себя информационные выходы, и именно с ними мы будем в основном дело иметь, на них у нас будет "+" .А выводу с 18-го по 25-ый - это общий провод (или как сейчас модно писать - GND), они соединены с корпусом компьютера и на них всегда будет "-". Пока это все что нужно про LPT, чтобы лишний раз не нагружать мозг. Теперь о том, что мы будем подключать. Сначала не будет никаких сложных устройств, мы просто подключим обычный светодиод. Надеюсь все знают что он из себя представляет, а те кто о нем первый раз слышат, могут посмотреть Википедию. Его полярность мы можем узнать, подключив к нему батарейку (квадратную, на 4,5 Вольта) - попробуйте поменять полярность, пока не загориться и пометьте где у него плюс и где минус. Теперь его нужно подключить к компьютеру. Минус светодиода поключаем к любому от 18 до 25 вывода, а плюс светодиода подключаем выводу под номером 2. На на рисунке можно обозначить так : А теперь займемся программной частью. Перед дальнейшим изучением очень советую прочитать вот это http://www.linuxcenter.ru/lib/articles/programming/io_port_prog_minihowto.pht... Мы напишем две программы - первая будет посылать в порт единицу (зажигать светодиод), вторая - ноль (тушить светодиод). Разберем основные функции нужные нам для работы с портами на этом этапе. ioperm(from, num, turn_on) - функция, которая дает программе право на доступ к портам. Параметр from указывает с начиная с какого порта мы хотим получить доступ. Следущий параметр - num указывает сколько портов предоставить в наше распоряжение. И последний turn_on показывает разрешен ли доступ к портам, или нет. from - 0x378 (адрес информационных выходов LPT-порта) num - 1 (сообственно, нам и нужен один порт - 0x378) turn_on - 1 (запись должна быть разрешена) Следущая функция, которая нам понадобится, это функция outb(value,port). Первый параметр - value указывает какие значения нам нужно записать в порт. Второй параметр - port - это номер порта. Для первой программы - value=1, для второй - value=0,port = 0x378 Для использования этих функция нам следует подключить заголовочные файлы #include <unistd.h> #include <asm/io.h> Все вашеуказанные функции могут выполняться только из под рута, поэтому компилировать программы мы будем под обычным пользователем, а запускать под root'ом. Вот исходники: zero.с - посылвает в порт 0 (соответственно тушит светодиод) one.c - посылает в порт 1(зажигает светодиод) Скачиваем в папку, заходим в нее и сначала набираем : $gcc -o zero zero.c $gcc -o one one.c Вуаля! Теперь наши программы скомпилированы, заходим под рутом: $su Password: Теперь выполняем: $ ./one - светодиод должен загореться $ ./zero - светодиод должен потухнуть Вот и закончен наш первый эксперимент!..если что, то не получается, пишите в комментах)))

Где взять включаемый файл asm/io.h ? В каких пакетах ? В /usr/include нету. При компиляции ругается на его отсутствие


>Его полярность мы можем узнать, подключив к нему батарейку (квадратную, на 4,5 Вольта)

Только через резистор :) А то можно и спалить легко.

KRoN73 ★★★★★
()

include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

#define BASE 0x378
#define TIME 500000

int main () {
	int x = 0xAA;
	int y = 0x55;
	printf ("Writing to parallel port!\n");
	if (ioperm (BASE, 3, 1)) {
		perror ("ioperm()");
		exit (77);
	}
	while (1) {
		outb (x, BASE);
		usleep (TIME);
		outb (y, BASE);
		usleep (TIME);
	}
return 0;
}

Простейшая мигалка на LPT под Linux.

anonymous
()
Ответ на: комментарий от kranky

Угу:

$ locate asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/alpha/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/arm/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/avr32/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/blackfin/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/h8300/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/ia64/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/m68knommu/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/powerpc/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/s390/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/sh/include/asm/io.h
/usr/src/linux-2.6.27-tuxonice-r7/arch/sparc/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/alpha/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/arm/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/avr32/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/blackfin/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/cris/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/h8300/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/ia64/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/m68knommu/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/mips/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/parisc/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/powerpc/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/s390/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/sh/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/sparc/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/um/include/asm/io.h
/usr/src/linux-2.6.28-tuxonice-r1/arch/x86/include/asm/io.h

KRoN73 ★★★★★
()

Держи:

#!/bin/sh

SETLEDS='setleds -L'

while true;
do
    $SETLEDS +num -caps -scroll
    sleep 0.1
    $SETLEDS -num +caps -scroll
    sleep 0.1
    $SETLEDS -num -caps +scroll
    sleep 0.1
done;%

wfrr ★★☆
()
Ответ на: комментарий от KRoN73

> Только через резистор :) А то можно и спалить легко.

21й век на дворе. В продаже начали появляться светодиоды со встроенными резисторами, заточенные на прямое подключение к TTL-выходам.

anonymous
()
Ответ на: комментарий от anonymous

А схемку с 4-я дополнительными можно, а то гугл в отрубоне.

anonymous
()
Ответ на: комментарий от quickquest

Ну если использовать матрицу с дешифраторами, то можно сколько угодно подключать.

anonymous
()
Ответ на: комментарий от anonymous

> Простейшая мигалка на LPT под Linux.

а я мудак модуль ядра писал чтобы к портам ввода/вывода обращаться... правда это была курсовая работа и ее целью было написание модуля ядра... и порт не LPT а COM-порт...

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

>правда это была курсовая работа и ее целью было написание модуля ядра... и порт не LPT а COM-порт...
но ты всё равно мудак.

anonymous
()
Ответ на: комментарий от anonymous

>21й век на дворе.

Ну, отстал, отстал... Последнюю схему я проектировал лет 13 назад :)

>В продаже начали появляться светодиоды со встроенными резисторами, заточенные на прямое подключение к TTL-выходам.

Гут. Тогда надо упоминать эту тонкость :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.