[gelöst] Raspi GPIOs zurücksetzen

Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[gelöst] Raspi GPIOs zurücksetzen

Beitrag von Michl »

Hi,

ich habe mir ein Überwachungsprogramm für meine Heizung geschrieben. Läuft unter Windows und auf meinem Raspi. Nun möchte ich nicht nur die Anzeige der Temperatur von Heizkessel, Ölkessel, Pufferspeicher etc. auf dem Display sehen, sondern gern eine LED leuchten lassen, wenn wieder Holz nachgelegt werden muss.

Folgendes PascalIO Testprogramm hatte ich geschrieben (4 Toggleboxen schalten ein 4fach Relais):

Code: Alles auswählen

 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FGpio02 := TGpioLinuxPin.Create(2);
  FGpio03 := TGpioLinuxPin.Create(3);
  FGpio04 := TGpioLinuxPin.Create(4);
  FGpio17 := TGpioLinuxPin.Create(17);
  FGpio02.Direction := gdOut;
  FGpio03.Direction := gdOut;
  FGpio04.Direction := gdOut;
  FGpio17.Direction := gdOut;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FGpio02.Destroy;
  FGpio03.Destroy;
  FGpio04.Destroy;
  FGpio17.Destroy;
end;
 
procedure TForm1.ToggleBox1Change(Sender: TObject);
begin
  FGpio02.Value := ToggleBox1.Checked;
end;
 
procedure TForm1.ToggleBox2Change(Sender: TObject);
begin
  FGpio03.Value := ToggleBox2.Checked;
end;
 
procedure TForm1.ToggleBox3Change(Sender: TObject);
begin
  FGpio04.Value := ToggleBox3.Checked;
end;
 
procedure TForm1.ToggleBox4Change(Sender: TObject);
begin
  FGpio17.Value := ToggleBox4.Checked;
end;   

Starte ich das Programm von Lazarus heraus und beende es aus der IDE heraus, bleiben der Status der GPIOs erhalten. Wenn ich das Programm neu starte, kann ich alle GPIOs aus- und anschalten - alles prima!

Beende ich das Programm ganz normal (außerhalb und innerhalb der IDE), bekommt GPIO 17 irgendwie Kriechstrom und beim nächsten Start lässt sich kein GPIO mehr schalten. Erst wenn ich aus der IDE heraus das Programm abbreche, lassen sich die GPIOs beim nächsten Programmstart wieder aus- und anschalten.

Wie kann ich sicherstellen, daß die GPIOs nach Programmende ausgeschaltet werden und daß sie immer bei Programmstart funktionieren?

Raspberry 3B+, Raspbian GNU/Linux 10 (buster)

(ich bin Noob bei Raspi und bin erstaunt, daß alles bisher recht unkompliziert funktioniert hat - übrigens danke af0815 und Socke!)
Zuletzt geändert von Michl am Fr 27. Dez 2019, 17:58, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Raspi GPIOs zurücksetzen

Beitrag von Mathias »

Wieso setzt du den Value Wert nicht in FormCreate und FormDestroy ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Raspi GPIOs zurücksetzen

Beitrag von Timm Thaler »

Mach mal ein Delay 200 msec zwischen Create und Direction.

Ein häufiger Fehler: Das Create eine Pins (Anlegen) kann zwischen Befehl und bis der Gpio zur Verfügung steht 50-100msec dauern. Kommt vorher das Direction, geht es ins Leere - und der Gpio arbeitet als Eingang. Wurde das Programm vorher schonmal gestartet und der Gpio nicht richtig abgemeldet, ist er noch vorhanden und es funktioniert - allerdings nur zufällig.

Vor dem Destroy würde ich die Gpio wieder abschalten. Oder man müsste mal schauen, was Destroy genau macht: Setzt es den Gpio wirklich zurück oder entfernt es nur den Handler.

Ich hoffe Du steuerst keine sicherheitskritischen Sachen mit dem Raspi. Jedes Programm kann jederzeit den Status der Gpios ändern.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Raspi GPIOs zurücksetzen

Beitrag von kralle »

Moin,

Du hast Bedenken, dass "GPIO 17 " "Kriechstrom" bekommt.
Stell Dir vor das könnte sogar sein.

Um definierte Zustände zu bekommen, schaltet man nicht einmal 5V auf einen Eingang und dann nichts, sondern schaltet man entweder 5V oder 0V.
Offene Eingänge können immer zu Problemen führen.
Ich weiß jetzt zwar nicht, ob der Raspberry "Pulldown"-Widerstände vormontiert hat, aber ich würde es mal im abwechselt 5V/0V probieren.

Läuft der Raspberry eigentlich mit 5V? Oder mit 3,3V?

Wenn es mit 0V funktioniert, dann kannst Du z.B. 10kOhm-Widerstände vom Eingang zum 0V-Potential legen.

Siehe auch hier : https://rn-wissen.de/wiki/index.php/Pullup_Pulldown_Widerstand und hier
https://www.elektronik-kompendium.de/sites/raspberry-pi/2006051.htm

Gruß HEiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Raspi GPIOs zurücksetzen

Beitrag von Timm Thaler »

Der Raspi kann Pullups einschalten, es kann also sein, dass Gpio17 zurück auf Eingang geschaltet wird, dort Pullups ein sind, und dann fließen da einige 100µA von 3.3V raus.

Gpio17 ist auch RTS für den Uart. Wenn da also ein Programm - und das kann das standard Terminal sein - meint den Uart bedienen zu müssen und Hardware-Handshake aktiv ist, dann kann jederzeit an Gpio17 irgendwas schalten.

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

Re: Raspi GPIOs zurücksetzen

Beitrag von Mathias »

Läuft der Raspberry eigentlich mit 5V? Oder mit 3,3V?

Mit 5V Betriebsspannung, aber die GPIOS laufen mit 3.3V. Somit aufpassen, das man nichts durchbratet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Raspi GPIOs zurücksetzen

Beitrag von kralle »

Moin,

ich nochmal.

Kann Dein Problem vielleicht auch hier mit zusammenhängen:

Code: Alles auswählen

Click auf Schließen => OnClose-Ereignis => Application.destroy => OnDestroy-Ereignis => Form.destroy => Formular wird freigegeben.

Quelle: https://www.lazarusforum.de/viewtopic.php?f=18&t=10443

Das da etwas im falschen Moment geschieht?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Raspi GPIOs zurücksetzen

Beitrag von Michl »

Timm Thaler hat geschrieben:Mach mal ein Delay 200 msec zwischen Create und Direction.
Vielen Dank, ja das hilft!

Timm Thaler hat geschrieben:Ich hoffe Du steuerst keine sicherheitskritischen Sachen mit dem Raspi. Jedes Programm kann jederzeit den Status der Gpios ändern.
Nein nein, ist nur zur Überwachung, damit meine Kinder oder meine Frau wissen, wenn ich nicht zuhause bin, wann der Holzkessel sinnvollerweises wieder gefüllt werden kann :wink: Die Heizung wird an sich von ISR-SSR geregelt und zur Fernüberwachung nutze ich ein OZW672.01 von dem auch der Raspi die Daten bezieht.

Mathias hat geschrieben:Wieso setzt du den Value Wert nicht in FormCreate und FormDestroy ?
Das hatte ich alles probiert, sogar mit Sleep, jedoch nicht zwischen Create und Direction. :oops:

Timm Thaler hat geschrieben:Ein häufiger Fehler: Das Create eine Pins (Anlegen) kann zwischen Befehl und bis der Gpio zur Verfügung steht 50-100msec dauern. Kommt vorher das Direction, geht es ins Leere - und der Gpio arbeitet als Eingang. Wurde das Programm vorher schonmal gestartet und der Gpio nicht richtig abgemeldet, ist er noch vorhanden und es funktioniert - allerdings nur zufällig.
Ja, jetzt verstehe ich das - Danke!!

Auch danke an alle für die sonstigen Anregungen!!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: [gelöst] Raspi GPIOs zurücksetzen

Beitrag von Mathias »

ExitProc ist auch noch Interessant. Damit kann man am Ende noch Befehle auffrufen, auch dann, wen das Programm mit einem Laufzeitfehler beendet wird.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: [gelöst] Raspi GPIOs zurücksetzen

Beitrag von Timm Thaler »

Tipp am Rande:

Versuch das Programm möglichst als Konsolenprogramm ohne GUI zu bauen.

Ich hab auf dem Raspi regelmäßig Probleme mit Memleaks bei GUI-Programmen, die auf dem PC problemlos laufen. Manchmal fällt es erst nach Tagen auf, dass das Programm immer mehr Speicher akkumuliert, aber irgendwann meckert dann der Raspi, dass er nix mehr tun kann weil Speicher voll. Und sowas ist echt nervig zu finden und zu fixen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: [gelöst] Raspi GPIOs zurücksetzen

Beitrag von af0815 »

Ich programmiere laufend Programme mit GUI für den RasPi. Das mit den Memleaks kann ich nicht nachvollziehen. Allerdings muss man ganz penibel auf das Objectmanagment achten. Debugging am RasPi geht ab 3+ auch vernünftig. Damit können kritische Stellen direkt debugged werden und auch als Leak gefixt werden. Damit kann ich das nicht nachvollziehen. Planung vorausgesetzt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: [gelöst] Raspi GPIOs zurücksetzen

Beitrag von Timm Thaler »

af0815 hat geschrieben:Ich programmiere laufend Programme mit GUI für den RasPi.


Ich meine hier Programme, die tagelang durchlaufen. Und da sollte man das schon anfangs beobachten, ob da der Speicher hochläuft. Bei ein paar MB pro Stunde merkt man das nicht gleich, wenn der Raspi 1GB hat.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst] Raspi GPIOs zurücksetzen

Beitrag von Michl »

Timm Thaler hat geschrieben:Tipp am Rande:

Versuch das Programm möglichst als Konsolenprogramm ohne GUI zu bauen.

Ich hab auf dem Raspi regelmäßig Probleme mit Memleaks bei GUI-Programmen, die auf dem PC problemlos laufen. Manchmal fällt es erst nach Tagen auf, dass das Programm immer mehr Speicher akkumuliert, aber irgendwann meckert dann der Raspi, dass er nix mehr tun kann weil Speicher voll. Und sowas ist echt nervig zu finden und zu fixen.

Na mal sehen, wie es hier ist. Läuft jetzt erstmal.

Falls es jemanden nützt, Source habe ich hier liegen: https://svn.code.sf.net/p/heatermonitor/svn/trunk

Ja und noch ein gesundes neues Jahr!!!
Dateianhänge
Bild1.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten