Gpio und procedures
-
- 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
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
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
Re: Gpio und procedures
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
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
-
- 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
Tschuldigung, Raspberry Pi (3+4).
Kannst Du den link anhängen zu dem Forum?
Kannst Du den link anhängen zu dem Forum?
Re: Gpio und procedures
Hab's verschoben.
- h-elsner
- Lazarusforum e. V.
- Beiträge: 281
- 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
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
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
-
- 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
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.
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
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.
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).
Re: Gpio und procedures
@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" )
Ich kenne mich damit aber nicht aus.
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 );
http://wiringpi.com/reference/priority- ... d-threads/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.
-
- 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
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.
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.
-
- 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
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.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 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.
Re: Gpio und procedures
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.
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.
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.

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.
-
- 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
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.
"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.
Re: Gpio und procedures
Ich habe es nicht ganz richtig gesagt. Es ist der Message Loop worin die Message Queue abgearbeitet wird.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."
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.
-
- 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
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.
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
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
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).