Zu viele Interrupts?!

  • Hallöchen ;) ,


    Kämpfe gerade mit einem Problem, sitze an einem etwas kleineren Projekt und zwar würde ich gerne mit dem Pi eine Stromzähler über S0 auslesen, anschluss ist bereits geschehen und der Pi empfängt auch die Impulse. Nun habe ich zum einen das Problem, dass ich einen recht Energiesparsamen Verbraucher meinen Laptop zum Test rangehängt habe (etwa 20 W) das bedeutet dass bei 100 Impulsen/KWh die Impulse doch recht rar kommen.


    Ich habe mir auch schon ein kleines Progrämmchen in C geschrieben


    Habe den Test nun schon unzählige male getestet, zu Anfangs habe ich ewig gewartet bis ein Interrupt erfasst wurde bzw. zwei, da ich gerne die Zeit zwischen den Interrupts messen wollte. Dann habe ich einfach mal mehrere Verbraucher angeschlossen, anscheinend von der Leistung immer noch nicht ausreichend, als ich dabei am Kabel zum Stromzähler hin gewackelt habe, hat das Programm gleich mehrere (viele) Interrupts gleichzeitig gezählt so dass er mit der Ausgabe gar nicht hinterher kam. Woran kann das liegen? Dachte schon es lag daran dass ich die Kabel umgesteckt habe (Spannungspitzen!) aber dies scheint es nicht zu sein, auch wenn ich am zähler selber wackel treten gleich mehrere Interrupts auf?


    Und meine zweite Frage ist, könnt ihr euch den Code oben mal anschauen, hat jemand ne Idee das ganze effektiver zu gestalten? Ich bin irgendwie noch nicht ganz zu frieden? Die Zeitmessung ist irgendwie ungenau. Achja und mein genaues Ziel ist mir den momentanen Verbrauch zu berechnen, dafür wollte ich die zeit zwischen zwei Impulsen messen und dadurch diesen dann umrechnen.


    Ein wenig Hilfe wäre echt spitze :s :bravo2: :danke_ATDE:

  • also mein Aufbau ist doch recht simpel, da der GPIO ja gleich nen Pullup Widerstand integriert habe, hab trotzdem mal den Schaltungsentwurf mit dran gehängt



  • Bevor ich mal den Code durchschaue ... da fehlt imho ein Widerstand zur Strombegrenzung zwischen GPIO und S0(+) ...
    Das wäre ja sonst ein Kurzschluss (3V3 auf GND) ;)
    Ansonsten würde ich GPIO4 statt GPIO3 nehmen (GPIO3 ist das clock-Signal des IIC Bus) und den Pullup extern anbringen (der 1k8 Pullup des IIC ist als pullup für einen Eingang imho ungeeignet weil zu klein zudem wird ein interner gerne mal vergessen).


    cu,
    -ds-

  • Ok, habe meinen Aufbau gerade nochmal korrigiert, habe wie vorgeschlagen GPIO4 genommen und nen 4k7 Pullup Widerstand zwischen GND und 3,3V gehängt.




    [hr]
    Hab jetzt auch noch meinen Code mal getestet, momentan zählt er keine interrupts, kann aber auch ne zeit dauern bis mal wieder ein Impuls kommt, aber wenn ich an den kabeln wackel bleibt die ganze sache stabil, also er zählt nicht unendlich viele Interrupts.

    Edited once, last by PI94 ().

  • hmm... die ganze sache läuft jetzt schon recht stabil, werds mal mit den 10k ausprobieren.
    Beruhen die 10k auf irgendeiner Rechnung oder reines ausprobieren und testen?


    Wie siehts generell mit dem Code aus, gibt es da Verbesserungsvorschläge?


  • ...
    Beruhen die 10k auf irgendeiner Rechnung ...
    ...


    Nö ... Erfahrungswert - hat sich bei mir irgendwann irgendwie manifestiert :) ...


    Naja ... streng genommen geht's um minimierte Ströme. Und bei U=R*I sind das 0,3 mA bei 10k, ca. 0,7 mA bei 4k7 und sogar fast 2 mA bei den 1k8 des IIC-Bus (das ist fast das Maximum, mit dem ein GPIO Pin belastet werden darf - also fast ein Kurzuschluss).



    ...
    Wie siehts generell mit dem Code aus, gibt es da Verbesserungsvorschläge?
    ..-


    Geduld :) ...
    //EDIT:
    Also so weit sieht der Code doch gut aus.
    Ich würde allerdings keine Umlaute verwenden ... das führt in der Regel irgendwann oder irgendwo zu irgendwelchen Seiteneffekten, die dann nur sehr schwer zu finden sind :)


    cu,
    -ds-

  • So wie in der ersten Abbildung läuft es bei mir auch.
    Bei der zweiten Hast du einen Spanungsteiler mit 4,7k zum Internen Pull up (1,8k 3,3V =1,833mA) somit ist das High-Signal kleiner als 3,3V(=2,91V) Normalerweise zieht der Fototransistor des Optokopplers des S-0 Ausgangs die Spannung über den Pull Up für ca. 90ms auf Low.
    Die Beseitigung von Störsignalen würde mich auch interessieren. Ein Kondensator mit 100n (Aus einer Anderen Anleitung als optional) hab ich auch schon zwischen S0+ u. S0- gehabt ohne Erfolg.
    1,8mA ist weit weg von einem Kurzschluss und Wiederstände zu GND würde ich als Pull down Bezeichnen.

  • Einen Pull Down Widerstand zu GND werde ich mal testen vielleicht ist der Eingangswiderstand des GPIO einfach zu hochohmig und das halbe mA Ruhestromfluss Stabilisiert die Störungen der Leitung. Hatte mal Ausschläge vom S0 Zähler von 50KW wo eigentlich maximal 240Watt Dran waren.
    Danke dreamshader

  • ok Umlaute wurden entfernt, ich hab momentan nur immer noch das Problem, dass der Pi ein paar Interrupts verschluckt, d.h. der Zähler springt z.B. direkt von 2 auf 4, obwohl der Pi masse zeit haben müsste die zu erfassen. Zwischen den Interrupts liegen meist so 200s.


    Woran liegt das?


    hab jetzt auch den 10k Widerstand genommen, läuft Prima :thumbs1: Danke