ich find den Fehler einfach nicht, daher hab ich mal die ganze unit kopiert.. An Spi_adc1 liegt ein Wert an, aber nach der filter funktion bleibt adc1 auf 0.
Code: Alles auswählen
unit u_spi_form;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
spidev, fpspi;
type
{ Tspi_form }
Tspi_form = class(TForm)
spi_timer: TTimer;
procedure spi_timerTimer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
spi_form: Tspi_form;
spi_adc1, spi_adc2, spi_adc3, spi_adc4, spi_adc5, spi_adc6, spi_adc7: integer;
adc1, adc2, adc3, adc4, adc5, adc6, adc7, adc8, dac1, dac2: integer;
implementation
{$R *.lfm}
var index:Integer; { Index auf den Messwert im Puffer }
var Wert,min,max,i:Integer;
const PufferGroesse = 5 + 2; { +2 weil der kleinste und groesste Wert entfernt werden }
const MAX_ADU = 4095; { beim 12 Bit Wandler }
const MIN_ADU = 0;
{ Es folgen die Pufferspeicher der einzelnen Kanäle }
type
Pufferspeicher = Array[0..PufferGroesse-1] of Integer;
{ Filter_ADC1 }
var Puffer_adc1: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC2 }
var Puffer_adc2: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC3 }
var Puffer_adc3: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC4 }
var Puffer_adc4: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC5 }
var Puffer_adc5: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC6 }
var Puffer_adc6: Pufferspeicher; { Messwert Ringpuffer }
{ Filter_ADC7 }
var Puffer_adc7: Pufferspeicher; { Messwert Ringpuffer }
function filter(spi_adc:Integer; Puffer_adc: Pufferspeicher):Integer;
begin
Puffer_adc[index]:=spi_adc;
if index < PufferGroesse-1 then index:= index+1
else index:=0;
Wert:=0;
min:=MAX_ADU;
max:=MIN_ADU;
for i:=0 to PufferGroesse-1 do
begin
if Puffer_adc[i] > max then max:=Puffer_adc[i];
if Puffer_adc[i] < min then min:=Puffer_adc[i];
Wert:=Wert+Puffer_adc[i];
end;
Wert := Wert-min;
Wert := Wert-max;
Wert := Wert DIV (PufferGroesse-2);
result := Wert;
end;
{ Tspi_form }
procedure Tspi_form.spi_timerTimer(Sender: TObject);
var
spi: TSPILinuxDevice;
rbuf, wbuf: array[0..2] of Byte;
rslt: Word;
dac_rbuf, dac_wbuf: array[0..1] of Byte;
begin
spi := TSPILinuxDevice.Create(0,0);
spi.Mode := SPI_MODE_0;
try
// ADC_Ch1
wbuf[0] := %00000110;
wbuf[1] := %00000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc1 := rslt;
adc1:=filter(spi_adc1,Puffer_adc1);
//ADC_Ch2
wbuf[0] := %00000110;
wbuf[1] := %01000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc2 := rslt;
adc2:=filter(spi_adc2,Puffer_adc2);
// ADC_Ch3
wbuf[0] := %00000110;
wbuf[1] := %10000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc3 := rslt;
adc3:=filter(spi_adc3,Puffer_adc3);
// ADC_Ch4
wbuf[0] := %00000110;
wbuf[1] := %11000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc4 := rslt;
adc4:=filter(spi_adc4,Puffer_adc4);
// ADC_Ch5
wbuf[0] := %00000111;
wbuf[1] := %00000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc5 := rslt;
adc5:=filter(spi_adc5,Puffer_adc5);
// ADC_Ch6
wbuf[0] := %00000111;
wbuf[1] := %01000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc6 := rslt;
adc6:=filter(spi_adc6,Puffer_adc6);
// ADC_Ch7
wbuf[0] := %00000111;
wbuf[1] := %10000000;
spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
rslt := (rbuf[1] and $0F) shl 8;
rslt := rslt or rbuf[2];
spi_adc7 := rslt;
adc7:=filter(spi_adc7,Puffer_adc7);
finally
spi.Destroy;
end;
spi := TSPILinuxDevice.Create(0,1);
spi.Mode := SPI_MODE_0;
try
dac_wbuf[0] := %01110000 or (dac1 shr 8); // DAC_Ch1
dac_wbuf[1] := dac1 shl 4;
spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
dac_wbuf[0] := %11110000 or (dac2 shr 8); // DAC_Ch2
dac_wbuf[1] := dac2 shl 4;
spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
finally
spi.Destroy;
end;
end;
end.