RPi3 + MAX31855 + Lazarus = kein Durchblick

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von ppahl »

Hallo,

eigentlich habe ich eine recht einfache Aufgabenstellung: Ich möchte auf dem RPi3 via Lazarus den MAX31855 (Thermocoupler mit SPI) timergesteuert auslesen. Der MAX ist dabei ein recht simpler Geselle: CS auf LOW, dann Takt auf CLK und schon spuckt er 32 Datenbits raus. Was auf einem AVR kein Ding ist überfordert mich beim RPi gerade total, irgendwie habe ich eine absolute Blockade. Wobei sicher auch nicht hilfreich ist dass ich seit längerem nichts mehr in Pascal gemacht habe...

rpi_hal habe ich probiert -> schon das Einbinden von rpi_hal in den uses sorgt selbst bei einer ansonsten jungfräulichen Form für einen Error 211, das funzt irgendwie schon im Kern nicht.
Dann habe ich mich an PXL versucht, aber egal wie ich Prozeduren oder Funktionen aufzurufen versuche, es folgt zuverlässig "only class methods, class properties or class variables can be accessed" -> Null Plan was mir Lazarus da mitteilen will und wie ich es abstelle.
Und bei Pascalio fehlt mir jegliche Dokumentation, die downloadbare Pascalio.xml habe ich jedenfalls mit keinem Programm lesbar öffnen können. Try&Error schlug erwartungsgemäß fehl.
Gleich vorab: Codebeispiele von mir kann ich nicht liefern -> x-mal überschrieben und letztlich alles gelöscht.

Meine Suche zu SPI, RPi und Lazarus im Web führte leider zu rein gar nix...ist nicht gerade die Besonderheit des RPi das Vorhandensein von GPIOs und Schnittstellen? Und niemand hat die bislang genutzt? Kann ich nicht glauben.

Kann mir Dummie mal jemand mit ein paar Codeschnipseln auf die Sprünge helfen wie ich dem MAX timergesteuert seine Datenbits entlocken kann? Oder ist das echt so eine Irrsinnsaktion? Dann ist der RPi nämlich für mich nutzlos und wird entsorgt, dann bleibe ich bei meinen AVRs denn da stünde dann der Nutzen in keinem Verhältnis zum Aufwand. Denn eigentlich gehts mir nur darum eine bestehende AVR Applikation für eine Brennofensteuerung mit einer komfortableren und umfangreicheren GUI zu versehen, wenn das aber zu komliziert wird lasse ich alles wie es ist.

Danke! :)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von Socke »

ppahl hat geschrieben:Und bei Pascalio fehlt mir jegliche Dokumentation, die downloadbare Pascalio.xml habe ich jedenfalls mit keinem Programm lesbar öffnen können. Try&Error schlug erwartungsgemäß fehl.

Das tut mir leid. Daher versuche ich dir hier noch ein wenig Starthilfe zu geben.

Die Dokumentation ist auch online verfügbar und auch auf der Einstiegsseite verlinkt
Für SPI ist die Klasse TSPILinuxDevice für dich relevant.
Ein Beispiel für SPI unter Linux findest du in unter test/spi_linux/ (zugegeben nicht ganz intuitiv, da es auch ein Verzeichnis example gibt). Da du 32 Datenbits erwartest, müsstest du die Puffer rbuf und wbuf von Word auf Longword ändern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von Mathias »

Was auf einem AVR kein Ding ist überfordert mich beim RPi gerade total,

Das wäre schon möglich, das der bcm2708 sehr viel Overhead braucht. Die AVR haben einen direkten Draht zu SPI und I²C.

Ich kämpfe momentan mit einem MCP2221, welcher mit am PC I²C zur Verfügung stellt und dieser läuft über 10x langsamer als ein Arduino(AVR).
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

Re: RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von ppahl »

@Socke
Ja, bin ich jetzt deppert? Das Verzeichnis 'test' ist bislang meiner Aufmerksamkeit völlig entgangen...merkwürdig...
Wobei ich mit Dokumentation die unter /doc verlinkte xml-Datei meinte, ich finde kein Programm mit dem ich diese Datei lesbar öffnen kann. Die Online-Variante kannte ich auch nicht...auf welcher Seite zu Geier war ich wo ich pascalio runtergeladen habe? :shock:

Das Testbeispiel schaue ich mir noch genauer an, auf den ersten Blick entspricht es aber meinem eigenen gescheiterten Versuch soweit ich es noch im Kopf habe.

Eine andere Anmerkung aber noch: Das Package pascaliogui.lpk lässt sich bei mir nicht installieren/kompilieren, da gibts in der Unit fpgiocomp in Zeile 55 "procedure Execute; override" den Fehler "Error: Forward declaration not solved 'Execute' ".

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von Socke »

ppahl hat geschrieben:Wobei ich mit Dokumentation die unter /doc verlinkte xml-Datei meinte, ich finde kein Programm mit dem ich diese Datei lesbar öffnen kann.

Die XML-Datei ist eine LazDoc-Datei. Lazarus bringt hierzu im Verzeichnis Lazarus/doceditor den "Lazarus-Dokumentations-Editor" mit, den du aber selbst übersetzen musst.
Zum Lesen ist die Online-Variante aber besser geeignet.

ppahl hat geschrieben:Eine andere Anmerkung aber noch: Das Package pascaliogui.lpk lässt sich bei mir nicht installieren/kompilieren, da gibts in der Unit fpgiocomp in Zeile 55 "procedure Execute; override" den Fehler "Error: Forward declaration not solved 'Execute' ".

PascalIO ist bisher eine reine System-Bibliothek. D.h. man kann damit direkt auf die Systemfunktionen zugreifen, hat aber keine (direkte) Möglichkeit, z.B. eine SPI-Schnittstelle auf einem Formular zu platzieren und die entsprechenden Events zu setzen. Das Package PascalIOGUI sollte dies werden, ist bei mir aber ein wenig aus dem Fokus gefallen. Vielleicht arbeite ich daran irgendwann man weiter (oder jemand anderes).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

Re: RPi3 + MAX31855 + Lazarus = kein Durchblick

Beitrag von ppahl »

Sorry für mein Schweigen, aber ich habe probiert und probiert und probiert...
Leider war es mir mit Pascalio nicht möglich die 32 Bit auszulesen, 16 Bit ging aber.
Eben hatte ich dann die Faxen dicke und habe mir mit PXL eine Quick&Dirty Lösung zusammengedengelt. Übelster Pfusch, funktioniert aber wenigstens :wink: .


Code: Alles auswählen

unit SPITest1;
 
{$mode delphi}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, PXL.Boards.Types, PXL.Boards.RPi;
 
{ TForm1 }
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
const
  LED = 16; // Nur zur Schleifenkontrolle
  Miso = 21;
  clk = 23;
  csl = 24;
 
var
  Form1: TForm1;
  SystemCore: TFastSystemCore = nil;
  GPIO: TFastGPIO = nil;
  DWordIn : String;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  SystemCore := TFastSystemCore.Create;
  try
    GPIO := TFastGPIO.Create(SystemCore);
    try
      GPIO.PinMode[PinLED] := TPinMode.Output;
      GPIO.PinMode[csl] := TPinMode.Output;
      GPIO.PinMode[clk] := TPinMode.Output;
      GPIO.PinMode[Miso] := TPinMode.Input;
    finally
    end;
  finally
  end;
  GPIO.PinValue[csl] := TPinValue.High;
  SetLength(DWordIn,32);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  I : integer;
  Pegel : TPinValue;
  Messung : dword;
  w1, w2 : word;
  AT : word;
  AT_Out : real;
  JT : word;
  JT_Out : real;
  dummy : string;
 
begin
  GPIO.PinValue[PinLED] := TPinValue.High;
  GPIO.PinValue[clk] := TPinValue.Low// Chip Select
  SystemCore.Delay(2); // 2µsec
  GPIO.PinValue[csl] := TPinValue.Low// Chip Select aktivieren
 
  for I := 1 to 32 do
  begin
    SystemCore.Delay(2);
    GPIO.PinValue[clk] := TPinValue.High
    SystemCore.Delay(2);
    Pegel := GPIO.PinValue[Miso];
    if Pegel = TPinValue.Low then DWordIn[i] := '0' else DWordIn[i] := '1';
    SystemCore.Delay(2);
    GPIO.PinValue[clk] := TPinValue.Low
    SystemCore.Delay(2);
  end;
  GPIO.PinValue[csl] := TPinValue.High// MAX wieder schlafen legen
  Label1.caption := DWordIn; // Ausgabe des Ergebnisses als Bitfolge
 
  Messung := 0;
  for i := length(DWordIn) downto 1 do
  inc(Messung, StrToInt(DWordIn[i]) * 1 shl (length(DWordIn)-i))// Umrechnung Bitfolge in DWord
 
  w1 := hi(Messung); // externe Temperatur
  w2 := lo(Messung); // interne Temperatur
 
  AT := w1 SHR 2; // Statusbits rausschieben
  AT_Out := AT * 0.25; // externe Temperatur, wird in 0,25° Schritten gemessen
 
  JT := w2 SHR 4// Statusbits rausschieben   
  JT_out := JT * 0.0625; // interne Chip-Temperatur, wird in 0,0625° Schritten gemessen
 
  dummy :=  'Extern: ' + floattostr(AT_Out) + '°';
  label2.caption := dummy;
  dummy :=  'Intern: ' + floattostr(JT_Out) + '°';
  label3.caption := dummy;
 
  GPIO.PinValue[PinLED] := TPinValue.Low;
end;
 
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  try
   GPIO.Free;
   SystemCore.Free;
  finally
  end;
end;
 
end.
 


So werden allerdings nur positive Temperaturen gemessen, für meinen Test langt mir das erstmal. Die Berechnungsroutine muss ich halt noch anpassen.

Antworten