Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2012, 16:58   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию управление LPT портом

как известн операционная система запрещает прямое обращение и порту, нужен драйвер. Все так говорят.ищи в инете. Но что конкретно искать? И как этими драйверами пользоватся, там что функции у него свои?
В общем для начала 8 светодиодов, включать.выключать
SAMOUCHKA вне форума Ответить с цитированием
Старый 14.07.2012, 17:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Нет. LPT порт в целом не закрыт для записи и чтения.
http://delphiworld.narod.ru/base/print_to_port.html
http://www.programmersclub.ru/tag/lpt/
http://www.programmersforum.ru/showthread.php?t=67182
А вообще есть много статей о том как с LPT работать. Я лично предплчитаю старую writeln школу
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2012, 22:24   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...у вас еще остались LPT порты?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.07.2012, 08:08   #4
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...у вас еще остались LPT порты?
Да!

так это все делфи ,я даже синтаксис не понимаю не сколько.
мне-б на с++ или хотя-бы на с

Цитата:
В общем для начала 8 светодиодов, включать.выключать
это просто для пробы, а вообще я хочу компьютером, управлять синтезатором частоты. Для этого есть микросхема, делитель частоты с переменным коэфицентом деления. Так вот коэфициент деления управляется через два входа, а там 12 (если не ошибаюсь) разрядов. ну внутри у нее последовательный регистр, преобразует последовательный код в параллельный.
С логикой работы программы это я сам разберусь, сейчас мне просто надо 8 светодиодов, для пробы.

http://www.pcports.ru/articles/2.php вот тут кое-что есть. используется библиотека inpout32
Но не работает, компилятор выдает две ошибки
||=== inpout32, Release ===|
obj\Release\main.o:main.cpp|| undefined reference to `Out32(short, short)@8'|
obj\Release\main.o:main.cpp|| undefined reference to `Out32(short, short)@8'|
||=== Build finished: 2 errors, 0 warnings ===|


к стати в этой библиотеке объявление ф-ций кокоето странное
Код:
#include "stdlib.h"

short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);

Последний раз редактировалось Stilet; 15.07.2012 в 08:53.
SAMOUCHKA вне форума Ответить с цитированием
Старый 15.07.2012, 08:58   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Если поможет, ищите IOPort. Работает как с LPT, так и с COM портами. С USB не пробовал, тут не скажу.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.07.2012, 09:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я где-то читал статью о том как использовать WriteFile для записей в порт, однако не помню где... И по-моему винда позволяет открывать именованные порты через CreateFile
http://www.firststeps.ru/mfc/winapi/r.php?12
I'm learning to live...

Последний раз редактировалось Stilet; 15.07.2012 в 09:20.
Stilet вне форума Ответить с цитированием
Старый 15.07.2012, 13:12   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
так это все делфи ,я даже синтаксис не понимаю не сколько.
мне-б на с++ или хотя-бы на с
дык, библиотеке все равно на каком языке вы с ней работаете. Раз вы выбрали inpout32.dll - драйвер к третьему кольцу, то экпортируете себе функи и все.

Цитата:
к стати в этой библиотеке объявление ф-ций кокоето странное
...нормальное объявление ...смотрите сколько вариантов:
http://msdn.microsoft.com/ru-ru/library/z4zxe9k8.aspx

Цитата:
управлять синтезатором частоты. Для этого есть микросхема, делитель частоты с переменным коэфицентом деления. Так вот коэфициент деления управляется через два входа
ДПКД, очень хорошо ...два входа, скорее I2C.

Пример известны, дам на Delphi для использования эмуляции I2C через LPT посредством INPOUT32 (учтите, что если у вас 64бит ОС, то скачайте с оффсайта INPOUT64.dll), синтаксис перевести особых сложностей не представит:
Код:
//пример управления мс синтезатора частоты LM7001 с помощью LPT
//Синтезируемая частота в 4 раза выше частоты приема - для SDR
//LPT_bit0(pin2)=CL LPT_bit1(pin3)=DARTA LPT_bit2(pin4)=CE
//Для раюоты с LPT портом в ХР, используется inpout32.dll
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;
  function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
  function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';

type
  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    Label2: TLabel; Label1: TLabel; Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label3: TLabel;
    procedure TrackBar1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  step,f,hi,lo,sys,port,data,tmp,i:  integer;
  step1: real;
implementation

{$R *.dfm}

Function st(tmp:byte):byte; //функция возведения двойки в степень(от 0-7)tmp, в st - результат
    begin
      st:=255;
      if  tmp=0 then st:=1;  if  tmp=1 then st:=2;  if  tmp=2 then st:=4; if  tmp=3 then st:=8;
      if  tmp=4 then st:=16; if  tmp=5 then st:=32; if  tmp=6 then st:=64; if  tmp=7 then st:=128;
    end;

Function i2c_del:byte; //функция программной задержки, если что подправляйте для своего ПК
  var tc: integer; begin tc:=0; while tc<10000 do begin inc(tc); end; i2c_del:=0; end;

Function lm_byte:boolean; //передача байта DATA в мс LM7001 по LPT интерфейсу
  begin
    i:=0;
    while i<=7 do
    begin
    if (data and st(i))=st(i) then  //если бит (i) в байте data равен "1"
      begin
        Out32(Port, $04+$02); i2c_del; Out32(Port, $04+$03);i2c_del; Out32(port,$04+$02); i2c_del;
      end
    else   //если бит (i) в байте data равен "0"
      begin
        Out32(Port, $04+$00); i2c_del; Out32(Port, $04+$01);i2c_del;Out32(port,$04+$00); i2c_del;
      end;
    inc(i);
    end;
    lm_byte:=true;
  end;


function link:boolean; //загрузка мс LM7001  трех байт HI,LO,SYS
  begin
  data:=$04;  out32(port,data); i2c_del;  //начало обмена - "1" на выводе CE
  hi:=round(int(f/25/256)); //hi - вычисляем старший байт частоты (f)
  lo:=round(int(f/25)-hi*256);  //lo - вычисляем младший байт частоты (f)
  //Максимальное значение HI_L0(загружаемое в LM7001 - не более 16000!
  data:=lo; lm_byte; data:=hi; lm_byte; data:=sys; lm_byte; //передаем HI,LO,SYS в LM7001
  data:=$00;  out32(port,data); i2c_del;  //завершение обмена - "0" на выводе CE
  link:=true;
  end;



procedure TForm1.TrackBar1Change(Sender: TObject);
begin
f:=Trunc(form1.TrackBar1.Position*4*step1); link; //для SDR требуется частота в 4 раза выше, потому и *4....
Form1.Label1.Caption:=FloatToStr(f)+'кгц'; // отображение частоты VCO
Form1.Label2.Caption:=FloatToStr(f/4); // отображение частоты RX SDR
Form1.Label5.Caption:='StepVCO='+IntToStr(step)+'кгц';
Form1.Label6.Caption:='StepSDR='+FloatToStr(step1)+'кгц';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
port:=$378; //номер LPT порта LPT1=378H
data:=$00;  out32(port,data);
step:=10; //шаг частоты в кгц в LM7001 (1,5,10,25,50,100 кгц)
step1:=step/4;
//максимальная частота VCO для этой мс равна 16000*step
  if  step=1 then sys:=$a0; //этот байт загружается в мс LM7001 и влияет на шаг частоты (см PDF)
//if  step=5 then sys:=??   //см PDF на эту мс для выбора значения SYS в зависимости от шага частоты
//if step=10 then sys:=??
//if step=25 then sys:=??
//if step=50 then sys:=??
end;

end.

//Для уменьшение наводок от компьютера, можно к порту принтера подключить
//только линии управления мс LM7001, а общий провод неподключать.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.07.2012, 13:13   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Пример-2:
Код:
//пример управления мс синтезатора частоты LM7001 с помощью LPT
//Синтезируемая частота в 4 раза выше частоты приема - для SDR
//LPT_bit0(pin2)=CL LPT_bit1(pin3)=DARTA LPT_bit2(pin4)=CE
//Для работы с LPT портом в ХР, используется inpout32.dll
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;
  function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
  function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';

type
  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    Label2: TLabel; Label1: TLabel; Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label3: TLabel;
    procedure TrackBar1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  step,f,hi,lo,sys,port,data,tmp,i:  integer;
  step1: real;
implementation

{$R *.dfm}

Function st(tmp:byte):byte; //функция возведения двойки в степень(от 0-7)tmp, в st - результат
    begin
      st:=255;
      if  tmp=0 then st:=1;  if  tmp=1 then st:=2;  if  tmp=2 then st:=4; if  tmp=3 then st:=8;
      if  tmp=4 then st:=16; if  tmp=5 then st:=32; if  tmp=6 then st:=64; if  tmp=7 then st:=128;
    end;

Function i2c_del:byte; //функция программной задержки, если что подправляйте для своего ПК
  var tc: integer; begin tc:=0; while tc<10000 do begin inc(tc); end; i2c_del:=0; end;

Function lm_byte:boolean; //передача байта DATA в мс LM7001 по LPT интерфейсу
  begin
    i:=0;
    while i<=7 do
    begin
    if (data and st(i))=st(i) then  //если бит (i) в байте data равен "1"
      begin
        Out32(Port, $04+$02); i2c_del; Out32(Port, $04+$03);i2c_del; Out32(port,$04+$02); i2c_del;
      end
    else   //если бит (i) в байте data равен "0"
      begin
        Out32(Port, $04+$00); i2c_del; Out32(Port, $04+$01);i2c_del;Out32(port,$04+$00); i2c_del;
      end;
    inc(i);
    end;
    lm_byte:=true;
  end;


function link:boolean; //загрузка мс LM7001  трех байт HI,LO,SYS
  begin
  data:=$04;  out32(port,data); i2c_del;  //начало обмена - "1" на выводе CE
  hi:=round(int(f/25/256)); //hi - вычисляем старший байт частоты (f)
  lo:=round(int(f/25)-hi*256);  //lo - вычисляем младший байт частоты (f)
  //Максимальное значение HI_L0(загружаемое в LM7001 - не более 16000!
  data:=lo; lm_byte; data:=hi; lm_byte; data:=sys; lm_byte; //передаем HI,LO,SYS в LM7001
  data:=$00;  out32(port,data); i2c_del;  //завершение обмена - "0" на выводе CE
  link:=true;
  end;



procedure TForm1.TrackBar1Change(Sender: TObject);
begin
f:=Trunc(form1.TrackBar1.Position*4*step1); link; //для SDR требуется частота в 4 раза выше, потому и *4....
Form1.Label1.Caption:=FloatToStr(f)+'кгц'; // отображение частоты VCO
Form1.Label2.Caption:=FloatToStr(f/4); // отображение частоты RX SDR
Form1.Label5.Caption:='StepVCO='+IntToStr(step)+'кгц';
Form1.Label6.Caption:='StepSDR='+FloatToStr(step1)+'кгц';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
port:=$378; //номер LPT порта LPT1=378H
data:=$00;  out32(port,data);
step:=10; //шаг частоты в кгц в LM7001 (1,5,10,25,50,100 кгц)
step1:=step/4;
//максимальная частота VCO для этой мс равна 16000*step
  if  step=1 then sys:=$a0; //этот байт загружается в мс LM7001 и влияет на шаг частоты (см PDF)
//if  step=5 then sys:=??   //см PDF на эту мс для выбора значения SYS в зависимости от шага частоты
//if step=10 then sys:=??
//if step=25 then sys:=??
//if step=50 then sys:=??
end;

end.

//Для уменьшение наводок от компьютера, можно к порту принтера подключить
//только линии управления мс LM7001, а общий провод неподключать.
Цитата:
Я где-то читал статью о том как использовать WriteFile для записей в порт, однако не помню где... И по-моему винда позволяет открывать именованные порты через CreateFile
для обмена байтами, но не для дерганья пинами.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 15.07.2012 в 13:17.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с LPT-портом Karp_13 Общие вопросы Delphi 35 10.08.2011 00:10
Управление LPT портом под FreeBSD miguel_condie Общие вопросы C/C++ 2 14.08.2010 07:59
Управление LPT портом nikleb Паскаль, Turbo Pascal, PascalABC.NET 5 27.05.2010 19:40
Управление LPT портом Kuzmichinishe Помощь студентам 3 28.09.2009 11:07
Работа с LPT портом chingiz Паскаль, Turbo Pascal, PascalABC.NET 1 17.11.2007 21:21