Raspi Zero / Python / Timer

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo


    Dank meiner vorherigen Projekte habe ich mich größtenteils mit µPython beschäftigt, und habe eine Funktion den Timer lieben gelernt. Gibt es auch für das normale Python auf einem Zero auf welchem das Raspbian System Buster 32 bit läuft eine solche Funktion mit der man periodische Abläufe zumindest im Bereich 1/10 Selunden genau starten kann ?

    Danke im Voraus


    Günter

  • Man könnte threading.Timer erweitern:


    Vom Timing her ist es aber nicht so genau, wie bei den Mikrocontrollern.

  • Guenter.H. Da laufen ja normale Betriebssysteme drauf und da ist ein übliches Mittel für Nebenläufigkeit Threads zu verwenden. Was die zeitliche Genauigkeit angeht: Da laufen ja normale Betriebssysteme drauf, also deutlich mehr als nur Dein Programm alleine, und der Kernel entscheidet wann welcher Prozess welchen Prozessor(kern) benutzen darf. Einerseits klingt so ungefähr alle 1/10 Sekunde machbar, andererseits so wirklich *garantiert* wird das natürlich nicht.


    Falls man eine GUI programmiert, kommt dann noch dazu, dass GUI-Rahmenwerke in der Regel zum Grossteil nicht thread-sicher sind, man also die GUI selbst nur aus dem Thread in dem die GUI-Hauptschleife läuft verändern darf. Deshalb haben GUI-Rahmenwerke Wege um zeitverzögerte Ausführung von Funktionen über deren Hauptschleife anzufordern. Auch wieder mit Einschränkungen was die Genauigkeit des Zeitpunkts angeht.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • Danke für die schnellen Antworten.
    Ob das unter die Kategorie GUI fällt vermag ich jetzt nicht einzuschätzen.


    Ich möchte auf einer dopplten Anzeige 2 x [4 x Siebensegment Anzeige] mit TM1637 einen Counter unabhängig des weiteren Programmablaufs aktualisieren lassen.

    Günter

  • Guenter.H. Nein, das fällt da nicht drunter. Ich erwähnte das bloss, weil man öfter mal den Fall hat das jemand Nebenläufigkeit mit Threads macht und das dann mit einem GUI-Rahmenwerk (Tk, Gtk, Qt, wxWidgets, …) kombinieren will, wo es oft sinnvoller ist erst einmal zu schauen welche Mittel das verwendete Rahmenwerk zur Verfügung stellt.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • @DeaD_EyE


    Wenn ich deinen Code richtig verstanden habe übergibst du mit "MyTimer(MyTimer.PERIODIC, 0.1, cb, ("Hello",))" schon den Inhalt der Ausgabe. Wenn diese sich aber nun während der Laufzeit periodisch vom Programmablauf ändert ?

    Wie kann ich dann in der Funktion "cb" einen oder den aktuellen Inhalt einer Variable einschleusen ?


    Günter

  • Guenter.H. Über das Argument. Man muss da ja keinen unveränderlichen Wert übergeben, sondern kann auch eine `queue.Queue` in die ein anderer Thread Werte steckt, oder ein beliebiges Objekt von dem man Werte abfragen kann. Da muss man dann darauf achten, dass das ganze thread-sicher passiert. Die `queue.Queue` sichert den Zugriff bereits ab, bei eigenen Objekten muss man da gegebenenfalls selbst für sorgen, dass da keine Probleme entstehen können weil mehrere Abläufe gleichzeitig darauf zugreifen können.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • So?


  • Hallo @DeaD_EyE


    ich habe eine Meßroutine, welche über einen MCP3202 zeitlich begrenzt jedoch permanet eine Spannung überwacht. Jedesmal wenn ein gewisser Grenzwert überschritten wird, wird ein Counter um 1 erhöht. Wenn dieser Counter den Nennwert von 1800 überschreitet, erfolgte eine Unterbrechung des Meßvorgangs. Eine gewisse Folge an GPIO Schaltvorgängen wird ausgeführt bis am ADC Eingang wieder eine Minimalspannung erfasst, der Counter auf Null gesetzt - dann geht das ganze Spiel von vorne los.
    Nun möchte ich noch das dieser Counter auf den letzten 4 Stellen dieser doppelten 4-fach Siebensegmentanzeige regelmäßig aktualisiert wird.

  • @__blackjack__


    Nein das funktioniert leider nicht. Wenn ich jedesmal mit der Werterhöhung des Counters auch eine Displayaktualisierung durchführe gehen mir Werte verloren. Teilweise erhöht sich der Counter selber mehrere Male pro Sekunde. Ich muss selber auch nicht den wirklich so "aktuellen" Wert haben, es ist eher nur eine Anzeige oder Orientierunsghilfe.
    Ich habe das auch schon versucht mittels Ausgabe print(counter) nur dazu ist selbst das ZERO zu langsam bei angeschlossen HDMI Monitor. Die Darstellung erfolgt dabei stark zeitverzögert, und es kommt zu Überschreitungen. Was bedeutet der Counter erfasst nicht mehr alle Überschreitungen.
    Rein vom eigentlcihen Programmablauf ist alles bestens, nur möchte ich für mich eine kleine Orientierungshilfe / -anzeige haben, damit ich ungefähr abschätzen kann wie lange dieser einzelne Vorgang noch dauern könnte.
    Oder welche Art Display / Anzeige wäre hierfür ggf. besser geeignet ? Ich hatte nun gerade noch diese Dual 4-fach Anzeige herumliegen und auch gleich angeschlossen. Deswegen hatte ich schon eingangs geschrieben ungefähr 1/10 Sekunde sollte ausreichend sein.