Prioritäten bei Threads

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bleibt die Datenrate so gering? Sind die Pulse immer so lang?
Benutzeravatar
Muntliger
User
Beiträge: 40
Registriert: Montag 19. November 2018, 09:09

Datenrate - wird nicht schneller als 1 Pulse/Sekunde werden.
Die Pulse sind nie kürzer wie 30ms.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum machst du das einlesen über I2C statt direkt die GPOIs des PIs?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Beziehungsweise dies Onion-Dings.
Benutzeravatar
Muntliger
User
Beiträge: 40
Registriert: Montag 19. November 2018, 09:09

Dies ist ein Onion Omega.

Der Gedanke war - wenn jemand was falsch anklemmt verabschieden sich "nur" die i2c Bauteile.
Benutzeravatar
Muntliger
User
Beiträge: 40
Registriert: Montag 19. November 2018, 09:09

Was ist denn mit Python Modul mit - functions from the C library gemeint?
https://docs.onion.io/omega2-docs/i2c-p ... odule.html
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Benutzeravatar
Muntliger
User
Beiträge: 40
Registriert: Montag 19. November 2018, 09:09

Ich nutze einen PCF8574PN der die Eingänge an den i2c Bus bringt.
Benutzeravatar
Muntliger
User
Beiträge: 40
Registriert: Montag 19. November 2018, 09:09

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)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Der PCF8574PN unterstützt auch Interrupts, was das ständige Lesen überflüssig macht.
Antworten