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.