Forum: Mikrocontroller und Digitale Elektronik Zählen von Impulsen ohne T0


von Steven T. (kampfwaffel)


Lesenswert?

'nabend Allerseits,
nach langer Zeit versuche ich mich nun bei den AVRs statt mit asm erst 
einmal mit BASCOM, was auch vergleichsweise zu sehr vielen Erfolgen 
führt.
Mein erstes sinnvolles Projekt soll eine Verbrauchsanzeige für mein 
Motorrad sein.
Die Grundidee ist auch schon fertig und ein erstes kleines Testprogramm 
mit simulierten Daten lief erfolgreich.

Im Grunde möchte ich zwei Sensordaten auswerten, beides in Form von 
einem Rechtecksignal. Zum einen von einem Durchflussmesser, der den 
Fluss von Tank zum Vergaser misst und zum anderen einen Sensor, der die 
Drehfrequenz des Hinterrades erfasst.
Nun lese ich aber nur von der Möglichkeit Impulse mit dem Timer0 und dem 
Pin T0 zu zählen, für eine erfolgreiche Messung bräuchte ich allerdings 
zwei Zähler.
Dabei stoße ich etwas an meine derzeitigen Grenzen und ich finde 
eigenständig keine Lösung.
Ich hatte schon an eine Lösung mit einem zweiten AVR gedacht, welcher 
dann die Sensordaten via TWI zur verfügung stellt, aber das ist für mich 
keine saubere Lösung...

Gibt es keine Möglichkeit Impulse mit einem x-beliebigen Eingang zu 
zählen?

Beste Grüße

von Mike (Gast)


Lesenswert?

Steven T. schrieb:
> Gibt es keine Möglichkeit Impulse mit einem x-beliebigen Eingang zu
> zählen?

Das kommt drauf an, mit welcher Frequenz die Pulse kommen. Für die 
meisten AVRs dürfte das bei "handlichen" Frequenzen kein Problem sein. 
Keine Ahnung, ob das auch in Bascom geht.

von Amateur (Gast)


Lesenswert?

Mit welchem Anschluss Du die Impulse misst ist völlig egal. Ohne 
Zeitbezug aber gilt hier: Wer misst misst Mist.

Bis zu einer gewissen Geschwindigkeit/Wiederholrate kannst Du in einer 
Endlosschleife jeden Eingang zyklisch abfragen, um festzustellen was 
Sache ist. Tut sich hier (bei der jeweiligen Abfrage) aber was, brauchst 
Du eine zeitliche Referenz.

Es ist eine oft übersehene Tatsache, dass ein Timer als Basis für 
verschiedene Zeitraster verwandt werden kann...

von Bernie (Gast)


Lesenswert?

Alle AVRs mit Pin-Change-Interrupt bieten die Möglichkeit,
Pegeländerungen an fast allen Port-Pins zu erfassen.
Ansonsten gibt es immer 2 Eingänge: Int0 UND Int1.

Die Pulszahl muss ja nicht in einem Zähler landen, sie kann
auch in Registern gesammelt werden.

Bis zu etlichen kHz geht das per INT0/INT1/PCHG-Interrupt.

Ein bisschen Drumherum mit einer Zeitreferenz (TimerX) usw.
musst du natürlich im Programm bereitstellen.

von Steven T. (kampfwaffel)


Lesenswert?

Danke, das hilft mir schon einmal beachtlich weiter.
Allerdings stellt sich mir die Frage, ob die Messung dann noch 
zuverlässig ist, wenn z.B. der Eingang INT0 ständig den Programmablauf 
unterbrechen lässt, immerhin könnte das auch mal gut 40 mal die Sekunde 
passieren oder beeinflusst das die Zählung vom Timer0 nicht?

von Amateur (Gast)


Lesenswert?

40 Impulse pro Sekunde sollten kein Problem sein.

Ein supereinfacher Ansatz:
Im Hintergrund läuft ein Timer als pseudo Echtzeituhr indem er z.B. 
einen Zähler alle paar µs inkrementiert. Der Zählerstand sollte 
möglichst nicht "überlaufen". Also sollten 64 Bit Breite ausreichen.
Das Inkrementieren einer einzelnen Zahl braucht nur wenige Taktzyklen.

Bei jeder Ansteigenden Flanke holst Du Dir den aktuellen Zählerstand und 
ziehst den Vorgänger ab. Je nach Zeitraster hast Du auf diese Weise eine 
Zeitbasis.

von µC-Bastler (Gast)


Lesenswert?

Amateur schrieb:
> Also sollten 64 Bit Breite ausreichen.

Ich fürchte, du überschätzt die Dauer einer 1/40 Sekunde. Selbst wenn du 
deinen Zähler mit 20MHz taktest, d.h. alle 50ns um eins weiterzählen 
läßt, ist das maßlos übertrieben ;-)

von Amateur (Gast)


Lesenswert?

Sollen 40 Impulse (max.) aufgelöst werden, so ist eine Zeitbasis nötig, 
die wesentlich kürzere Abstände unterscheiden kann.
Kommt jetzt noch hinzu, das über Stunden hinweg gemessen werden soll, 
eine Tankfüllung lang oder so, so kann ein nach oben "offener" Bereich 
nicht schaden.
Bei einer "richtigen" Messung kann es sogar nötig werden einen Kalender 
zu implementieren.
Mein Beispiel war allerdings mehr an einen Anfänger gerichtet.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Amateur schrieb:
> Sollen 40 Impulse (max.) aufgelöst werden, so ist eine Zeitbasis
> nötig, die wesentlich kürzere Abstände unterscheiden kann.

Es ist die Rede von bis zu 40 Impulsen PRO SEKUNDE

> Kommt jetzt noch hinzu, das über Stunden hinweg gemessen werden soll,
> eine Tankfüllung lang oder so, so kann ein nach oben "offener" Bereich
> nicht schaden.
> Bei einer "richtigen" Messung kann es sogar nötig werden einen Kalender
> zu implementieren.

Es geht hier nicht darum festzustellen wie viel Milliliter Sprit im 
Laufe eines Jahres durch die Spritleitung diffundieren!

: Bearbeitet durch User
von Steven T. (kampfwaffel)


Lesenswert?

Genau, Impulse pro Sekunde. Es soll lediglich den momentanen Verbrauch 
anzeigen, die Daten sollen also nicht gespeichert werden sondern für den 
Aktualisierungszeitraum immer wieder neu berechnet werden.

Ich plane auch noch Erweiterungen, wie z.B. die Anzeige des 
durchschnittlichen Verbrauches oder den Restinhalt des Tankes (ggf. auch 
Restkilometer), aber erst einmal möchte ich erfolgreich diese Aufgabe 
lösen.

von Amateur (Gast)


Lesenswert?

Der Unterschied von 40 zu 39 Impulsen beträgt 0,00064s

Für eine sinnvolle Unterscheidung dieser Abstände ist nach meiner 
unmaßgeblichen Meinung eine Zeitbasis von wenigstens 0,0001s vonnöten.

Nach Adam Ries und Eva Zwerg etwa 10.000 KHz.

Ein 32-Bit Zähler bekommt also schon nach etwas über 4 Tagen 
Ohrensausen.

Soll er Unterschied von 40 zu 39,9 Impulsen (>1 %) herausgearbeitet 
werden, so währen bereits 100.000 KHz nicht schlecht.

Ein 32-Bit Zähler macht jetzt schon nach weniger als einem halben Tag 
schlapp.

von Steven T. (kampfwaffel)


Lesenswert?

Warum nach mehreren Tagen? So lang soll er nicht hochzählen, mag sein, 
dass ich da noch nicht den Durchblick habe, aber er muss doch nicht 
konsequent hochzählen, es sollte doch völlig ausreichend sein, wenn er 
für den Zeitraum der Aktualisierung zählt.

Zwei Sensordaten werden erfasst, werden miteinander verrechnet und 
ausgegeben, nach x-Sekunden wird die aktuelle Messung berechnet und 
ausgegeben und so weiter und sofort, von Tagen spricht niemand.

Eine so genaue Messung ist auch vorerst nicht von Nöten. Eine 
Unterscheidung zwischen ganzen Zahlen reicht mir da in der ersten 
Version.

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Mein Ansatz s.o. ging erstens davon aus, dass die Zeit aus der Differenz 
eines Zählers gewonnen wird und zweitens diese Zeit an verschiedenen 
Stellen (Drehzahlimpulse UND Durchflussimpulse) zur Verfügung steht.

Eine Messung KÖNNTE jetzt folgendermaßen aussehen:

Wohl gemerkt im Hintergrund wird eine Variable zyklisch inkrementiert.

EndlosBegin
? Neue Flanke Geschwindigkeit
  Ja Hole Hintergrundzähler
     Akt. Abstand = Vorheriger Zählerstand - akt. Z.
     Merke akt. Zählerstand als Vorherigen Z. (Achtung != Verbrauch)
     ZEIT STEHT FEST
     ...
? Neue Flanke Verbrauch
  Ja Hole Hintergrundzähler
     Akt. Abstand = Vorheriger Zählerstand - akt. Z.
     Merke akt. Zählerstand als Vorherigen Z. (Achtung != 
Geschwindigkeit)
     ZEIT STEHT FEST
     ...
? Neue Werte
  Ja Hole Hintergrundzähler
     Akt. Abstand = Vorheriger Zählerstand - akt. Z.
     ? Zeit zum aktualisieren (z.B. alle 0,5 Sek)
       Ja Merke akt. Zählerstand (!= Verbr. und Geschw.)
       Anzeige neuer Werte
     ...
>>Was sonst noch anliegt<<
EndlosEnde

Diese Sequenz kann so lange abgearbeitet werden, wie der 
Hintergrundzähler nicht ausflippt.
Diese Sequenz benötigt nur einen Timer.

von c-hater (Gast)


Lesenswert?

Amateur schrieb:

> Diese Sequenz kann so lange abgearbeitet werden, wie der
> Hintergrundzähler nicht ausflippt.

Unter der Voraussetzung, daß sichergestellt ist, daß zwei 
aufeinanderfolgende Impulse niemals weiter auseinander liegen als der 
volle Zählumfang des Zählers, geht das sogar unendlich lange gut. Wenn 
man es richtig macht, nämlich mit "unsigned" Variablen.

von Grundschüler (Gast)


Lesenswert?

hier mal ein Beispiel Impulszähler in C, müsste in Bascom aber genauso 
laufen:
1
void PCINT3_Init(void){ // Initialisierung PCINT_Port D
2
   PCICR |= (1 << PCIE3);//PCIntControlRegister
3
   sei();
4
}
5
6
void PCINT30_start(void){//d6
7
   isr_imp=0;
8
   PCMSK3 |= (1 << PCINT30);
9
}
10
11
//Q1
12
void PCINT29_stop(void){//d5 ok
13
//current can not exceed 10mA, 330 pulses/liter,
14
//Messung Zeit für Durchfluss 1000l/h => 92 imps/sec
15
PCMSK3 &= ~(1 << PCINT29);
16
q2_l_hou=(uint32_t)isr_imp*500/92;
17
//tsx01("l/h",isr_imp);
18
tsx01("l/h",q2_l_hou);
19
//lgw(17,1,"Imp29/Q2  : ");li(isr_imp);lw(" ");
20
//li(q1_l_hou);lw("l/h");
21
}
22
23
24
main..
25
if(sec==38){PCINT29_start();}//d5-q2
26
if(sec==39){PCINT29_stop();}

von Steven T. (kampfwaffel)


Lesenswert?

Nebenbei mal die Frage... Da ich noch vor hatte eine einfache Uhr 
miteinzubinden, da das doch noch recht simpel mit einer RTC zu lösen 
ist, frage ich mich ob es Sinn macht, die RTC für die Zählung 
mitzubenutzen.

von Uhrmacher (Gast)


Lesenswert?

Schon mal verstanden wie ne mechanische Uhr seit Jahrhunderten 
funktionier?

Wozu da wohl Zahnräder drin sind?

von Detlef K. (deka65)


Lesenswert?

Interessant zu wissen wäre auch, welcher Prozessor verwendet werden 
soll.
Ebenso, wie wird die Raddrehung erfasst. (wie viele Impulse/n)
Vorschlag:
1 Timer dient als Zeitnormal (1 sek, 2 sek,...what ever)
Interrupt INT0 (zB Benzin) erhöht die Variable Benzin
Interrupt INT1 (zB Rad) erhöht die Variable Rad
nach Ablauf der Zeit (Timer) können die Variablen Benzin und
Rad ausgelesen und bearbeitet werden. Anschließend werden die
Variablen auf Null gesetzt, und alles von vorn.

von Steven T. (kampfwaffel)


Lesenswert?

Prozessor steht offen, ich experimentiere hier mit einem Atmega8, 
angesichts der Funktionen die ich nach und nach dazupacken will wäre 
vermutlich ein größerer noch sinnvoll (wie z.B. Öl- und 
Wassertemperatur, Tankinhalt erfassen etc)
Da ich in der Endschaltung das ganze als SMD Bauweise realisieren 
möchte, habe ich eigentlich sehr viel Spielraum.

Das Erfassen der Geschwindigkeit ist noch nicht ganz durchdacht, da ich 
lediglich ein mechanisches Tacho habe und sonst nirgens ein Signal dafür 
zur Verfügung steht muss ich mir da was bauen. Was genau weiß ich noch 
nicht...
Die derzeitige Idee wäre ein Reflexsensor an dem Magneten des Tachos zu 
montieren und dort Striche aufzubringen.
Ich kann also noch nicht genau sagen, wie viele Impulse/n es sein 
werden.

Deine Idee gefällt mir sehr gut, sie wirkt übersichtlich und für mich 
als Anfänger erstmal gut umsetzbar...

von Detlef K. (deka65)


Lesenswert?

Dann wird es wohl in Richtung Atmega16 oder Atmega32 gehen.
Die haben 3 INTx und viele ADC's . Damit kannst du dich
dann richtig austoben. Ich habe mit diesen Prozessoren in
SMD leider  keine Erfahrung. Aber noch zwingt dich ja keiner
einen bestimmten zu nehmen. Eine Frage noch, du willst die
gemessenen Werte doch bestimmt anzeigen?  womit und wie ?

von Steven T. (kampfwaffel)


Lesenswert?

Aber ich dachte mir schon, dass der kleine Atmega8 nicht reichen wird. 
Solange ich bei BASCOM bleiben werde, muss ich ja auch ohnehin den 
deutlich höheren Platzbedarf des Flashs mit einbeziehen.

Ich habe hier für die ersten Tests ein einfaches 16x2 HD44780 
kompatibles LCD. Später würde ich das ganze dann gern mit einem OLED 
Display mit SSD1306 umsetzen, da es von der Größe und vom Preis her 
ideal ist.

Ob ich dann allerdings noch mit BASCOM experimentiere... Das weiß ich 
nicht. Hier wäre C# ja nun wieder deutlich geeigneter, da es für das 
SSD1306 wohl schon eine Menge libs für C# gibt, das bleibt hier also 
vorerst außen vor...

: Bearbeitet durch User
von Uhrmacher (Gast)


Lesenswert?

Oh Gott, welch ein Unsinn hier verzapft wird.

Nimm doch besser einen aktuellen Intel Westmehre,
die Power wird schon reichen....

unglaublich, echt ..........

von Steven T. (kampfwaffel)


Lesenswert?

Statt nur rumzumeckern und dumm zu schwatzen könnte man auch 
konstruktive Kritik äußern, aber warum die wohl ausbleibt (könnte ja 
helfen)... So hilft man niemandem weiter, außer der eigenen Inkompetenz.

: Bearbeitet durch User
von Uhrmacher (Gast)


Lesenswert?

Ok, ich bin dumm, Du bist schlau..
Na dann liefere mal ab.
Ihr habt einfach den Fokus verloren.
Euer Problem ist trivial, ebenso die Lösung.

Tschüss

von Steven T. (kampfwaffel)


Lesenswert?

Der Unterschied zwischen dumm sein und dem abgeben von dummen 
Kommentaren ist ziemlich groß...

Man kann sich selbst und anderen natürlich auch das Leben erschweren, 
das macht eine freundliche und soziale Welt aus.

Aber das soll hier nicht Thema sein..

von Karl H. (kbuchegg)


Lesenswert?

Fang doch erst mal damit an eine LED blinken zu lassen.

Auch wenn mir der Ton nicht wirklich gefällt: Die Aufgabe IST trivial. 
Wenn die Anzahl der Pins reicht, dann ist der Mega8 mehr als 
ausreichend. Auch in BASCOM.
Wie gesagt, mit dem Ton bin ich nicht einverstanden. Aber so unrecht hat 
er nicht. Die einfachste Funktionalität nicht hinkriegen aber von einem 
graphischen Display träumen. Kopfschüttel.

: Bearbeitet durch User
von Detlef K. (deka65)


Lesenswert?

Noch mal zum Thema Geschwindigkeit. Wenn du sowieso an einem Magneten
(im/am Tacho) hantieren willst, wären Hallsensoren auch eine Möglich-
keit, die Drehzahl zu erfassen. Je nach Anzahl der Polpaare des
Magneten mehrere Hallsensoren gleichmäßig verteilen, das es mehrere
Impulse pro Umdrehung ergibt.
Ist ja nur 'ne Idee.

von Mike (Gast)


Lesenswert?

Detlef Kahrmann schrieb:
> Je nach Anzahl der Polpaare des
> Magneten mehrere Hallsensoren gleichmäßig verteilen, das es mehrere
> Impulse pro Umdrehung ergibt.

Und welchen Vorteil soll man daraus für die Verbrauchsmessung ziehen? 
Messung der Änderung des Verbrauchs innerhalb einer Radumdrehung? 
Zumindest auf einer Anzeige wird dem keiner folgen können.

von Detlef K. (deka65)


Lesenswert?

@ Mike
In welchem Zusammenhang Durchflußmenge und Hinterrraddrehzahl stehen,
lasse ich mal aussen vor.

Steven T. schrieb:
Das Erfassen der Geschwindigkeit ist noch nicht ganz durchdacht, da ich
lediglich ein mechanisches Tacho habe und sonst nirgens ein Signal dafür
zur Verfügung steht muss ich mir da was bauen. Was genau weiß ich noch
nicht...

Ich wollte nur eine Möglichkeit (von warscheinlich vielen) aufzeigen.

Was, und warum gemessen werden soll, kann nur Steven erklären.

von Mike (Gast)


Lesenswert?

Detlef Kahrmann schrieb:
> @ Mike
> In welchem Zusammenhang Durchflußmenge und Hinterrraddrehzahl stehen,
> lasse ich mal aussen vor.

Dann kannst du vielleich näher erläutern, welche nennenswerten Vorteile 
es für diese Anwendung bietet, wenn man mehr als einmal pro Radumdrehung 
eine Information über die gefahrenen Strecke erhält.

von Detlef K. (deka65)


Lesenswert?

@ Mike
Mein Vorschlag bezog sich nur auf die Möglichkeit, die Drehzahl der
Tachowelle magnetisch zu erfassen. Wie das Übersetzungsverhältnis
zwischen Hinterrad und Tachowelle ist, weiss ich nicht. Deshalb der 
Hinweis auf die Möglichkeit, eine Umdrehung der Tachowelle 
aufzusplitten.          Muss aber nicht so sein.
Dazu sollte Steven mehr sagen können.

von Steven T. (kampfwaffel)


Lesenswert?

Einiges passiert... Nun gut.
Zum Thema, dass ich erst einmal eine LED blinken können lassen soll, 
finde ich etwas weit hergeholt. Das sind alles Dinge, die so einfach 
sind, dass es das erste ist, was an probiert und direkt klappt.
Auch die Verbrauchsanzeige habe ich so erst einmal hinbekommen, das 
ganze lief aber mit einem Festwert ( die Impulse/s des Durchflussmessers 
hatte ich als festen Wert gespeichert ) und mittels eines 
Funktionsgenerators (eigentlich nur ein NE555 als astabile Kippstufe und 
variablen Widerständen)
das Geschwindigkeitssignal generiert. Damit habe ich dann versucht 
möglichst realistische Impulsfrequenzen zu erzeugen und dadurch den 
Verbrauch auf dem Display anzeigen zu lassen. Das ganze klappte 
wunderbar und war rechnerisch gesehen auch recht passend. Im Tutorial 
war für das Zählen nur T0 erklärt, mit dem Kommentar, dass sich andere 
Eingänge bei schnellen Zählungen nicht eignen, mehr wurde leider nicht 
erklärt, darum stellte ich diese Frage.
Den Kommentar mit dem graphischem Display finde ich auch etwas 
lächerlich, da ich nicht gesagt habe, dies so direkt umsetzen zu wollen, 
es war die rede von "irgendwann, wenn ich es kann", also wo liegt das 
Problem?
Nun zurück zum Thema:

Radumdrehung für den Vebrauch -> ich möchte den Verbrauch natürlich als 
liter auf 100km angezeigt bekommen, damit brauche ich also 
logischerweise die Raddrehzahl um zu erfassen, welche Entfernung ich 
zurücklege und wie viel ich in dieser Zeit verbraucht habe.

Die Idee mit den Hallsensoren finde ich recht gut, wobei ich denke, dass 
einer dort reichen würde. Hier sollte einer allein auch kein Problem 
sein, da sich der Magnet recht schnell drehen muss, auch bei kleinen 
Geschwindigkeiten. Der Vorteil liegt wohl auch klar darin, dass ich hier 
keine Striche o.Ä. auf dem Magneten aufbringen muss.

Korrigiert mich, wenn ich falsch liege, aber nur einmal pro Radumdrehung 
einen Impuls zu bekommen stelle ich mir zu träge in unteren 
Geschwindigkeiten vor, mein Rad hat einen Abrollumfang von 1,8m.

von Norbert S. (norberts)


Lesenswert?

Hi,

Du wirst das sowieso über mehrere Sekunden mitteln müssen und in PKW 
wird unter 40km/h oder so auch nichts angezeigt weil es keinen Sinn 
macht.
Die Gesamtmenge an Sprit kannst Du ja trotzdem weiter aufsummieren.

Lass einfach einen Timer klappern und zähle in dessen Int eine weitere 
Variable hoch. Dann pollst Du einfach die Impulse und mittelst das 
gleitend über Sekunden. Wenn da nicht jeder Impuls auf die µS genau ist, 
ist das vollkommen egal denn es interessieren eigentlich nur die Impulse 
pro Sekunde.
Das ist wirklich ziemlich banal und in Bascom überhaupt kein Problem.
Wenn Du das in SMD machen willst, sind die Mega allerdings nicht sehr 
bastlerfreundlich, da kommt nicht jeder mit 0,8mm Pitch klar.
Ein Attiny861 im SO-20 sollte aber locker reichen.
Mit weniger SRam macht mit Bascom keinen Spaß (Stack und Frame und so).

Gruß,
Norbert

von Steven T. (kampfwaffel)


Lesenswert?

Das mit der Geschwindigkeit stimmt so nicht, dass die Schwelle bei 
40km/h liegen soll habe ich so nicht erlebt, i.d.r. wird schon was 
angezeigt, wenn man mit 7km/h im Standgas fährt, nur beim stehen lässt 
sich halt kein Verbrauch ermitteln. Aber das ist hier ja nicht relevant.

Es klingt wirklich alles einfacher, als ich es mir vorgestellt habe. Ich 
denke ich werde mich die Tage damit dann mal beschäftigen und schauen, 
dass ich dort etwas hinbekomme.
Auch die Idee mit dem Hallsensor bringt mich bedeutend weiter, ich denke 
damit ist das Problem eigentlich hiermit erledigt.

Ich wollte deshalb einen größeren nehmen, da ich das ganze offen halten 
will für Erweiterungen, da denke ich macht es sich gut, direkt einen 
etwas größeren zu nehmen.
Mit dem Löten von SMD Bauteilen habe ich überhaupt kein Problem, sonst 
hätte ich auch den falschen Beruf ergriffen :-D

Danke dir für die konstruktive und durchinformierte Hilfe. Und auch 
allen anderen beteiligten, die nicht gerade gegen das Thema gearbeitet 
haben.

Beste Grüße und ein schönen restlichen Pfingstmontag

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.