Seite 4 von 4

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 19:48
von __deets__
Bleibt die Datenrate so gering? Sind die Pulse immer so lang?

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 19:52
von Muntliger
Datenrate - wird nicht schneller als 1 Pulse/Sekunde werden.
Die Pulse sind nie kürzer wie 30ms.

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 19:56
von __deets__
Warum machst du das einlesen über I2C statt direkt die GPOIs des PIs?

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 19:58
von __deets__
Beziehungsweise dies Onion-Dings.

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 20:02
von Muntliger
Dies ist ein Onion Omega.

Der Gedanke war - wenn jemand was falsch anklemmt verabschieden sich "nur" die i2c Bauteile.

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 20:08
von Muntliger
Was ist denn mit Python Modul mit - functions from the C library gemeint?
https://docs.onion.io/omega2-docs/i2c-p ... odule.html

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 20:33
von __deets__
Da liegt halt eine C-Bibliothek drunter. Die könntest du auch direkt benutzen von C aus.

Zuerstmal ist dieser Verlust auch so schon schwer erklärbar. Wobei die CPU-Last wie ich finde zu hoch ist. Für das bisschen Code. Um das zu reduzieren würde ich das logging testweise abklemmen ( nur lange sleep) und schauen, wie hoch die last dann ist. Ziel ist, NUR die I2C Daten zu lesen, und einfach nichts mit denen zu machen. Also auch keine anderen Dinge wie blinkende LEDs oder sowas.

Wenn das nichts bringt, dann sollte zb der im I2C Prozess auf 10ms erhöht werden können. Bei 30ms brauchst du eh nur 15ms Abtastrate. Oder ist der präziser Anfang des Impulses wichtig?

Und dann ist da die Entscheidung, nicht GPIOs zu benutzen. Das ist nicht so clever, weil der Linux Kernel für GPIOs auch interrupts beherrscht. Sprich: die Hardware stellt sicher, das kein Impuls verloren geht. Da sollte man eigentlich bei den geringen Datenraten niemals verpassen.

Dann gibts halt noch das große Thema Echtzeit Kernel. Leider hat deine etwas esoterische Plattform da nicht auf Anhieb was zu bieten.

Und schlussendlich kannst du einen Arduinomoder anhnliches anhängen, der die Impulse 💯 zählt. Und den seriell abfragen.

Re: Prioritäten bei Threads

Verfasst: Donnerstag 24. Januar 2019, 20:35
von Sirius3
Muntliger hat geschrieben: Donnerstag 24. Januar 2019, 20:02 Der Gedanke war - wenn jemand was falsch anklemmt verabschieden sich "nur" die i2c Bauteile.
Was für eine Hardware benutzt Du genau und warum denkst Du, dass ein paar zwischengeschalteten ICs irgendeinen Überspannungsschutz bieten?

Re: Prioritäten bei Threads

Verfasst: Samstag 26. Januar 2019, 21:45
von Muntliger
Ich nutze einen PCF8574PN der die Eingänge an den i2c Bus bringt.

Re: Prioritäten bei Threads

Verfasst: Samstag 26. Januar 2019, 21:50
von Muntliger
Dieser Teil Code macht eine CPU Last von 8%

Code: Alles auswählen

from OmegaExpansion import onionI2C
from multiprocessing import Process, Queue
import time

read_i2c_queue = Queue()
i2c = onionI2C.OnionI2C()
i2c.write(0x20, [0xFF])
previous_pulse = [False] * 6

while True:
    i2cdata = i2c.readBytes(0x20, 0xFF, 1)
    timestamp = time.time()
    for channel in range(6):
        pulse = not i2cdata[0] & (2 ** channel)
        if pulse and not previous_pulse[channel]:
            read_i2c_queue.put((channel, timestamp))
        previous_pulse[channel] = pulse
    time.sleep(.01)

Re: Prioritäten bei Threads

Verfasst: Samstag 26. Januar 2019, 22:16
von Sirius3
Der PCF8574PN unterstützt auch Interrupts, was das ständige Lesen überflüssig macht.