LPT не по назначению
Модератор: Модераторы
LPT не по назначению
Пытаюсь через порт ЛПТ поморгать светодиодом. Не получается поряду причин
1. Не работает метод открытия файла принтера f:=TFileStream.Create('/dev/parport0',fmOpenReadWrite)
Уже и права выставлял все что можно. Я так понимаю чтот при пересылке данных в файл принтера, размер файла должен изменится, а у меня ноль.
Помогите плиз
1. Не работает метод открытия файла принтера f:=TFileStream.Create('/dev/parport0',fmOpenReadWrite)
Уже и права выставлял все что можно. Я так понимаю чтот при пересылке данных в файл принтера, размер файла должен изменится, а у меня ноль.
Помогите плиз
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Тоже когда-то моргал светодиодом ^_^
// у меня это был второй LPT в системе, у первого адрес другой
Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, ports, x86, sysutils, Crt
{ you can add units after this };
{$R *.res}
Var
i, j: Integer;
aTime: TDateTime;
begin
fpIOperm($9c00, 8, 1);
For i := 0 To 10 Do
Begin
aTime := Now;
For j := 1 To 50 + (10 - i) * 10 Do
Begin
port[$9c00] := 255;
Sleep(i);
port[$9c00] := 0;
Sleep(5);
If KeyPressed Then
Begin
Port[$9c00] := 0;
Break;
End;
End;
WriteLn(FormatDateTime('ss:zz', Now - aTime));
WriteLn('Step: ' + IntToStr(i));
End;
For i := 9 DownTo 0 Do
Begin
aTime := Now;
For j := 1 To 150 + (10 - i) * 10 Do
Begin
port[$9c00] := 255;
Sleep(i);
port[$9c00] := 0;
Sleep(5);
If KeyPressed Then
Begin
Port[$9c00] := 0;
Break;
End;
End;
WriteLn(FormatDateTime('ss:zz', Now - aTime));
WriteLn('Step: ' + IntToStr(i));
End;
fpIOperm($9c00, 8, 0);
end.
// у меня это был второй LPT в системе, у первого адрес другой
Да выдал такую ошибку
project1.lpr(57,5) Error: Can't open resource file: /tmp/project1.res
Может у меня что с прогой не так.
LAZARUS Версия #: 0.9.26.2-2 beta
Дата 2009-06-08
Версия FPC: 2.2.4
Ревизия SVN:18898
i386-linux-gtk 2 beta
На машине линукс 9.10
может чего то не хватает?
---------------------------------------------------------
мои шаги
При запуске нового проэкта выбираю "Программа"
стер все что там было и вставил Ваш код
изменил номер порта принтера на 0378
при запуске выдал ошибку
P.S просто мигнуть диодом - такой головняк
( в чистом DOS - нет проблем, а здесь)
не откажите провести за ручку через дорогу.
project1.lpr(57,5) Error: Can't open resource file: /tmp/project1.res
Может у меня что с прогой не так.
LAZARUS Версия #: 0.9.26.2-2 beta
Дата 2009-06-08
Версия FPC: 2.2.4
Ревизия SVN:18898
i386-linux-gtk 2 beta
На машине линукс 9.10
может чего то не хватает?
---------------------------------------------------------
мои шаги
При запуске нового проэкта выбираю "Программа"
стер все что там было и вставил Ваш код
изменил номер порта принтера на 0378
при запуске выдал ошибку
P.S просто мигнуть диодом - такой головняк
( в чистом DOS - нет проблем, а здесь)
не откажите провести за ручку через дорогу.
ostrog17 писал(а):LAZARUS Версия #: 0.9.26.2-2 beta
Дата 2009-06-08
Версия FPC: 2.2.4
Ревизия SVN:18898
Заляните сюда, скачайте посвежей версию
ostrog17 писал(а):project1.lpr(57,5) Error: Can't open resource file: /tmp/project1.res
Удалите строчку:
Код: Выделить всё
{$R *.res}Установил версию 0.9.30. Вро ди бы стала нормально. При попытке запустить код первый раз пишет что не доступен файл /dev/parport0 Устанавливаю права через магнитик командер на чтение и запись файлу, идет компиляция, запускается форма и какое бы число не вводил диод как молчал так и молчит
P.S. посмотрел nano /proc/ioports за паралельный порт отвечает именно parport0.
Начинает жаба давить гдеже у меня глюк. очень хочется докопатся.
---------------------------------------------------------------------------------------------------
var
Form1: TForm1;
f:TfileStream ;//
n, g:integer;
ch, a:byte;
implementation
{ TForm1 }
procedure TForm1.Timer1Timer(Sender: TObject);
begin
n:=$378;
ch:=strtoint(edit1.Text);
f:=TFileStream.Create('/dev/parport0',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;
P.S. посмотрел nano /proc/ioports за паралельный порт отвечает именно parport0.
Начинает жаба давить гдеже у меня глюк. очень хочется докопатся.
---------------------------------------------------------------------------------------------------
var
Form1: TForm1;
f:TfileStream ;//
n, g:integer;
ch, a:byte;
implementation
{ TForm1 }
procedure TForm1.Timer1Timer(Sender: TObject);
begin
n:=$378;
ch:=strtoint(edit1.Text);
f:=TFileStream.Create('/dev/parport0',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;
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В примере по ссылке используется /dev/port, а не /dev/parport0.
и устройство /dev/port доступно только от суперпользователя.
в убунте это судо путь к программе
в других линуксах su а потом путь к программе.
Хотя может я чего то и упустил.
в убунте это судо путь к программе
в других линуксах su а потом путь к программе.
Хотя может я чего то и упустил.
Большое спасибо за понимание и помощь.
Все получилось. Программу нужно с правами админа SUDO. Теперь бы вот настроить сам лазарь на запуск с правами админа (что бы режим отладки был с правами супер) а то не получается виполнить пошагово. И второе как настроить скомпилированную программу (которую написал), что бы запускалась с правами админа. А то каждый раз через консоль весьма не удобно. А так все норм. Теперь пойдет. Хочу еще также разобрать гейм порт. Весьма отличная штука для контроля состояния различных датчиков.
P.S. Сам лет 10 назад прошел микроконтроллеры на асме, а вот связывать с компом приходится сейчас.
Да чуть не забыл: при чтении данных с порта все время почему то 127 ??? Кто может прокоментировать почему?
Все получилось. Программу нужно с правами админа SUDO. Теперь бы вот настроить сам лазарь на запуск с правами админа (что бы режим отладки был с правами супер) а то не получается виполнить пошагово. И второе как настроить скомпилированную программу (которую написал), что бы запускалась с правами админа. А то каждый раз через консоль весьма не удобно. А так все норм. Теперь пойдет. Хочу еще также разобрать гейм порт. Весьма отличная штука для контроля состояния различных датчиков.
P.S. Сам лет 10 назад прошел микроконтроллеры на асме, а вот связывать с компом приходится сейчас.
Да чуть не забыл: при чтении данных с порта все время почему то 127 ??? Кто может прокоментировать почему?
не надо работать в лазарус от root'а.
настройте свой линукс таким образом:
1. создайте новою группу
2. с помощью chown сделайте новою группу - группой владельца файла .dev/port
3. с помощью сhmod дайте группе разрешение на чтение/запись в dev/port
4. включите своего пользователя в созданную группу
----------
небольшая проблема, с тем что в современных GNU/Linux системах, файлы устройств создаются динамически при загрузке системы с помощью системы UDEV, таким образом изменение прав на устройство нужно прописывать в конфигах этого самого UDEV, иначе после перезагрузки системы права опять будут принадлежать root:root.
настройте свой линукс таким образом:
1. создайте новою группу
2. с помощью chown сделайте новою группу - группой владельца файла .dev/port
3. с помощью сhmod дайте группе разрешение на чтение/запись в dev/port
4. включите своего пользователя в созданную группу
----------
небольшая проблема, с тем что в современных GNU/Linux системах, файлы устройств создаются динамически при загрузке системы с помощью системы UDEV, таким образом изменение прав на устройство нужно прописывать в конфигах этого самого UDEV, иначе после перезагрузки системы права опять будут принадлежать root:root.
Большое спасибо за очень дельные советы.
Есть интересный вопрос: у меня на порту LPT висит 8 светодиодов (пока имитируют исполнительные устройства). Так вот при старте системы ubuntu 9.10 происходит инициализация всех восьми линий порта (может и остальные тоже), при окончательной загрузке на порту остается код 04 тоесть горит один диод. Ситуация не совсем приятная по причине безконтрольного включения агрегатов. Может кто знает как этот недостаток побороть. Буду весьма признателен за ответ.
Есть интересный вопрос: у меня на порту LPT висит 8 светодиодов (пока имитируют исполнительные устройства). Так вот при старте системы ubuntu 9.10 происходит инициализация всех восьми линий порта (может и остальные тоже), при окончательной загрузке на порту остается код 04 тоесть горит один диод. Ситуация не совсем приятная по причине безконтрольного включения агрегатов. Может кто знает как этот недостаток побороть. Буду весьма признателен за ответ.
я использую сторожевой таймер на трех транзисторах, но он отъест один пин.
Уважаемый serg_iv если не трудно чуть по подробнее о сторожевом таймере (принцип действия). Как это у Вас организовано.
Дык оно все в открытом доступе на сайте:
http://www.freepascal.ru/article/raznoe/20070808002100/
http://www.freepascal.ru/article/raznoe/20070808002100/
