Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.045 c
14-1079708935
AsD
2004-03-19 18:08
2004.04.11
Large HDD


1-1082487555
spogi
2004-04-20 22:59
2004.04.11
Shell_TrayWND in WinXP


14-1079559570
RIMMER
2004-03-18 00:39
2004.04.11
Torry жив!


14-1082123506
juiceman
2004-04-16 17:51
2004.04.11
Помогите найти Ketmara


3-1081423918
Igorok
2004-04-08 15:31
2004.04.11
Опять иконки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский