pascalIO: Frage zum sinnvollen Nutzen der lib

Rund um die LCL und andere Komponenten
renitenzzipfel
Beiträge: 8
Registriert: Sa 4. Apr 2015, 09:42

pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von renitenzzipfel »

Hallo 2all,

bin dabei einen Monitor für Photovoltaik zu entwickeln, Dazu will ich einen http://www.ti.com/lit/ds/symlink/ina3221.pdf benutzen
und den unter Linux mit i2c fahren, speziell auf einem Raspberry und/oder bananapi.

will dazu pascalio als Basis nutzen und frage jetzt mal in die Runde was am wenigsten Arbeit
verursacht:

Code: Alles auswählen

type
 TINA3221 = class(TI2CThreadSaveDevice):
  ...
End;
 

oder

Code: Alles auswählen

type
 TINA3221 = class(TI2CLinuxDevice):
  ...
End;
 


Für Tips und Anregungen wäre ich sehr dankbar.


lg Rz
Je kleiner die Aufgabe, desto länger ist das Gesicht bei Auftreten eines Fehlers.

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: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Socke »

Hallo Rz,

Wenn nur ein Thread auf den I2C-Bus zugreift, reicht TI2CLinuxDevice.

Wenn mehrere Threads auf den I2C-Bus zugreifen, solltest du TI2CThreadSaveDevice verwenden. Hier musst du ggf. noch selbst Critical Sections für jedes angeschlossene I2C-Device verwenden, um den Zugriff der Threads auf die einzelnen Devices gegeneinander abzusichern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

renitenzzipfel
Beiträge: 8
Registriert: Sa 4. Apr 2015, 09:42

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von renitenzzipfel »

danke für die schnelle Anrwort
Socke hat geschrieben:Wenn nur ein Thread auf den I2C-Bus zugreift, reicht TI2CLinuxDevice.

Wenn mehrere Threads auf den I2C-Bus zugreifen, solltest du TI2CThreadSaveDevice verwenden. Hier musst du ggf. noch selbst Critical Sections für jedes angeschlossene I2C-Device verwenden, um den Zugriff der Threads auf die einzelnen Devices gegeneinander abzusichern.

bedeutet das jetzt, wenn mehrere i2c devices am selben Bus hängen, es günstiger ist TI2CThreadSaveDevice zu verwenden? Zumal meine Anwendung ja zeit mäßig völlig unkritisch ist.
Denke alle 10 sec einen der INA3221's auslesen oder so.

lg Rz
Je kleiner die Aufgabe, desto länger ist das Gesicht bei Auftreten eines Fehlers.

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: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Socke »

renitenzzipfel hat geschrieben:bedeutet das jetzt, wenn mehrere i2c devices am selben Bus hängen, es günstiger ist TI2CThreadSaveDevice zu verwenden? Zumal meine Anwendung ja zeit mäßig völlig unkritisch ist.
Denke alle 10 sec einen der INA3221's auslesen oder so.

Nein, wichtig ist die Anzahl der Threads, die auf den I2C-Bus zugreifen möchten.

Eine GUI-Anwendung in Lazarus hat nur einen Thread (Hauptthread/Mainthread). Hier kannst du einen Timer auf das Formular legen und im OnTimer-Event die Geräte nach einander auslesen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

sporex
Beiträge: 8
Registriert: Sa 5. Jan 2013, 15:28

pascalIO / fpgpio

Beitrag von sporex »

Hallo zusammen,

ich stehe momentan ziemlich auf'm Schlauch und brauche Hilfe:

Ich benutze fpgpio um eine gewisse Anzahl von GPIO's als Ausgang bzw. Eingang zu definieren.
Die Initialisierung erfolgt so:

Code: Alles auswählen

PIN_1:=TGpioLinuxPin.Create(20);
PIN_1.Direction:=gdOut;
PIN_1.Value:=low;
 
PIN_2:=TGpioLinuxPin.Create(19);
PIN_1.Direction:=gdOut;
PIN_1.Value:=low;
 
.......
 
PIN_X:=TGpioLinuxPin.Create....
.... 
 


Dies alles auf einem Pi 2 mit Raspbian V8 Jessie und Laz v.1.2.4

Wenn ich den PI reboote, die grafische Oberfläche (Xwindows) und danach die Laz. IDE starte und den code ausführe, passiert beim ersten Versuch garnichts, d.h. die PIN's bleiben Eingänge (trotz der Initialisierung) wenn ich sie mit der Konsole abfrage (GPIO readall)
Es nützt auch nichts wenn ich die Initialisierungsprozedur im Code zweimal durchlaufe.

Erst wenn ich die Ausführung über die IDE abbreche und den Code ein zweites mal ausführe werden die GPIO's wie erwartet gesetzt.
Andererseits sehe ich, wenn ich den code nach dem reboot zeilenweise mit dem debugger ausführe, dann funktioniert es wie erwartet.

Gut, ich muss zugeben dass ich den Code bisher nur unter der IDE getestet habe, aber wenn das auch passieren sollte, wenn der Code direkt aus rc.local nach dem boot ausgeführt wird, dann wäre es fatal für mich.

Ich kann mir durchaus vorstellen dass es sich um ein Linux oder Laz Problem handelt.

Deshalb Danke für alle Hinweise im Voraus.

Sporex

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

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Mathias »

Hast du mal diesen Link angeguckt, dort wird beschrieben, wie man auf die GPIO zugreift.

http://wiki.freepascal.org/Lazarus_on_R ... zeduren.29
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: pascalIO / fpgpio

Beitrag von Requion »

Code: Alles auswählen

PIN_1:=TGpioLinuxPin.Create(20);
PIN_1.Direction:=gdOut;
PIN_1.Value:=low;
 
PIN_2:=TGpioLinuxPin.Create(19);
PIN_2.Direction:=gdOut;
PIN_2.Value:=low;

In deinem geposteten Code hast du PIN_2 erstellt und dann mit PIN_1 weitergemacht. Vielleicht nur ein Flüchtigkeitsfehler?
Ansonsten sehe ich hier vom Code her kein Problem. Hast du mal probiert damit zu arbeiten? Also einen Wert zuweisen. Das dürfte ja eigentlich nicht funktionieren wenn er auf gdOut gesetzt ist.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

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

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Mathias »

Wieso sollte es mit gdOut nicht funktionieren ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sporex
Beiträge: 8
Registriert: Sa 5. Jan 2013, 15:28

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von sporex »

@Requion

ja, es ist tatsächlich ein copy/paste Fehler in meinem geposteten code:

Code: Alles auswählen

PIN_1:=TGpioLinuxPin.Create(20);
PIN_1.Direction:=gdOut;
PIN_1.Value:=low;
 
PIN_2:=TGpioLinuxPin.Create(19);
PIN_2.Direction:=gdOut;
PIN_2.Value:=low;


So wie oben ist es in Wirklichkeit.

Ich habe die fraglichen Zeilen herauskopiert und in eine simple Konsolanwendung umgewandelt.
Es scheint tatsächlich ein Problem zu sein, welches mit der GUI zusammenhängt:

Wenn ich die Anwendung nach einem reboot zum ersten mal aus der GUI starte passiert nichts (d.h. alle GPIO bleiben inputs).
Erst beim zweiten Aufruf werden die Pins korrekt initialisiert.

Wenn ich dagegen die Anwendung nach einem reboot von der Konsole aus starte (also ohne GUI) werden die Pins bereits beim ersten Versuch korrekt initialisiert.

Nachdem das Programm sowieso eine Konsolanwendung werden soll, hat sich das Problem für mich eigentlich erledigt.

Grüße
Sporex

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von pluto »

Es könnte auch ein Problem gewesen sein mit den rechten: Hast du das Konsolen Programm mit Root oder Nutzer rechten gestartet?
MFG
Michael Springwald

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Requion »

pluto hat geschrieben:Es könnte auch ein Problem gewesen sein mit den rechten: Hast du das Konsolen Programm mit Root oder Nutzer rechten gestartet?

Der Gedanke ist garnicht so abwegig. Allerdings wundert es mich das es beim zweiten mal aufrufen dann ging. Deshalb glaub ich nicht unbedingt das es an den Benutzerrechten liegt.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von pluto »

Allerdings wundert es mich das es beim zweiten mal aufrufen dann ging. Deshalb glaub ich nicht unbedingt das es an den Benutzerrechten liegt.

Stimmt, da war doch noch was....

Dann würde ich das in einem Extra Thread machen, kann sein das es hier zu unerwarteten Konflikten kommt.
(bisher nutze ich die lib noch nicht, aber man weiß ja nie....)
MFG
Michael Springwald

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Requion »

pluto hat geschrieben:
Allerdings wundert es mich das es beim zweiten mal aufrufen dann ging. Deshalb glaub ich nicht unbedingt das es an den Benutzerrechten liegt.

Stimmt, da war doch noch was....

Dann würde ich das in einem Extra Thread machen, kann sein das es hier zu unerwarteten Konflikten kommt.
(bisher nutze ich die lib noch nicht, aber man weiß ja nie....)

Mir fehlt noch etwas Hardware für mein aktuelles Projekt, deshalb hab ich mich noch nicht viel damit beschäftigt. Da werde ich aber auch auf die GPIOs zugreifen, weshalb ich das hier schon interessant finde.

Ich muss mal schauen ob ich das Zuhause nachstellen kann.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

sporex
Beiträge: 8
Registriert: Sa 5. Jan 2013, 15:28

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von sporex »

Re: Hast du das Konsolen Programm mit Root oder Nutzer rechten gestartet?

Sporex: als Standardnutzer PI (in allen beschriebenen Fällen)

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

Re: pascalIO: Frage zum sinnvollen Nutzen der lib

Beitrag von Mathias »

Ich habe die fraglichen Zeilen herauskopiert und in eine simple Konsolanwendung umgewandelt.
Es scheint tatsächlich ein Problem zu sein, welches mit der GUI zusammenhängt:

Wenn ich die Anwendung nach einem reboot zum ersten mal aus der GUI starte passiert nichts (d.h. alle GPIO bleiben inputs).
Erst beim zweiten Aufruf werden die Pins korrekt initialisiert.

Kannst du mal dein GUI-Code hier posten, vielleicht hast du ein simpler Fehler eingebaut.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten