Forum: Compiler & IDEs Zeitmessung zwischen 2 Signalen


von Vito T. (2nc)


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.

von g457 (Gast)


Lesenswert?

Dein unbenannter Mikrocontrollers hat möglicherweise einen Timer. Falls 
ja dann den zugehörigen Abschnitt im Datenplatt lesen. Falls nein dann 
busy-waiting-mit-manuellem-Zykelnzählen.

von MyMy (Gast)


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!

von amateur (Gast)


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

von Vito T. (2nc)


Lesenswert?

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???

von MyMy (Gast)


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!!!

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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

von amateur (Gast)


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?

von Vito T. (2nc)


Angehängte Dateien:

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

von Vito T. (2nc)


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

von MyMy (Gast)


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.

von MyMy (Gast)


Lesenswert?

Doch...ich reiche ihn noch kurz nach:
Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

von Vito T. (2nc)


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!

von Vito T. (2nc)


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.

von MyMy (Gast)


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.

von Karl H. (kbuchegg)


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.

von m.n. (Gast)


Lesenswert?

Vito T. schrieb:
> Bin Anfänger wäre es vieleicht möglich einen Beispielcode hier
> reinzusetzen???

Alles schon vorhanden, wenn man danach suchen würde.
Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88"

von Mobilist (Gast)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


Lesenswert?

Mobilist schrieb:
> 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.

Oops. Hatte ich gar nicht gesehen.
Ist zumindest was die Größe anbelangt jetzt bereinigt.

von Sepp (Gast)


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.

von Sepp (Gast)


Lesenswert?

Sorry, 25,5 µs

von Vito T. (2nc)


Lesenswert?

Danke Sepp! Ich hatte das problem schon gelöst aber etwas aufwendiger 
als dein Vorschlag. Ist aber ein sehr sehr guter Tipp mit den Pin Change 
Interrupts das werde ich mal ausprobieren. Könnte mir einiges an 
Programmtext sparen. Vielen Dank :)

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.