Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с железякой через порт [D6, WinXP]


Страницы:   1 2

MAXHO ©   (2004-01-17 16:45:00) 

Что то стерли мой вопрос. Повторю.
Есть железка, выдает импульсы (до 750 штук в секунду). Надо их считать. Как сделать - постоянно опрашивать порт? Или можно как то сделать обработку импульса по его поступлению? (ипмульсы 15В)


MAXHO   (2004-02-04 02:40:00) [1]

Ладно, нашел уже сам - в винде было запрещено 7 прерывание :))
убил бы......


MAXHO   (2004-02-03 18:40:00) [2]

Пишу прогу (использую TVicHW32):

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, TVicLib, HW_Types, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Label2: TLabel;
   Button5: TButton;
   Label3: TLabel;
   Label4: TLabel;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var
 HW32           : THANDLE;

procedure TForm1.Button1Click(Sender: TObject);
begin
HW32 := 0;
HW32 :=OpenTVicHW32(HW32,'TVICHW32','TVicDevice0');
if GetActiveHW(HW32)=True then Label1.Caption:='Открыт'
 else Label1.Caption:='Закрыт';

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 HW32 := CloseTVicHW32(HW32);
 if GetActiveHW(HW32)=True then Label1.Caption:='Открыт'
 else Label1.Caption:='Закрыт';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
SetHardAccess(HW32,False);
if GetHardAccess(HW32)=False then Label2.Caption:='Soft';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
SetHardAccess(HW32,True);
if GetHardAccess(HW32)=True then Label2.Caption:='Hard';
end;

procedure OnHWInterrupt(IRQNumber:WORD); stdcall;
begin
Beep;

end;

procedure TForm1.Button5Click(Sender: TObject);
begin

UnmaskIRQ(HW32,7,OnHWInterrupt);
ForceIrqLPT(HW32,True);
if IsIRQMasked(HW32,7)=false then  Label3.Caption:='Обработчик установлен'
else Label3.Caption:='Нет обработки';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label4.Caption:=inttostr(GetIRQCounter(HW32,7));
end;

end.

чего ещё не хватает? почему нет прерываний? Вроде и порт открывается, и прерывание устанавливается и обработчик для него....Не понимаю...:((


MAXHO   (2004-02-01 11:18:00) [3]

Ну неужели никто не сталкивался с подобным?
Nick_Omsk, как насчет примерчика? :)


MAXHO   (2004-01-30 02:32:00) [4]

Странно....Скачал TVicHW32. ВСе работает, нормально считывает и записывает в порт, но вот прерывания не отлавливает...С компонентой шла прога Lpt_Test - и она почему-то не отлавливает.Линия ACK нормально опрашивается, загорается когда на неё 0 подаю, но прерывание не срабатывает - прога не считает количество  прерываний и не выполняет команды  обработчика прерывания. В чем может быть дело?.


GEN   (2004-01-23 18:00:00) [5]

>Machno
На сайте www.fractal.com.ru ест все необходимое тебе
железо. Кстати имеет применение в электричках.
Срок поставки 1-3 дня. Хорошая техподдержка.


MAXHO   (2004-01-22 19:02:00) [6]

Ну вот, только схему собирать собрался.......
Nick, исходнк не покажешь? или там прям в компоненте все выставляется и остается только обработчик написать? мне интересен сам принцип - куда прога переходит после получения прерывания, и куда ложится обработчик? или он просто пишется как процедура? покажи, а? :) можно в почту


Nick_Omsk   (2004-01-21 20:42:00) [7]

Есть такая интересная штука как TVicHW32. Дрова, и dll для дров а также модули для Delphi. Все это работает с железом, со всякими там прерываниями, но особенно развита для работы с LPT, вплоть до выставления любых выводов порта в нужный лог. уровень. Так вот, с остальными прерываниями пробоваль работать через эту чудо-штуку, не получилось. А вот с LPT довольно таки весело, програмуля буквально в пару-тройку строк, и готово, цепляю кусок провода на десятый вывод порта, и готово. Скорость меня, если често удивила. За протяжку проводника по корпусу в течении намного меньшего чем 0,5 сек. функция сработала более 2000 раз. Теперь вешай на порт хоть PIC, хоть кирпич.


Dmitriy_G   (2004-01-21 16:52:00) [8]

MAXHO, ты бы держал меня в курсе событий, а то уж больно интересно, чем закончится :)


MAXHO   (2004-01-21 15:37:00) [9]

мда....ну чтож, похоже действительно придется собрать внешнюю девайсину, благо руки растут откуда надо :)


Evgeny V   (2004-01-21 06:03:00) [10]


> MAXHO ©   (20.01.04 17:08) [16]
> Сложновато.
> Попробовал использовать ожидание события компорта ComPort.WaitForEvent(компонента
> CPort 2.64). Подавал на линию CTS. Все нормально, реагирует,
> но вот незадача - если нет импульсов прога находится в режиме
> ожидания. А как делать другую работу во время ожидания события?

Работа  с портом в другом потоке, хотя в принципе согласен c другими, что для таких задач лучше использовать отдельное устройство.


N169   (2004-01-20 22:33:00) [11]

Готовых драйверов, вешающихся на прерывание LPT порта, не существует. Их надо писать самому.
Могу поделиться идеями, если есть желание :)


MAXHO   (2004-01-20 18:00:00) [12]

для №169. Может и потянет. Но я пока не занимался написанием собственных драйверов, использую чужие :) Так что если у тебя есть что нибудь подходящее - поделись пожалуйста :)


MAXHO   (2004-01-20 17:08:00) [13]

Сложновато.
Попробовал использовать ожидание события компорта ComPort.WaitForEvent(компонента CPort 2.64). Подавал на линию CTS. Все нормально, реагирует, но вот незадача - если нет импульсов прога находится в режиме ожидания. А как делать другую работу во время ожидания события?


Verg   (2004-01-20 15:41:00) [14]

Есть еще вариант (без ПИКа): через звуковую карту.
Непрерывно в отдельном код.потоке цифруешь сигнал в два блока по-переменно (чтобы не допустить пропусков). Обрабатываешь результирующую выборку с целью выделения перепадов (импульсов) учитывая, что зв. карта не пропускает постоянку (считай, что ФВЧ герц на 20). Ну а дальше считаешь их количество за единицу времени, определить которое можно из частоты дискретизации и номеров отсчетов.

Осталось привести сигнал 15в к входному диапазону SB путем банального резисторного делителя, установленного непосредственно в разъеме подключения к SB + диодный ограничитель (защита от всякой дури).


MAXHO   (2004-01-20 15:02:00) [15]

ОК Dmitriy_G, спасибо! :) попробую для начала напрямую через порт, если не получится - надеюсь на твою помощь :)


Dmitriy_G   (2004-01-20 06:28:00) [16]

Махно, если какие проблемы. Решишь использовать ПИК обращайся с удовольствием помогу.


N169   (2004-01-19 19:44:00) [17]

Можно. Без тормозов.


MAXHO   (2004-01-19 18:35:00) [18]

а можно будет в ето время выполнять другие действия? например работать с другим портом?


N169   (2004-01-19 16:51:00) [19]

LPT потянет, но драйверок придётся писать...


MAXHO   (2004-01-19 16:37:00) [20]

Ну да. Надо считать кол-во импульсов в секунду, на основе чего высчитавается скорость движения и расстояние. А может правда использовать прерывания порта LPT или COM? или не потянет? (кол-во импульсов максимум 420 в секунду)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо