Обработка прерываний в Delphi
возможно, придётся свой драйвер писать.. тогда win32 DDK в зубы и вперёд (с) не помню кто
ты параметры в обработчике как cdecl или pascal объявляешь?
сам драйвер к АЦП на чём написан? исходники к нему есть?
Драйвер написан на сях, в виде V, к нему есть DLL и PAS-модуль, который реализует интерфейс между dllкой и моей прогой. Так вот, АЦП с заданной периодичностью генерирует прерывание IRQ11, а в качестве параметра функция, которая запускает этот процесс, принимает указатель на мою процедуру обработки прерывания.
имеет смысл твоей функции safecall приписать...
Попробую, она щаз у меня stdcall-ом вызывалась
А с какой частотой идёт оцифровка? И что, неужели драйвер дёргает твою user mode routine для каждой оцифрованной точки, каждый раз, когда возникло прерывание? Или там на плате есть буфер и прерывание генерится при его заполнении? Я просто когда-то имел дело с платой АЦП, тока она была ISAшная и медленная.
У меня плата тоже исашная, там есть возможность считывать большие массивы данных и через DMA, но мне нужно с частотой 5 килогерц снимать показания с одного канала с помощью IRQ.
unit Main;
{$C FIXED PRELOAD PERMANENT }
{$IFNDEF DEBUG}
{$A+,B-,D-,F-,G+,I-,K+,L-,N+,P+,Q-,R-,S-,T+,V-,W-,X+,Y-}
{$ENDIF}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ADCFrame, ExtCtrls, StdCtrls, Lcard_32;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
Timer1: TTimer;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Chnl:Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure Handler; safecall;
Procedure StartInput;
Procedure FinishInput;
implementation
var
Signal: real;
StoppingPlata:Boolean;
Pntr: Pointer;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
STOP_INTR;
SELECT_SLOT(0);
SET_BOARD_TYPE(3);
if PLATA_TEST=0 then Label1.Caption:='L-Card L1450 ADC_DAC was succesfully tested' else Label1.Caption:='Error!';
SET_TIMER_SCALE(20);
Chnl:=CREATE_CHANNEL(1,0,0);
SETCHANNEL(Chnl);
Label2.Caption:='Channel number - '+inttostr(Chnl);
StartInput;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FinishInput;
end;
procedure StartInput;
begin
STREAM_INTR(500,Pntr,Form1.Chnl);
end;
procedure FinishInput;
begin
StoppingPlata:=true;
STOP_INTR;
StoppingPlata:=false;
end;
{$Q-,R-,S-,I-}
procedure Handler; safecall;
begin
if not StoppingPlata then begin
Signal:=READ_DATA;
RESET_IRQ;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label3.Caption:=floattostr(Signal);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FinishInput;
end;
initialization
StoppingPlata:=false;
Signal:=-1;
Pntr:=@Handler;
end.
Оставить комментарий
Artas
Есть АЦП, он умеет генерировать прерывания, в качестве параметра функция принимает в том числе указатель на процедуру-обработчик. Каким образом мне корректно написать эту процедуру в Дельфях, чтобы система не сдохла, а то сейчас она виснет наглухо, так что даже три пальца не помогают и мышка не ездит...