Forum: Mikrocontroller und Digitale Elektronik Impulse zählen, PulseIn schnell genug?


von Paul (Gast)


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.

von Franz (Gast)


Lesenswert?

Paul schrieb:
> ist da PulseIn das richtige Command für, und schnell genug?

Ich denke schon.

von Paul (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


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

von Mathias B. (mbr)


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

von Franz (Gast)


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.

von Falk B. (falk)


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.

von Falk B. (falk)


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.

von J. T. (chaoskind)


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

von Klaus (Gast)


Lesenswert?

@cyblord ---- (cyblord)
Erst nächst Woche beginnt der Fasching.
Nur deswegen warten wir noch bis wir richtig loslachen über deinen Text.

von Cyblord -. (cyblord)


Lesenswert?

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

Ist weit verbreitet.

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

: Bearbeitet durch User
von Paul (Gast)


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

von Aeh (Gast)


Lesenswert?

Paul hat uns leider nicht gesagt um welche Durchflussmenge es geht. 
2..5..100 m^3 pro sekunde oder was.

von Paul (Gast)


Lesenswert?

Wie gesagt Durchflussmenge sind so um die 10l/min maximal .. also müsste 
das ja mit nem PinChangeInterrupt wahrscheinlich auch gehen. Wird schon 
klappen.

von J. T. (chaoskind)


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 =)

: Bearbeitet durch User
von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Warum nimmst du eigentlich nicht einen der vier eingebauten 
16-Bit-Zähler des ATmega2560?

Der zählt die Impulse an Pin ICP1 (oder ICP3/4/5) ganz alleine.

von Paul (Gast)


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 ;)

von Falk B. (falk)


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.

von Thomas E. (thomase)


Lesenswert?

Markus Weber schrieb:
> Warum nimmst du eigentlich nicht einen der vier eingebauten
> 16-Bit-Zähler des ATmega2560?
>
> Der zählt die Impulse an Pin ICP1 (oder ICP3/4/5) ganz alleine.

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

mfg.

von Thomas E. (thomase)


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

: Bearbeitet durch User
von Markus W. (Firma: guloshop.de) (m-w)


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.

Stimmt, T1 ist hier sinnvoller. Danke für den Einwurf!

von Jürgen S. (jurs)


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.

von HAL2000 (Gast)


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.

von Wolfgang (Gast)


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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.