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!
RPi3 + MAX31855 + Lazarus = kein Durchblick
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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
Mit Java und C/C++ sehe ich rot
Re: RPi3 + MAX31855 + Lazarus = kein Durchblick
@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?
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' ".
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?
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' ".
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: RPi3 + MAX31855 + Lazarus = kein Durchblick
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 .
So werden allerdings nur positive Temperaturen gemessen, für meinen Test langt mir das erstmal. Die Berechnungsroutine muss ich halt noch anpassen.
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 .
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.