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.
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.
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
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
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.
@ 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.
@ 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.
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
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.
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
Wie gesagt Durchflussmenge sind so um die 10l/min maximal .. also müsste
das ja mit nem PinChangeInterrupt wahrscheinlich auch gehen. Wird schon
klappen.
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 =)
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.
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 ;)
@ 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.
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.
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
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!
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
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.
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: