Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Работа с железякой через порт   Найти похожие ветки 

 
MAXHO ©   (2004-01-17 16:45) [0]

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


 
goga ©   (2004-01-18 00:11) [1]

У меня на работе написан vxd, который опрашивает порт. А вроде бы можно и по прерыванию. Но лучше ты этот вопрос на wasm.ru задай. Больше вероятность ответ получить


 
GEN++ ©   (2004-01-18 00:33) [2]

Можно попробовать подать на вход Com порта, настроенного на скорость 4800 бит/сек.


 
N169   (2004-01-18 00:38) [3]

Поставить микроконтроллер внешний, PIC16F84, например.
Пусть он считает. Интерфейс сделать стандартный, на COM порт


 
Pat ©   (2004-01-18 01:45) [4]

>ипмульсы 15В
Чего-то многовато для стандартных портов


 
MAXHO ©   (2004-01-18 08:18) [5]

да нет, не много - просто железяка нестандартная :)счетчик метража на вагоне. Импульсы довольно часто идут, боюсь что если так часто часто опрашивать порт - прога тормозить будет (там еще другие задачи есть), да и не к чему ето -  например зачем опрашивать порт во время стоянки? Слышал вроде можно  работать по прерыванию, но как не знаю


 
Evgeny V ©   (2004-01-19 05:42) [6]

Можно попробовать использовать входные сигналы CTS или DSR на COM порту, работать по WaitCommEvent, соответсвенно выставив нужные маски порту SetCommMask


 
Anatoly Podgoretsky ©   (2004-01-19 09:09) [7]

Внешний аппаратный счетчик очень правильное решение, Виндоус не является системой реального времени, вряд ли ты сможешь добиться время реакции порядка 1 миллисекунды.


 
Dmitriy_G ©   (2004-01-19 09:30) [8]

Что значит считать? Какой результат должен быть? Количество импульсов в секунду? А может просто значение инкрементировать?
Если ставить ПИК то нужно знать, что он должен делать.


 
MAXHO ©   (2004-01-19 16:37) [9]

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


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

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


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

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


 
N169   (2004-01-19 19:44) [12]

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


 
Dmitriy_G ©   (2004-01-20 06:28) [13]

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


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

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


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

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

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


 
MAXHO ©   (2004-01-20 17:08) [16]

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


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

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


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

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


 
Evgeny V ©   (2004-01-21 06:03) [19]


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

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


 
MAXHO ©   (2004-01-21 15:37) [20]

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


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

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


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

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


 
MAXHO ©   (2004-01-22 19:02) [23]

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


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

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


 
MAXHO ©   (2004-01-30 02:32) [25]

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


 
MAXHO ©   (2004-02-01 11:18) [26]

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


 
MAXHO ©   (2004-02-03 18:40) [27]

Пишу прогу (использую 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-04 02:40) [28]

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.06 c
1-1082357539
wezz
2004-04-19 10:52
2004.04.11
Не устанавливается StatusBar1.Panels[0].Text


1-1082386016
Koba
2004-04-19 18:46
2004.04.11
Zip


14-1082213662
Soft
2004-04-17 18:54
2004.04.11
Москвичи, вас зомбируют!!?


14-1082459451
Soft
2004-04-20 15:10
2004.04.11
Задачка. Согласование волновых сопротивлений?


7-1079501839
Zyb
2004-03-17 08:37
2004.04.11
Запуск закрытие приложения