Gpio und procedures

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Gpio und procedures

Beitrag von Matze66 »

Hallo.

Ich möchte die Gpio per interrupt abfragen.

Frage:
Existiert eine Möglichkeit wie z. B. "procedure interrupt(Gpio22)", analog zu den bestehenden procedures, um die Abfrage in eine eigene Prozedur auszulagern? Ich habe externe Ereignisse, die ich abfragen möchte. Buttons auf dem Monitor laufen, also
Software, ich möchte auch Hardwareschalter nutzen.

Da ich aus der C-Welt komme, ist für mich Pascal leider sehr unübersichtlich. Hat vielleicht jemand einen Codeschnipsel dafür, und falls nicht, kurzer Code fürs polling? Ich finde immer nur Beispiele wie "wenn Knopf gedrückt" usw. Mir fehlen schlicht die Syntax für Lazarus und die Implementierung in der IDE.

Matthias

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Gpio und procedures

Beitrag von theo »

Bezieht sich das auf den Raspi?
Sollen wird das ins "Raspberry Pi & Co." Unterforum verschieben?

Ansonsten keine Ahnung. Vllt. hier:
https://github.com/laz2wiringpi/laz2wiringpi
https://wiki.lazarus.freepascal.org/Laz ... spberry_Pi

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

Tschuldigung, Raspberry Pi (3+4).

Kannst Du den link anhängen zu dem Forum?

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Gpio und procedures

Beitrag von theo »

Hab's verschoben.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Gpio und procedures

Beitrag von h-elsner »

Es gibt mehrere Möglichkeiten die GPIO anzusteuern bzw. abzufragen. WiringPi wäre eine, die viel bietet. Eine andere Möglichkeit ist SYSFS, also die Dateien ansprechen. Das braucht dann keine externe SW. Dafür gibt es etwas fertiges von einem Entwickler hier aus dem Forum. Ich finde es gerade nicht. Das hab ich aber nicht vollständig verstanden und einfach auf sysfs-Basis ezwas eigenes gemacht. Stark reduzierter Funktionsumfang, aber für mich hat es gereicht. Ich frage damit Tasten ab (polling), gebe PWM Steuersignale aus usw.
Mit interrupts habe ich nichts gemacht.

Zum Anschauen gibt es das hier, die unit "SR24_ctrl.pas":
https://github.com/h-elsner/common_units

Das PWM-zeug geht eventuell nur beim RaspberryPi 3. Beim 4er wurde etwas geändert, aber ich habe keinen zum Testen.

Beispielanwendungen hier:
https://github.com/h-elsner/SR24_decode
https://github.com/h-elsner/PiPulse

Gruß HE

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

Danke für die Antwort.

Die Frage war, wie kann ich unter Lazarus in der IDE mir analog zu z. B. "procedure BitButton1Click()" eine (Beispiel) "procedure InterruptPin27()" anlegen.
Ich nöchte ja nicht im Deklarationsteil bzw. vor den procedures alle Pins abfragen müssen, sondern diese Sachen dorthin auslagern, wo sie m. M. n. hingehören. Da ich es als Schnittstellenbauer als angenehmer empfinde, einen Knopf zu drücken als einen kryptischen Text wie "gpio -g read 17 0" usw. (ohne Tastatur bzw. am Touch) zu schreiben, nur damit die Pins abgefragt werden, suche ich für die Lazarus IDE eine simple Methode , um strukturiert zu programmieren.

Hat jemand einen Codeschnipsel für die Lazarus IDE für den Pi für mich? Pascal ist für mich als C-Entwickler und Hardwaremensch leider ziemlich unverständlich.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Gpio und procedures

Beitrag von af0815 »

viewtopic.php?t=13643
https://wiki.freepascal.org/Lazarus_on_ ... are_access

Du hast am RasPi ein Betriebssystem unterliegend, also muss man nach dessen Spielregeln spielen. Unter Linux halt das sysfs. Noch dazu muss man sich mit den Rechten herumschlagen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Gpio und procedures

Beitrag von theo »

@Matze66: So ganz 100%ig verstehe ich deine Frage nicht.
Suchst du quasi das geeignete Ereignis, um die GPIO abzufragen?
In dem Bsp. hier wurde dazu eine "TApplicationProperties" Komponente auf das Formular gezogen und dort das Event "OnIdle" als Abfragezeitpunkt genutzt.

In meinem ersten Link im ersten Beitrag mit h2wiringpi gibt es wohl auch einen anderen Weg, der wie ein Interrupt aussieht (Demo in "/test/test_interrupt/utest_interrupt.pas" )

Code: Alles auswählen

procedure pintestint3;
begin
  // got an interrupt
   writeln('Pulled Low');
end;
...
wiringPiISR_pas ( P11, il_EDIGE_FALLING , @pintestint3 );
Ich kenne mich damit aber nicht aus.
wiringPiISR
This function registers a function to receive interrupts on the specified pin. The edgeType parameter is either INT_EDGE_FALLING, INT_EDGE_RISING, INT_EDGE_BOTH or INT_EDGE_SETUP.
http://wiringpi.com/reference/priority- ... d-threads/

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

Die Frage ist:
Wie kann ich strukturiert programmieren, also eine prozedure nutzen, die wirklich bei einem Interupt auch reagiert, ohne dass ich dauernd pollen muss.

Bei meinethalben 50 procedures, die ja auch manchmal arbeiten müssen, wie z. B. auf Taster am Touch reagieren müssen, wird ohne einen interrupt eventuell einiges an Daten unter den Tisch fallen beim pollen. Deshalb suche ich nach einer Lösung, dass wirklich ein Interrupt ausgelöst wird.

Das Beispiel hatte ich nicht ganz verstanden: Es handelt sich ja um einen externen Hardwaretaster, wird die procedure dadurch aufgerufen? Ich finde leider nichts dazu, wer der Rufer ist, also wer alles dafür sorgt, dass genau diese procedure aufgerufen wird.

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

af0815 hat geschrieben:
Mo 10. Okt 2022, 08:05
Du hast am RasPi ein Betriebssystem unterliegend, also muss man nach dessen Spielregeln spielen. Unter Linux halt das sysfs. Noch dazu muss man sich mit den Rechten herumschlagen.
Die Spielregeln sollten doch aber so sein, dass ein knopf, der gedrückt wird, mit simplen Methoden ein Event auslöst, welches man abfangen kann. Dass ausgerechnet die Pins als Hauptkomponente so schwer abzufragen sind, wollte mir nicht in den Kopf, deshalb die Frage nach einer vorhandenen Komponente oder Klasse, ohne das händisch zu erledigen.

Die procedure TForm1.ApplicationProperties1Activate(Sender: TObject) wird anscheinend immer aufgerufen, egal was man tut, das ist gut und nutzbar, da dann das pollen entfällt. Ich finde leider keine nähere Erklärung zu dieser Komponente.

Die Rechte muss ich nicht setzen, wenn ich über Lazarus die Pins anfasse, das funktioniert auch ohne Eingriff.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Gpio und procedures

Beitrag von theo »

Hast du diesen Thread, welcher oben bereits von af0815 verlinkt wurde eigentlich gelesen?
viewtopic.php?p=121670

Ich habe irgendwie den Eindruck, dass du der Ansicht bist, Lazaurs wäre rund um Raspi GPIOs herum gebaut und deshalb müsse das alles einfacher sein. :wink:

ApplicationProperties.OnIdle oder Applcation.OnIdle wird afaik aus der Message Queue heraus aufgerufen, wenn die Anwendung Idle ist.
Dort kann man GPIO auslesen.

Ansonsten wie in dem obigen Thread:
viewtopic.php?p=121670#p121670
Ein Bsp. mit pascalio, in deinem Fall dann Multi-Threaded.

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

Ich verstehe diesen Satz leider nicht:
"ApplicationProperties.OnIdle oder Applcation.OnIdle wird afaik aus der Message Queue heraus aufgerufen, wenn die Anwendung Idle ist."

Was ist die "Message queue"?
Wann ist welche "Anwendung Idle"? Wenn damit das Programm gemeint ist, hatte ich mich nur gefragt, wer ruft das auf? Wird das einmal ausgeführt, permanent, oder nur bei zugewiesenen Ereignissen?

ApplicationProperties1Idle: Meine Frage war, wer ist der Rufer? Eine einfache verständliche Antwort würde mir weiterhelfen, da ich die Syntax nicht verstehe.

"Ich habe irgendwie den Eindruck, dass du der Ansicht bist, Lazaurs wäre rund um Raspi GPIOs herum gebaut"

Der Eindruck täuscht, Lazarus hat damit nichts zu tun. Ich gehe einfach davon aus, dass eine der Hauptanwendungen die Gpio betrifft. Damit wird doch deutlich geworben (Schaltaufgaben). Ich hatte mich nur gefragt, ob es wirklich so ist, dass eine simple Aufgabe wie "Abfrage Knopf gedrückt" eine zwanzigzeilige Syntax erfordert. Wenn das so ist, muss ich eben damit leben.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Gpio und procedures

Beitrag von theo »

Matze66 hat geschrieben:Ich verstehe diesen Satz leider nicht:
"ApplicationProperties.OnIdle oder Applcation.OnIdle wird afaik aus der Message Queue heraus aufgerufen, wenn die Anwendung Idle ist."
Ich habe es nicht ganz richtig gesagt. Es ist der Message Loop worin die Message Queue abgearbeitet wird.

So funktionieren GUI-Anwendungen.

Wenn du deine .lpr Datei anschaust, dann steht da am Ende "Application.Run;"
Das ist eine Dauerschleife, wo die GUI-Anwendung darauf wartet, dass etwas passiert.
Also irgend ein Ereignis mit der Maus oder der Tastatur etc...
Von da aus werden letztlich die OnClick oder was immer Ereignisse ausgelöst.
Das Betriebssystem/Widgetset legt diese Ereignisse in einer Message Queue (vllt. "Nachrichtenstapel") ab, welche dann von der Anwendung abgearbeitet wird.

Vereinfacht gesagt: Wenn nichts mehr ansteht in der Message Queue (oder möglicherweise auch zusätzlich nach jeder Message, das wäre zu erforschen), ist die Anwendung Idle und kann sich z.B. um die GPIO Abfrage kümmern.

Vergiss nicht, dass das Raspi OS kein Echtzeit System ist. Also Latenzen gehören da sowieso dazu.

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Gpio und procedures

Beitrag von Matze66 »

Danke, das verstehe ich.

Keine Echtzeit ist klar, ich stelle ihn teilweise für einige Millisekunden mit z. B. Delay(100) etwas ruhig, gerade bei den Ports, die ja etwas brauchen am Beginn für die Initialisierung.

GUI-Anwendungen: Auch klar, seit bummelig 22 Jahren im Thema, allerdings auf Atmega und größeren Prozessoren, und Windowsystemen und in C. Da nehme ich die Bitmaske, klappt sehr gut. Deshalb meine Frage, ob schon jemand dieses Thema eventuell als Klasse gelöst hatte.
Heißt, die "Message Queue" ist der Stack. Also wird erst der Stack abgearbeitet, und dann kommen die Gpio an die Reihe.

Meine vorläufige Quick-and-dirty-Lösung mit Timer @Eingangspin:

procedure TForm1.Eingangspin(Sender: TObject);
begin
if Eingang27.Value = true then begin
while Eingang27.Value = true do begin
end;
Watt := Watt + 1;
Label1.Caption := IntToStr(Watt);
end;
end;

Solange also jemand die Finger auf dem Taster hat oder die Impulse ankommen, steht zwar alles, ist aber egal. Die Impulse sind rund 90 ms lang, und der Timer steht bei 100 ms. Ich muss einfach meine PV-Anlage auslesen, und bei genug Erzeugung soll das Auto laden, allerdings bei Batterie unter 50% soll das Ladeschütz Schütz abgeworfen werden.

Für zeitkritische Sachen nehme ich dann eben weiterhin andere Prozessoren.

Danke für die Antworten und die Hilfe.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Gpio und procedures

Beitrag von af0815 »

Noch ein Link https://lazarusforum.de/viewtopic.php?f ... i&start=15

Und für deine Interrupts vielleicht was in code https://github.com/laz2wiringpi/laz2wir ... errupt.pas ist etwas älter aber vielleicht ein Weg
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten