LPT не по назначению

Модератор: Модераторы

Ответить
ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

LPT не по назначению

Сообщение ostrog17 »

Пытаюсь через порт ЛПТ поморгать светодиодом. Не получается поряду причин
1. Не работает метод открытия файла принтера f:=TFileStream.Create('/dev/parport0',fmOpenReadWrite)
Уже и права выставлял все что можно. Я так понимаю чтот при пересылке данных в файл принтера, размер файла должен изменится, а у меня ноль.
Помогите плиз
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Тоже когда-то моргал светодиодом ^_^

Код: Выделить всё

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 в системе, у первого адрес другой
ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

Сообщение ostrog17 »

Да выдал такую ошибку
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 - нет проблем, а здесь)
не откажите провести за ручку через дорогу.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

ostrog17 писал(а):LAZARUS Версия #: 0.9.26.2-2 beta
Дата 2009-06-08
Версия FPC: 2.2.4
Ревизия SVN:18898

:shock: :shock: :shock:
Заляните сюда, скачайте посвежей версию
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

ostrog17 писал(а):project1.lpr(57,5) Error: Can't open resource file: /tmp/project1.res

Удалите строчку:

Код: Выделить всё

{$R *.res}
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

Сообщение ostrog17 »

Установил версию 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;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В примере по ссылке используется /dev/port, а не /dev/parport0.
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

и устройство /dev/port доступно только от суперпользователя.
в убунте это судо путь к программе
в других линуксах su а потом путь к программе.
Хотя может я чего то и упустил.
ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

Сообщение ostrog17 »

Большое спасибо за понимание и помощь.
Все получилось. Программу нужно с правами админа SUDO. Теперь бы вот настроить сам лазарь на запуск с правами админа (что бы режим отладки был с правами супер) а то не получается виполнить пошагово. И второе как настроить скомпилированную программу (которую написал), что бы запускалась с правами админа. А то каждый раз через консоль весьма не удобно. А так все норм. Теперь пойдет. Хочу еще также разобрать гейм порт. Весьма отличная штука для контроля состояния различных датчиков.
P.S. Сам лет 10 назад прошел микроконтроллеры на асме, а вот связывать с компом приходится сейчас.

Да чуть не забыл: при чтении данных с порта все время почему то 127 ??? Кто может прокоментировать почему?
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

не надо работать в лазарус от root'а.

настройте свой линукс таким образом:
1. создайте новою группу
2. с помощью chown сделайте новою группу - группой владельца файла .dev/port
3. с помощью сhmod дайте группе разрешение на чтение/запись в dev/port
4. включите своего пользователя в созданную группу

----------
небольшая проблема, с тем что в современных GNU/Linux системах, файлы устройств создаются динамически при загрузке системы с помощью системы UDEV, таким образом изменение прав на устройство нужно прописывать в конфигах этого самого UDEV, иначе после перезагрузки системы права опять будут принадлежать root:root.
ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

Сообщение ostrog17 »

Большое спасибо за очень дельные советы.
Есть интересный вопрос: у меня на порту LPT висит 8 светодиодов (пока имитируют исполнительные устройства). Так вот при старте системы ubuntu 9.10 происходит инициализация всех восьми линий порта (может и остальные тоже), при окончательной загрузке на порту остается код 04 тоесть горит один диод. Ситуация не совсем приятная по причине безконтрольного включения агрегатов. Может кто знает как этот недостаток побороть. Буду весьма признателен за ответ.
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

я использую сторожевой таймер на трех транзисторах, но он отъест один пин.
ostrog17
незнакомец
Сообщения: 6
Зарегистрирован: 27.07.2011 19:10:48
Откуда: г. Харьков

Сообщение ostrog17 »

Уважаемый serg_iv если не трудно чуть по подробнее о сторожевом таймере (принцип действия). Как это у Вас организовано.
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

Дык оно все в открытом доступе на сайте:
http://www.freepascal.ru/article/raznoe/20070808002100/
Ответить