Форум: "Система";
Текущий архив: 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