![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с железякой через порт [D6, WinXP]
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 в секунду)