Interrupt vom Touch umstellen

  • Hallo Zusammen,

    ich komme bei einem Thema einfach nicht weiter und bitte um Eure Unterstützung.
    ich weiß auch nicht, ob meine Vorgehensweise richtig / sinnvoll ist.

    ich habe an einem PICO 2 (SPI) ein TFT-Touch-Screen angeschlossen.
    Soweit funktifunktionieren das TFT und der Touch.
    Ich habe die Konfiguration der SPI, des TFT's und des TOUCH in eine separate Datei ausgelagert.
    Ich kann in der main.py Elemente erstelllen und auf dem TFT darstellen. Auch der Interrupt von Touch funktioniert. Leider nich so wie er soll.

    Mein angedachter Programmaufbau:
    main.py

    hardware.py

    programm.py

    Python
    def touch_prog_press(x, y):
    	print(f"MAIN: X: {x}, Y: {y}")
    	
    
    # Interrupt für den Touch umstellen auf "touch_main_press"
    TOUCH.int_pin.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING,
                      int_handler = touch_prog_press)
    
    def prog_start(TFT, TOUCH):
    	print("programm")                  


    Mein Problem:
    wenn ich main.py starte, reagiert der Pico auf den Touch, jedoch führt er die Funktion touch_class_press aus der hardware.py und nicht die touch_main_press aus der main.py aus.

    Später sollen in der main.py vier Felder erstelt werden.
    Wenn eines der Felder angetippt wird, soll ein weiteres Programm gestartet werde.
    Der TFT und der Touch wird dann übergeben und der Interrupt für den Touch im Programm neu gesetzt werden.

    ich hoffe, ich konnte mich verständlich ausdrücken. :S

    Mein Gedanke ist, den Quellcode der einzelnen Programme (main, Hardwareconfig und Prog...) zu separieren und übersichtlicher zu gestallten.

    Meine Fragen:
    - Ist mein Gedankenansatz / Vorgehensweise richtig?
    - wie kann ich, den Interrupt-handler für den TOUCH, im neuen Programm ändern?
    - gibt es eine besser vorgehensweise?


    grüße aus dem Sauerland

    Stefan



    - Imprtiert die hardware.py

  • IC-Cruncher July 2, 2026 at 7:45 PM

    Changed the title of the thread from “nterrupt vom Touch umstellen” to “Interrupt vom Touch umstellen”.
  • IC-Cruncher Das aufteilen auf Module die dann fast nichts enthalten, macht es eher unübersichtlicher. Was auch so gar nicht hilfreich ist dabei sind die *-Importe. Damit importiert man alles aus einem Modul, inklusive allem was dieses Modul aus anderen Modulen importiert, und wenn das auch per *-Import gemacht wird, stellt sich die Frage warum überhaupt in Module aufgeteilt wird, wenn die hinterher doch wieder alles enthalten zur Laufzeit.

    Es macht auch nicht so viel Sinn Programmcode zu zeigen der gar nicht ”echt” ist, also welchen der gar nicht lauffähig ist. Es gibt beispielsweise kein Modul mit dem Namen py in einem Package mit dem Namen hardware. Gleich die erste Zeile würde also schon zu einem ImportError führen. Im hardware-Modul sind Syntaxfehler durch kaputte Einrückung. Das programm-Modul versucht ein TOUCH zu verwenden, das überhaupt nicht definiert ist also auch zu einer Ausnahme führt. TPUOUCH ist auch nirgends definiert.

    Namen werden in Python per Konvention klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Grundsätzlich lohnt die Lektüre vom Python Style Guide.

    Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die main() heisst.

    So etwas wie TOUCH wird durch die Grossschreibung nicht auf magische Weise zu einer Konstanten. Das ist ein Objekt mit Zustand, der sich im Laufe des Programms ändert, also ist das nicht konstant. So etwas definiert man nicht global und greift von überall darauf zu. spi ist auch keine Konstante. Das ist nicht das erste was man in einem Modul definiert, sondern das wäre das erste was in der Hauptfunkion als lokale Variable definiert, und dann überall wo es benötigt wird, als Argument übergeben wird.

    Die beiden Klassen sind im Grunde keine Klassen und in der __init__() noch mal ein Objekt vom Typ von dem man erbt zu erstellen, ist falsch. Das macht keinen Sinn, und kann hier konkret sogar zu Problemen führen wenn man beispielsweise zwei Display-Objekte hat, die auf den selben GPIO-Pins operieren.

    Neben der Gross-/Kleinschreibung unterscheiden sich Klassen und Funktionen auch darin, dass Klassen Dinge (im weitesten Sinne) repräsentieren, und Funktionen Tätigkeiten. Und die werden deshalb auch entsprechend benannt. config_tft ist kein Ding, sondern eine Tätigkeit. Hier ist der Name aber treffend, also sollte das keine Klasse sein, sondern eine eine Funktion, die das Display-Objekt erstellt und Konfiguriert. Wobei das erstellen aus dem Namen ablesbar sein sollte. Also eher create_tft().

    Bei config_touch macht IMHO nicht einmal eine Funktion Sinn, denn die würde ja nur ein Touch-Objekt erstellen. Das kann man aber auch einfach an der Stelle wo der Funktionsaufruf stehen würde, machen.

    Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Bei BL habe ich mal geraten, dass das backlight heissen soll.

    Zwischenstand (ungetestet):

    Für die paar Zeilen lohnt es sicher noch nicht, die auf drei Module aufzuteilen.

    Sofern man nicht schon mit einer sinnvollen Aufteilung im Kopf startet, schreibe ich erst in einem Modul so lange, bis das zu lang wird. Üblicherweise so bei 1000 Zeilen. Und dann verschiebe ich das erst in ein Package, und da drin teile ich das dann in Module auf.

    Ich würde wahrscheinlich auch den Handler nicht ändern, sondern einen universalen Handler schreiben, der eine Beschreibung von Bildschirmregionen + Handler für einen Druck dort, bekommt. Und diese Datenstruktur muss austauschbar sein, nicht der allgemeine Handler.

    Edit: Ich habe mir mal die verwendeten, importieren Klassen angeschaut: Default-Werte sind dazu da, das man die nicht angeben braucht, wenn man den Wert gar nicht verändern will.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

    Edited 2 times, last by __blackjack__: Argumente mit Default aus dem Programm genommen. (July 3, 2026 at 5:06 PM).

  • Hallo __blackjack__,

    zunächst einmal danke für deine Ausführiche Antwort.
    Mit einer so langen Antwort hatte ich nicht gerechnet.:)

    ich habe mir den "Style Guide" angesehen und werde den durcharbeiten und umsetzen. :thumbup:

    ich hatte, von meinem Gesamtcode, nur einen Teil herausgezogen.
    Ich dachte das reichte, um mein Problem zu beschreiben.
    Es ist jedoch ärgerlich, das da kleine Schreibfehler drin sind, die den Code verfälschen.
    Sorry dafür. :(

    Den Punkt mir main() kenne ich und im "richtigen" Quellcode setze ich dies um. :)
    ich habe versucht das Thema mit den Klassen anzugehen und umzusetzen.
    Deswegen ist das meiste in Klassen gesetzt.

    Ich glauche, da ist noch viel (sehr viel) Luft nach oben.:)

    Ich versuche einmal, mein Projekt genauer zu beschreiben.
    Was habe ich überhaupt vor.

    Ich habe mir eine kleinen "Gameboy" aus einem Pico2, einem TFT+Touch, zwei RGB-LED's und einem Buzzer gebastelt.
    ich möchte eventuell auch die vier Taster auf dem TFT nutzen.

    Zunächst soll auf dem TFT der Startbildschirm (main) mit vier Schaltflächen dargestellt werden.
    Über die vier Schaltflächen soll jeweils ein Spiel (Prog_1, z.B. Memory..) gestartet werden.
    Nach Beendigung eines Spiels, sollen wieder der Startbildschirm erscheinen.

    Ich wollte den Code für die einzelnen Bereiche (Startbildschirm, Hardarekonfiguration und die Spiele) in einzlene Module aufteilen, damit ich mich pro Modul nur um die eigentliche Aufgabe kümmern kann. Ich dachte es würde den Code übersichtlicher machen.

    Damit ich nur an einer Stelle die gesamte Hardeare konigurieren muss, habe ich dies in ein einzelnes Modul separieren. Das starten der Hardwarekonfiguration auf der Modulebene habe ich deswegen durchgeführt, damit die Hartware global zur Verfügung steht und ich nicht immer die gesmte Hardware übergeben muss.
    Ebenfalls wollte ich die Spiele in einzelne Module legen, um den Spiele-Code einzeln bearbeiten zu können.
    Ich jedem Modul (Startbildschirm und die Spiele), sollte der Interrupt des Touch zu eingestellt sein, das er eine eigene Funktion in dem jeweiligen Modul aufrufen.
    So war es zumiondest angedacht.

    Sind die Überlegungen falsch?

    Wie würdest du prizipiell so ein Projekt aufbauen?
    Bitte nicht falsch verstehen, ich möchte keine komletten Quellcode, den Quellcode möchte ich mir schon selber erarbeiten.

    Ich habe meine drei Module etwas aufgeräumt und hoch geladen. Die Hardwarekonfiguration habe ich in die main-Funktion verschoben.
    Ich habe in deinem Quellcode gesehen, das man eine Übergabe von Parameter mit dem Befehl "lamda" durchführen kann. Den kenn ich nich nicht. :)
    Die Nomenklatur habe ich noch nicht korrigiert.
    Ich habe, für mich, viel im Quellcode kommentiert und viele print() zum debuggen verwendet.
    Bitte nicht komplett zerreißen. :)

    main1.py
    icc_hw_conf_v2.py
    prog_1.py

    Diese Module funktionieren, bis auf die Sache, das der Touch die Funktion aus der Hardware-Klasse aufruft. Da weiß ich nicht wie ich das machen soll/kann.


    Gruß

    Stefan

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!