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.
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.
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!
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 :-)
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???
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!!!
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
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
@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?
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).
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
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.
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!
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.
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.
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.
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"
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.