Impulse zählen, PulseIn schnell genug?

Gast #3395127
Lesenswert?

Moinsen,

hab hier ein Durchflusssensor der mir 12000 Impulse / Liter gibt (Bei 
jedem Impuls wechselt eine LED ihren Zustand (Toggeling) (High Low High 
Low High Low.. ihr wisst schon)

Natürlich will ich die Durchflussmenge kontinuirlich berechnen und 
ausgeben, ist da PulseIn das richtige Command für, und schnell genug?

Es gibt ja auch noch den pinchange interrupt, allerdings will ich in 
meinem Programm keinen Interrupt haben, da ich nebenbei auch noch andere 
Messwerte auswerten will. Aber wenn ich richtig verstanden hab was ein 
interrupt macht, dann würde dieser ja mein Programm unterbrechen und ich 
würde andere Messwerte verpassen.

Paule.
#3395143
Lesenswert?

Paul schrieb:
> Aber wenn ich richtig verstanden hab was ein
> interrupt macht, dann würde dieser ja mein Programm unterbrechen und ich
> würde andere Messwerte verpassen.

Ja das große Problem. Interrupts sind einfach nicht zu gebrauchen wenn 
man mehere Dinge tun will. Die wurden nur erfunden um das Programm 
(welches eh nichts anderes nebenher tut als zu warten) zu unterbrechen 
wenn was passiert.

Mehrere Dinge schreibt man am besten einfach alle untereinander in eine 
große main(), dann wird auch nix unterbrochen und man bekommt alles mit. 
Leider sind die meisten Leute nicht so schlau, und verwenden dafür glatt 
Interrupts. Zum Glück hast du das Problem richtig erkannt.

gruß cyblord
#3395187
Lesenswert?

Schau mal dieses Thema,

Beitrag "ca. 40 - 60 kHz mit "Pin Change Interrupt" (ATtiny48) zählen?!"

Hier wird 40-60 kHz gezählt. Die meisten Antworten sagen, dass es bei 8 
MHz knapp wird, aber doch möglich sein könnte.
Deine Frequenz ist mit 12000 Imps/liter geringer.
Wie groß ist der Durchfluss? 0,01 - 10 Liter pro Minute?, dann kast Du 
zwischen 120-120000 Impulse pro Minute, also 2 - 2 kHz. Damit bist Du 
weit von 50 kHz entfernt und damit hast Du genügeng Zeit um per ISR zur 
zählen. Poste mal den Code, dieser sollte "schnell" sein in der ISR.
Hast Du Dir die Signal mal mit einem Oszi angeschaut?

Viele Grüße

MBr
Gast #3395188
Lesenswert?

Paul schrieb:
> Brauch halt eigentlich nicht die Dauer des Zustandes sondern mir würde
> reichen, wenn ich sagen wir mal alle 10ms weiß, wieviele Impulse ich
> bekommen hab.

Mann, das sollte ein Witz werden. Du musst schon ein paar Eckdaten 
nennen. Platform, Taktfrequenz etc...

cyblord ---- schrieb:
> Interrupts sind einfach nicht zu gebrauchen wenn
> man mehere Dinge tun will.

Aua, manchmal tun die Post richtig Weh und ich schäme mich für die 
menschliche Rasse. Ja klar, interrupts sind voll überflüssig. Die hat 
man sich ausgedacht, damit die Doofen Fehler machen.

cyblord ---- schrieb:
> Mehrere Dinge schreibt man am besten einfach alle untereinander in eine
> große main(), dann wird auch nix unterbrochen und man bekommt alles mit.
> Leider sind die meisten Leute nicht so schlau, und verwenden dafür glatt
> Interrupts. Zum Glück hast du das Problem richtig erkannt.

Mupitz! Wer so blöd ist und hundert Zeilen Code in den Interrupt packt 
der ist selber schuld. Stichwort: Ringbuffer, DMA, vielleicht solltest 
Du Dich mal damit auseinander setzen.
#3395206
Lesenswert?

@ cyblord ---- (cyblord)

>> Aber wenn ich richtig verstanden hab was ein
>> interrupt macht, dann würde dieser ja mein Programm unterbrechen und ich
>> würde andere Messwerte verpassen.

>Ja das große Problem. Interrupts sind einfach nicht zu gebrauchen wenn
>man mehere Dinge tun will.

Selten so einen Käse gehört. Naja, wir wissen ja von wem es kommt.
#3395211
Lesenswert?

@ Paul (Gast)

>hab hier ein Durchflusssensor der mir 12000 Impulse / Liter gibt (Bei
>jedem Impuls wechselt eine LED ihren Zustand (Toggeling) (High Low High
>Low High Low.. ihr wisst schon)

Und wie hoch ist die maximale Durchflußmenge und damit die maximale 
Pulsfrequenz?

>Natürlich will ich die Durchflussmenge kontinuirlich berechnen und
>ausgeben, ist da PulseIn das richtige Command für, und schnell genug?

Klingt nach Arduino, richtig?

>Es gibt ja auch noch den pinchange interrupt, allerdings will ich in
>meinem Programm keinen Interrupt haben, da ich nebenbei auch noch andere
>Messwerte auswerten will.

Nö, weil du das Thema Interrupt noch nie richtig verstanden hast und 
Angst davor hast.

> Aber wenn ich richtig verstanden hab was ein
>interrupt macht, dann würde dieser ja mein Programm unterbrechen und ich
>würde andere Messwerte verpassen.

Nicht, wenn man es richtig macht.
#3395215
Lesenswert?

Hahahaha, ich glaub ein weiteres Problem ist, das manche Leute Ironie in 
hohen Dosen nicht erkennen.

Zumindest kann ich mir net vorstellen, das Cyblord seinen Beitrag ernst 
gemeint hat.... aber evtl liegt das natürlich nur daran, das ich ihn 
nicht wirklich kenne ~mit den Schultern zuck.....

MfG Chaos
Gast #3395236
Lesenswert?

Is nen Arduino Mega 2560 den ich da hab. Code kann ich leider nicht 
posten, bin gerade nicht zuhause. Ich denke das werden maximal 10 l / 
min also müsste das schon klappen. In dem Interrupt müsste ja auch 
eigentlich nur ne Variable geändert werden, mit der ich dann draußen 
rechnen kann, aber wenn das Programm ständig Interrupted wird weiß ich 
ja nicht inwiefern das Einfluss auf den Rest hat?

Die Lösung hier sieht doch eigentlich ganz gut aus, oder? :

http://forum.arduino.cc/index.php?topic=165716.0
#3395245
Lesenswert?

Paul schrieb:
> Ich denke das werden maximal 10 l /
> min also müsste das schon klappen.

^^ sacht er doch....

bei 12K-Impulsen/l macht das also 120K-Impulse/min ---> 120K/60 = 2K

Du hast also um die 2KHz und das ist geradezu lächerlich langsam für son 
klein Mikroprofessor =)

Und überleg dir, dich evtl doch mal Interrupts zu befassen. Sooooo doof 
sind die nun auch wieder nicht =)
Gast #3395346
Lesenswert?

Kompetenteste Antwort des Tages Markus, danke. Gibs auch irgendwo nen 
Forum wo man nicht gleich für Unwissenheit oder zu wenig Ahnung 
ausgelacht wird?

Irgendwo muss man ja auch die Anfängerfragen stellen dürfen ;)
#3395353
Lesenswert?

@ Paul (Gast)

>Kompetenteste Antwort des Tages Markus, danke. Gibs auch irgendwo nen
>Forum wo man nicht gleich für Unwissenheit oder zu wenig Ahnung
>ausgelacht wird?

Den OP hat keiner ausgelacht, einen anderen Poster schon. Ob das nun 
wirklich Ironie war oder nicht, wer weiß. Zweckdienlich war die Antwort 
nicht wirklich.

>Irgendwo muss man ja auch die Anfängerfragen stellen dürfen ;)

Auch hier.
#3395402
Lesenswert?

cyblord ---- schrieb:
> j. t. schrieb:
>> Hahahaha, ich glaub ein weiteres Problem ist, das manche Leute Ironie in
>> hohen Dosen nicht erkennen.
>
> Ist weit verbreitet.

So ist das bei den Pappnasen. Ohne "Däädää Däädää Däädää" schnallen die 
das einfach nicht.

> @Klaus:
> Bin leider kein Jeck, darum bedeutet mir der 11.11 leider nichts.

Nicht leider sondern Gott sei Dank.

mfg.

PS: 
http://www.ndr.de/ndr2/programm/sendungen/der_ndr2_morgen/gruenkohl305.html
#3395690
Lesenswert?

Thomas Eckmann schrieb:
> Wenn man es umständlich machen möchte, geht es natürlich auch damit.
> Aber zum Zählen nimmt man eigentlich T1 usw.

Markus Weber schrieb:
> Stimmt, T1 ist hier sinnvoller. Danke für den Einwurf!

Sehr schön, was für "neue" Ideen man als Arduino-Programmierer in diesem 
Forum erhält.

Allerdings dürfte es typische Arduino-Programmierer ohne detaillierte 
Hardwarekenntnisse leicht bis mittelschwer überfordern, das hier 
mitgeteilte in lauffähigen Code umzusetzen. Erst recht blutige Anfänger, 
die nach der für sämtliche Zwecke völlig unbrauchbaren Arduino-Funktion 
"pulseIn()" fragen, über die man eigentlich nur wissen muss, dass man so 
eine Drecksfunktion niemals ernsthaft in seinen Programmen verwenden 
sollte.

Für Paul hier also ein kleiner Arduino-Sketch zum Testen, für die 
Zählung von Impulsen an Pin D5 mit einem Arduino UNO Board:
1
/*
2
 * Arduino UNO Impulse Counter on digital pin D5
3
 *
4
 * Compatible with: Atmega328 and Atmega168
5
 * Uses pin D5 and timer 1 on Arduino UNO
6
 * So do not use with any library that uses timer 1 for itself!
7
 * Do not use on other boards except UNO without proper modifications!
8
 */
9

10
void setup()
11
{
12
  Serial.begin(9600);
13
  startCounting();
14
}  
15

16
void startCounting()
17
{ // sets hardware timer 1 as a hardware impulse counter
18
  noInterrupts();
19
  TCCR1A=0;        // reset timer/counter control register A
20
  bitSet(TCCR1B ,CS12);  // Counter Clock source is external pin
21
  bitSet(TCCR1B ,CS11);  // Clock on rising edge  
22
  TCNT1 = 0;  // reset the hardware counter
23
  interrupts();
24
}
25

26
void loop()
27
{
28
  static unsigned long lastSampleMillis;
29
  if (millis()-lastSampleMillis>=1000)
30
  {
31
   lastSampleMillis=millis();
32
   noInterrupts(); 
33
   int count = TCNT1;  // read hardware counter
34
   TCNT1 = 0;          // reset the hardware counter
35
   interrupts();
36
   Serial.println(count);
37
  }
38
}

Vielleicht hilft's ja.
Gast #3396100
Lesenswert?

Falk Brunner schrieb:
> @ cyblord ---- (cyblord)
>
>>> Aber wenn ich richtig verstanden hab was ein
>>> interrupt macht, dann würde dieser ja mein Programm unterbrechen und ich
>>> würde andere Messwerte verpassen.
>
>>Ja das große Problem. Interrupts sind einfach nicht zu gebrauchen wenn
>>man mehere Dinge tun will.
>
> Selten so einen Käse gehört. Naja, wir wissen ja von wem es kommt.

zum Verständnis von Ironie bedarf es einer gewissen Höhe von 
Intelligenz.
Gast #3396109
Lesenswert?

Paul schrieb:
> Natürlich will ich die Durchflussmenge kontinuirlich berechnen und
> ausgeben, ist da PulseIn das richtige Command für, und schnell genug?

Wenn du aus deinen Pulsen den Volumenstrom, also Volumen pro Zeit 
ableiten möchtest, wäre ein zweiter Timer sehr praktisch, der per 
Timerinterrupt einen festen Zeittakt zum Ablesen des Pulszähltimers 
erzeugt. In der ISR wird dann der Zählerstand des Volumenzählers 
abgelesen. Das Hauptprogramm kann dann in aller Ruhe die Differenz zur 
vorherigen Ablesung bestimmen und den in physikalieschen Einheiten 
skalierten Volumenstrom berechnen.

@Franz
Dieser Beitrag enthält KEINE Ironie

Franz schrieb:
Beitrag #6944509 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren