INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
18.03.2019, 13:29 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2019 13:30 von pzYsTorM.)
Beitrag #9
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
(18.03.2019 13:18)Hilgi schrieb:  Ich würde mal versuchen das const -> static ( falsch gedacht) zu entfernen, das braucht man wirklich nicht an der Stelle, da es global deklariert wurde, wird es übrigens nicht den wert behalten bei jedem durchlauf.

Ok, ich spiele nachher auch nochmal ein bisschen damit rum und gucke, ob sich etwas verändert.

(18.03.2019 13:18)Hilgi schrieb:  Tommy hat schon angedeutet, man braucht für den Aufbau so wie er grad ist, nicht unbedingt einen interrupt. Evtl versuche mal eine Erfassung ohne Interrupt, vlt. ist da ja was faul.

Jein, wie ich oben schon geschrieben habe:
Ich brauche den Interrupt, um zeitnah auf den Impuls vom Wasserzähler reagieren zu können. Da reicht mir keine Schleife, die alle 100ms den Zähler abfragt. Ich habe da oben auch die bash-while-Schleife gepostet, die den seriellen Output vom Arduino abfängt und nach graphite(influx) weiterschickt.
Oder hast Du eine andere Idee? Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2019, 13:56 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2019 13:59 von MicroBahner.)
Beitrag #10
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
(18.03.2019 13:19)Tommy56 schrieb:  
(18.03.2019 12:40)pzYsTorM schrieb:  Das Delay von 16ms hab ich eingefügt, um den Interrupt zu "entprellen". Sonst wird er tatsächlich manchmal pro Impuls zweimal getriggert.
Sorry, ich habe das Microseconds überlesen und war auf 16 Sekunden aus.

Gruß Tommy
Auch 16ms sind in einem Interrupt viel zu viel. Interruptlaufzeiten werden eher in µs gerechnet.
Wozu soll das ständige detach und attach in der ISR sein? Während die ISR läuft wird eh kein anderer IRQ ausgelöst. Aus diesem Grund sind auch Serial Befehle in einer ISR eher fehl am Platz ( die brauchen auch selbst einen IRQ ). Wenn's nur kurze Ausgaben sind mag's noch gehen, aber es ist kritisch und kann zur Blockade führen. Auch die Arduino Grundsoftware erzeugt ca. jede ms einen IRQ, der so ausgebremst wird.

Wenn die Abfrage in einem vernünftig programmierten loop gemacht wird, ist die Reaktionszeit auch im sehr kleinen ms Bereich, und nicht bei 100ms. Die Übertragung dauert bei 9600Baud deutlich länger.

Wie oft kommen denn die Impulse? Und welche Reaktionszeit wird denn tatsächlich gebraucht?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2019, 14:29 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2019 15:03 von Hilgi.)
Beitrag #11
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
Zitat:Wenn die Abfrage in einem vernünftig programmierten loop gemacht wird, ist die Reaktionszeit auch im sehr kleinen ms Bereich, und nicht bei 100ms. Die Übertragung dauert bei 9600Baud deutlich länger.


Sehe ich auch so, wie kommst du auf 100ms @pzYsTorM ?


Gruß

Also bei 16mhz komme ich auf 0.0625µs/Periode, das sollte weit weg von 100ms sein, insofern du dich von millis()/micros()/etc. verabschiedest und eine,... effiziente Programmierung an sich hast.

Vlt verstehe ich aber auch das Problem nicht....


Gruß

Ist jetzt nicht schön, aber mal um zu zeigen wie es (auch) ginge und ob/wenn/falls es da Unterschiede gibt,...


Code:
//DEFINE
#define GPIO_WASSER 3
volatile uint8_t wasserCounter = 0;
bool read = false;


void setup()
{
  Serial.begin( 500000 );
  
  pinMode( GPIO_WASSER, INPUT_PULLUP );
}


void loop()
{
  if ( !digitalRead( GPIO_WASSER ) && !read )
  {
    read = true;
    
    Serial.println( ++wasserCounter );
  }

  if ( digitalRead( GPIO_WASSER ) && read )
  {
    read = false;
  }
}


Die Billigvariante zum "Entprellen"....

Jedenfalls braucht man keine Interrupts in -diesem- Beispiel, mal sehen was dein Code später erfordert.

Da die BAUD auf 500000 steht, also ich habe hier trotz !interrupt ein mehr als ausreichende Reaktionszeit...


Gruß

Nicht denken,...
...nachdenken... Rolleyes

Smarter - LiveData - KLAMM.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2019, 16:22
Beitrag #12
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
(18.03.2019 14:29)Hilgi schrieb:  insofern du dich von millis()/micros()/etc. verabschiedest und eine,... effiziente Programmierung an sich hast.
Ich nehme mal an, Du meinst er soll sich von delay() und delayMicroseconds() verabschieden, und stattdessen zeitabhängige Dinge mit millis() und micros() lösenWink.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2019, 16:57
Beitrag #13
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
(18.03.2019 16:22)MicroBahner schrieb:  
(18.03.2019 14:29)Hilgi schrieb:  insofern du dich von millis()/micros()/etc. verabschiedest und eine,... effiziente Programmierung an sich hast.
Ich nehme mal an, Du meinst er soll sich von delay() und delayMicroseconds() verabschieden, und stattdessen zeitabhängige Dinge mit millis() und micros() lösenWink.



Siehste mal, wie du mich verwirrst Big Grin

Ja natürlich sorum wie du sagst Tongue



Gruß

Nicht denken,...
...nachdenken... Rolleyes

Smarter - LiveData - KLAMM.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2019, 13:28 (Dieser Beitrag wurde zuletzt bearbeitet: 19.03.2019 13:39 von pzYsTorM.)
Beitrag #14
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
Ich habe tatsächlich keine zeitabhängigen Dinge. Das delay habe ich nur zum Entprellen genutzt. Ja, eigentlich sollte der Interrupt nicht zweimal gleichzeitig ausgeführt werden. Ohne Delay war das Prellen des Wasserzähler-Impulses trotzdem so hoch, dass der Interrupt mehrmals (2...3...4x) (wohl hintereinander) getriggert wurde.

Vielen Dank für den Code! Der funktioniert wirklich gut. Ich habe den Interrupt nun rausgeworfen und benutze deinen Code.

Bezüglich der anderen Probleme:

Ich hab nun auf 500k Baudrate umgestellt - passend zu deinem Code.
Mein Linux-Terminal war trotzdem Schuld, dass der Arduino immer wieder resetted wurde. Ich habe nun am Ende das -hupcl angehängt. Damit läuft es problemlos (ohne Reset!):
Code:
stty -F /dev/ttyUSB0 cs8 500000 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl

Achso, und noch zu Euren Fragen:
Die Anzahl der Impulse ist nicht so häufig. Der Sensor gibt mir pro vollem Liter genau einen Impuls. Wenn ich ordentlich Wasser durchlaufen lasse, komme ich vielleicht auf 50 Liter/min, das wäre dann also rund ein Impuls pro Sekunde. Es geht mir bei der ganzen Geschichte aber auch primär darum, dass ich den Verbrauch ausrechnen lasse. Ich tracke in einer float Variablen die millis() von Impuls zu Impuls und rechne den Verbrauch in Liter/min um: 60000 / (timestamp_of_earlier_impulse_in_millis - current_timestamp_of_this_impulse_in_millis)
Daher möchte ich die Latenz so gering wie möglich halten, damit der Verbrauch möglichst korrekt ausgerechnet wird - mehr nicht Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2019, 20:33
Beitrag #15
RE: Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop()
Richtig toll wären ja ein paar Bilder, ich finde das geht hier immer zu stark unter Big Grin

Gut das es funktioniert, ich hoffe das du dich trotzdem über diese Behelfslösung hinaus mit dem Thema beschäftigst.

Jaja dieses Linux, hör mir auf... Tongue



Viel Erfolg soweit Wink


Gruß

Nicht denken,...
...nachdenken... Rolleyes

Smarter - LiveData - KLAMM.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Sad Sonderbares Verhalten von Relais Arduino Nano Sarkermann 7 349 20.09.2019 12:26
Letzter Beitrag: Bitklopfer
  Kennt jemand einen Stepper Closed Loop Sketch? Holzwurm56 16 1.568 17.06.2019 22:37
Letzter Beitrag: georg01
  For-Loop verschluckt Ausgabe am seriellen Monitor TimeMen 5 589 14.04.2019 17:59
Letzter Beitrag: Tommy56
  Lokale Variable an loop zurück - Fehler Haukini 3 647 26.02.2019 22:33
Letzter Beitrag: Haukini
  char in Variablen aufteilen fv1895 7 733 06.01.2019 11:59
Letzter Beitrag: Tommy56
  Variablen zu einem CHAR verbinden und einbinden Frank_aus_WOB 3 973 02.01.2019 09:07
Letzter Beitrag: Tommy56
  Verkettung von Variablen flint74 5 762 30.12.2018 14:33
Letzter Beitrag: Tommy56
  Variablen über Eingabe im Setup beschreiben heini320 3 680 30.12.2018 11:37
Letzter Beitrag: Tommy56
  Loop wird doppelt ausgeführt nanoheld 6 1.032 26.11.2018 21:06
Letzter Beitrag: hotsystems
  Zentrale Variablen für verschiedene Klassen Smirgel 3 635 29.10.2018 21:24
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste