Zeitmessung zwischen 2 Signalen

OP #2951150
Lesenswert?

Hallo, ich sitzt gerade an meiner Projektarbeit und habe ein Problem 
beim programmieren meines Mikrocontrollers. Ich möchte gerne die Zeit 
zwischen zwei Eingangssignalen messen habe allerdings keine Ahnung wie 
ich so etwas realisieren kann. Also wie ich eine art Uhr generiere und 
beim jeweiligen Signal die Zeit auslese. Danach wollte ich die Werte 
voneinander subtrahieren und somit die Zeit zwischen beiden signalen 
speichern. Die Eingangssignale laufen mit ca 50Hz  Hoffe jemand kann mir 
helfen.
Gast #2951170
Lesenswert?

Wie sehen die beiden Eingangssignale genau aus? (Analog, digital, 
Spannung usw.) Ein Bild sagt manchmal mehr als tausend Worte.

Im einfachsten Fall sind es 2 digitale Signale.
Dann brauchst Du nur beim Auftreten des einen Signals einen Timer 
starten und beim Auftreten des 2. Signals den Timer stoppen. 
Anschließend die Zeit auslesen und umrechnen. Evtl. müsste man noch 
überläufe des Timers berücksichtigen!
Gast #2951173
Lesenswert?

Eine einfache Unterbrechung an z.B. INT0 startet einen Zähler z.B. 
Timer1 die nächste Unterbrechung stoppt selbigen.
Die Int's lassen sich m.E. recht komfortabel Programmieren (Steigende 
oder fallende Flanke)
Die Zähler lassen sich mit verschiedenen Eingangstakten belegen.
Die Anzahl an aufsummierten Takten kannst Du dann vergessen oder 
auswerten :-)
Gast #2951185
Lesenswert?

Vito T. schrieb:
> Ich benutze einen Atmega 644PA-PU der 2 Timer hat. Habe mir auch das GCC
> Tutorial hier durchgelesen aber habe keine Ahnung wie ich das machen
> soll. Bin Anfänger wäre es vieleicht möglich einen Beispielcode hier
> reinzusetzen???

Erzähl erst nochmal genau, so dass man auch garantiert nichts falsch 
verstehen kann, was Du genau machen willst.
Mit Deiner Aussage könnte man Dir mind. 3 unterschiedliche Programme 
stricken die alle etwas anderes tun.

Du lieferste einfach zu wenig Infos!!!
#2951218
Lesenswert?

amateur schrieb:
> Eine einfache Unterbrechung an z.B. INT0 startet einen Zähler z.B.
> Timer1 die nächste Unterbrechung stoppt selbigen.
> Die Int's lassen sich m.E. recht komfortabel Programmieren (Steigende
> oder fallende Flanke)

Im Prinzip ok, aber spar dir das Timer starten/stoppen.

Wenn der Apfel am Baum seinen Fall beginnt, wenn der Sekundenzeiger auf 
15 stand und der Zeiger beim Aufschlagen auf den Boden bis auf 23 
vorgerückt ist, dann ist der Apfel 23-15, also 8 Sekunden gefallen.

Den Timer einfach durchlaufen lassen!
End'zeit' weniger Start'zeit' ergibt dann die 'Zeit'differenz
#2951220
Lesenswert?

Vito T. schrieb:
> Ich benutze einen Atmega 644PA-PU der 2 Timer hat. Habe mir auch das GCC
> Tutorial hier durchgelesen aber habe keine Ahnung wie ich das machen
> soll. Bin Anfänger

Das ist kein Argument.
Wenn ich dir alle 2 Sekunden einen Tritt gebe, wieviel Zeit ist dann 
vergangen, nachdem ich dir den 48-ten Tritt gegeben habe?

Und genauso einfach sind auch die Zeiten bei Timern zu bestimmen. Man 
muss nur verstehen, wie eigentlich ganz einfach die Sachen 
funktionieren. Das ist alles keine Raketentechnik. Jeder der im 
Kindergarten gelernt hat, mit dem Sekundenzeiger seiner Uhr 
"Berechnungen" zu machen, kriegt das hin.

FAQ: Timer
Gast #2951222
Lesenswert?

@Vito

Allzu tief scheint deine Betrachtung des Problems nicht gegangen sein.

Im GCC-Tutorial wird die Verwendung der Unterbrechungen beschrieben und 
auch was man mit so einem Timer anfangen kann wird dort beschrieben.

Deine angegebene Anzahl an Timern im 644 kannst Du ruhig um eins 
erhöhen.

Kann es  sein, dass Du jemanden suchst, der Dein Problem auf: "Kopieren 
geht über Studieren" reduziert?
OP #2951233
Lesenswert?

Ok ich habe zwei periodische Rechtecksignale mit ca. 4V die zu 
unterschiedlichen Zeiten eine positive Flanke aufweisen. Habe eine 
kleine Zeichnung mit im Anhang eingefügt. Die Signale sind an PortB Pin0 
und Pin1 angeschlossen. Ich möchte quasi die Zeit zwischen diesen beiden 
Signalen erfassen (in der Zeichnung mit delta t gekennzeichnet).
Angehängte Dateien:
OP #2951235
Lesenswert?

Karl Heinz Buchegger schrieb:
> Das ist kein Argument.
> Wenn ich dir alle 2 Sekunden einen Tritt gebe, wieviel Zeit ist dann
> vergangen, nachdem ich dir den 48-ten Tritt gegeben habe?
>
> Und genauso einfach sind auch die Zeiten bei Timern zu bestimmen. Man
> muss nur verstehen, wie eigentlich ganz einfach die Sachen
> funktionieren. Das ist alles keine Raketentechnik. Jeder der im
> Kindergarten gelernt hat, mit dem Sekundenzeiger seiner Uhr
> "Berechnungen" zu machen, kriegt das hin.

Sehr Geistreich!!! Aber auf deine Hilfe verzichte ich mit vergnügen
Gast #2951239
Lesenswert?

Vito T. schrieb:
> Sehr Geistreich!!! Aber auf deine Hilfe verzichte ich mit vergnügen

:-)
Wobei KHB einer der aktivsten Leute hier im Forum ist und auch schon oft 
Anfängern geholfen hat.

Tja, normalerweise wird an dieser Stelle auf den "Umgang mit faulen 
Schülern Link" verwiesen...leider finde ich ihn gerade nicht.
OP #2951241
Lesenswert?

amateur schrieb:
> @Vito
>
> Allzu tief scheint deine Betrachtung des Problems nicht gegangen sein.
>
> Im GCC-Tutorial wird die Verwendung der Unterbrechungen beschrieben und
> auch was man mit so einem Timer anfangen kann wird dort beschrieben.
>
> Deine angegebene Anzahl an Timern im 644 kannst Du ruhig um eins
> erhöhen.
>
> Kann es  sein, dass Du jemanden suchst, der Dein Problem auf: "Kopieren
> geht über Studieren" reduziert?

Hey ich verstehe nicht wie ich das programmieren soll. Ich habe 
niemanden gebeten das für mich zu erledigen falls du das damit meinst. 
Ich wollte einfach nur mal einen Tipp haben. Wenn Du ein Problem damit 
hast dann lass es!
OP #2951248
Lesenswert?

MyMy schrieb:
> :-)
> Wobei KHB einer der aktivsten Leute hier im Forum ist und auch schon oft
> Anfängern geholfen hat.

Und verspotet Anfänger wo er kann. Frag mich ob er es auch macht wenn 
die Person auch vor ihm stehen würde.

> Tja, normalerweise wird an dieser Stelle auf den "Umgang mit faulen
> Schülern Link" verwiesen...leider finde ich ihn gerade nicht.

Da fühle ich mich nicht angesprochen ich habe es versucht und weil es 
nichts gebracht hat melde ich mich hier.
Gast #2951260
Lesenswert?

Vito T. schrieb:
> Da fühle ich mich nicht angesprochen ich habe es versucht und weil es
> nichts gebracht hat melde ich mich hier.

Ich kann aber nur den anderen zustimmen, dass die Anstrengung scheinbar 
nicht all zu groß war. Ein einfaches pollen hätte normalerweise drin 
sein müssen! Des weiteren macht es einen besseren Eindruck wenn man 
zumindest noch ein paar Codeschnipsel hier präsentiert und zeigt dass 
man bemüht war.

Vito T. schrieb:
> Hey ich verstehe nicht wie ich das programmieren soll.

Wurde Dir weiter oben schon erklärt.
Im Prinzip nimmst Du 2 interruptfähige Eingänge oder pollst die einfach 
in Deinem Mainprogramm.
Nun gibt es 2 Möglichkeiten:
1) Du startest bei einer positiven Flanke von Kanal 1 den Timer und 
stoppst ihn bei einer positiven Flanke von Kanal 2. Danach Zeit von 
Timer auslesen und fertig.
2) Du lässt den Timer frei laufen und nimmst bei der ersten positiven 
Flanke den Timerwert und bei der 2. positiven Flanke den Timerwert. 
Danach machst Du Wert 2 - Wert 1 und hast dann die Differenz Delta.

Der Rest ist alles im Tutorial und in UNZÄHLIGEN Beiträgen hier 
gelistet.
#2951304
Lesenswert?

Vito T. schrieb:

>> Kann es  sein, dass Du jemanden suchst, der Dein Problem auf: "Kopieren
>> geht über Studieren" reduziert?
>
> Hey ich verstehe nicht wie ich das programmieren soll. Ich habe
> niemanden gebeten das für mich zu erledigen falls du das damit meinst.
> Ich wollte einfach nur mal einen Tipp haben.

Ein noch detaillierter Tip wrde schon bedeuten, dir das Programm zu 
schreiben! Genau darum geht es doch: Das ganze ist nicht wirklich schwer 
und/oder umfangreich.

Werd halt mal konkret, wobei du Probleme hast. Dann kann man auch 
konkret helfen. Aber solange du nur rummaulst, kannst du auch nix 
Konkreteres mehr erwarten. Denn dazu ist der Umgang mit Timern eine zu 
wichtige Basistechnik, als das es vernünftig wäre, dir das in Form von 
Code zuzuschanzen.

Und im übrigen gilt: Du legst mit Code vor, der vom Forum gerne 
Korrektur gelesen wird. Aber ausser in wirklich kniffligen Fällen, die 
man in Textform nicht oder nur sehr schwer erklären kann, ziehen es die 
Regulars im Forum vor, nicht selbst ungefragt mit Code rauszurücken. 
Denn gerade bei Basissachen stimmt der gerne gebrachte Spruch "Ich lerne 
am Besten durch Beispiele" eben nicht. Wenn du die Timer-Diskussion in 
der FAQ durchschaut hast, dann sollte das Problem doch mitlerweile zu 
einem Nicht-Problem geworden sein.


Und PS:
Du verwechselst da was.
Du verwechselst den Tritt in den Allerwertesten, dich mal auf deine 
eigenen 4 Buchstaben zu setzen und selbst etwas zu machen bzw. zu 
präsentieren mit der prinzipiellen Nicht-Bereitschaft zu helfen. Es ist 
nicht so, dass ich dir nicht helfen will. Es ist aber so, dass ich dich 
in erster Linie dazu bringen will, selbst die Aufgabe zu machen und 
selbst darüber nachzudenken, wie denn eigentlich so ein Timer in deinem 
konkreten Fall funktionieren könnte und wie die entsprechenden 
Zeitberechnungen ablaufen. Und wie bereits gesagt: Das ist alles keine 
Raketentechnik.


Noch ein PS:
Deine Zeichnung ist doch schon ein Anfang.
Wenn dir die Sache mit den Interrupts noch zu haarig ist ... du musst 
sie ja nicht benutzen. Wodurch zeichnet sich denn die Stufe (die 
steigende Flanke) im ersten Signal aus? Erst war der Portpin auf 0 und 
plötzlich ist er auf 1. d.h. dein Programm könnte solange warten, bis 
der Portpin auf 0 geht. Damit hast du die gaze Vorgeschichte vom Signal 
1 links von der Stufe vom Tisch. Der Pegel ist auf 0. Und danach wartet 
das Programm solange, solange der Pegel auf 0 ist. Wird der Pegel auf 1 
gelesen, dann ist an dieser Stelle die Flanke gewesen. Voila: die 
steigende Flanke im Signal 1 wurde erkannt. Von der Uhr (dem Timer) den 
Zählerstand merken (als Startzeit) und danach auf die steigende Falnke 
im Signal 2 warten. Ist die da, dann ebenfalls den Zählerstand nehmen. 
Die Differenz der Zählerstände ist dann der 'Zeitversatz'. Noch in einer 
ungewöhnlichen Nicht-Zeit Form. Aber wenn man weiß, wie schnell der 
Timer zählt (und das weißt du. Denn du kennst die Taktfrequenz und den 
Vorteiler), dann kann man daraus eine reale Zeit in Sekunden (oder 
MIllisekunden oder...) berechnen.
Gast #2952666
Lesenswert?

Vito T. schrieb:
> Signale_001.png
> 3,4 MB,

Das ist jetzt nicht wahr, oder?

3,4MB um den Informationsgehalt von zwei phasenverschobenen Rechtecken 
rüberzubringen. Geht's denn noch?

Du scheinst die Zahl der Leser, die sich die paar Linien auf einem 
4K-Monitor formatfüllend und verlustfrei entkomprimiert angucken wollen, 
gnadenlos zu überschätzen.
Angehängte Dateien:
Gast #2957341
Lesenswert?

Dein Controller hat Pin Change Interrupts!

Damit kannst Du Interrupts bei wechselnden Flanken erzeugen, für jeden 
Pin! Also auch für deine Pins PortB_0 und PortB_1.

Wie gasagt: Timer laufen lassen, oder bei der 1. Flanke starten. Der 
Timer zählt dann von 0 los. Je nach Timer und Einstellung bis zu einem 
bestimmten Wert, z.B. 255 (8Bit), dann gehts wieder von 0 los.
Prinzip:
Du musst ZWISCHEN den beiden Interrupts einfach die Anzahl der 
Timer-Ereignisse zählen! Je ganauer du die Zeit haben willst, desto MEHR 
Timer-Zähl-Ereignisse sollten es sein. Die höchste Anzahl ergibt sich, 
wenn man den Timer mit der System-Clock zählen lässt. z.B. 10Mhz Clock 
--> 1 Timer EZählschritt alle 100ns. Bedeutet aber auch, dass bei einem 
8-Bit Timer max. 25500ns, oder 15,5 µs Zeit zu messen ist. Dann entweder 
eine Variable hochzählen (um die Anzahl der Überläufe mitzuzählen) oder 
Timer Frequenz erniedrigen (mit Prescaler) oder 16 Bit Timer nehmen oder 
eine Kombination aus den Maßnahmen. Ich weiß nicht genau, was welche 
Zeitauflösung du brauchst.

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