Hi Leute, letzte Woche habe ich es mit eurer freundlichen Unterstützug geschafft die Impulse eines Inkrementalgebers mit einem Timer/Counter zu zählen. Heute oder besser seit ein paar Tagen stehe ich vor einem Neuen Problem. Wenn der Counter in meinem Programm bei 7500 angekommen ist, soll in dem ISR des Counters ein neuer Interrupt gestartet werden welcher die Zeit stoppt bis der ISR erneut ausgelöst wird. Somit möchte ich die Drehzahl feststellen können (Berechnung Zeit/Impulse) Ich habe schon ein wenig rumexperimentiert, doch leider keine Funktion erreicht. Jetzt meine Frage: Ist dies überhaupt möglich oder kennt ihr bessere Ansätze?
Johannes Berger schrieb: > Ich habe schon ein wenig rumexperimentiert, doch leider keine Funktion > erreicht. Mit Experimenten kommt man da nicht weiter. Erstelle zuerst einen Programablaufplan, wie Du Dir die Funktion vorstellst. Ein PAP ist ein einfachses Hilfmittel, um überhaupt erstmal einen logischen Ablauf zu erstellen. Und er setzt keine Programmierkenntnisse voraus. Nur Papier und Bleistift.
:
Bearbeitet durch User
Danke danke, aber ein PAP hilft mir in der Situation nicht weiter . Wie die Frage schon erahnen lässt.. Hat denn keiner Kenntnisse über so einen Fall? Gruß
Wohl wahr
> soll in dem ISR des Counters ein neuer Interrupt gestartet werden welcher die
Zeit stoppt bis der ISR erneut ausgelöst wird.
Diese Formulierung zeigt schon, dass dir ein paar Dinge nicht wirklich
klar sind. Ein Interrupt wird nicht 'gestartet'. Ein Interrupt ist eine
Reaktion auf ein bestimmtes Ereignis. Zum Beispiel das Toggeln eines
Port-Pins. Zum Beispiel das Erreichen bestimmter Zählerstände des
Timers.
In deinem Beispiel: Wozu brauchst du da einen zusätzlichen Interrupt?
Die ISR wird aufgerufen bei einem Zählerstand von zb 5489. Das nächste
mal wird die ISR aufgerufen bei einem Zählerstand von 9834. Wieviel Zeit
ist dazwischen vergangen?
Der Timer hat in der Zwischenzeit wieviele Zählvorgänge absolviert?
9834 - 5489 = 4345
Wieviel Zeit vergeht von einem Zählvorgang zum nächsten? Das ist
abhängig vom Prescaler des Timers und der Taktfrequenz des µC.
Weiss man wie lange es dauert, bis der Timer um 1 hochzählt, kann man
auch ausrechnen wieviel Zeit daher vergangen sein muss, um 4345
Timererhöhungen zu absolvieren.
-> und jetzt hast du deine Zeit die vergangen ist.
Dein CTC Modis bringt dich nicht weiter. Lass den Timer frei
durchlaufen. Wenn der AUsgangspin toggelt merkst du dir den Zählerstand
und wenn er das nächste mal togelt, sagt dir die Differenz der beiden
Werte, wieviel Zeit dazwischen vergangen ist. Das reicht dann schon um
die Frequenz zu berechnen.
Einfach mal ein wenig überlegen, wie du dieselbe Aufgabenstellung im
realen Leben lösen würdest, wenn alles was du hast eine Armbanduhr mit
Sekundenzeiger ist, der unaufhörlich vor sich hintickt. Im realen Leben
kriegen das die meisten ohne großes Nachdenken problemlos hin. Nur wenn
sie eine Programmstrategie ausknobeln sollen, dann ist plötzlich das
Hirn leer.
:
Bearbeitet durch User
Johannes Berger schrieb: > Danke danke, aber ein PAP hilft mir in der Situation nicht weiter . Dann hast Du es ja noch nichtmal versucht. Dein grundsätzliches Problem ist es, eine Aufgabe in einen Ablauf umzusetzen. http://de.wikipedia.org/wiki/Programmablaufplan Jede Task hat ihren eigenen PAP. Ein Interrupt ist quasi ein PAP, der parallel zum Main-PAP läuft. Am besten, Du läßt die Interrupts erstmal außen vor. Glaubst Du etwa, richtige Programmierer lesen die Aufgabe und hacken dann den Quelltext direkt ein? Nein.
:
Bearbeitet durch User
> Ein Interrupt ist quasi ein PAP, der parallel zum Main-PAP läuft.
Nein, ein Interrupt ist ein Ereignis, welches das laufende Programm
unterbricht.
Eine Interruptroutine, ist der Stück Code, der beim Interrupt ausgeführt
wird.
Etwas das parallel abläuft, nennt man Task oder Thread.
Peter Dannegger schrieb: > Dann hast Du es ja noch nichtmal versucht. > Dein grundsätzliches Problem ist es, eine Aufgabe in einen Ablauf > umzusetzen. Sein grundsätzliches Problem ist, dass er noch nicht mal eine Idee hat, wie er die Aufgabe eigentlich lösen will oder kann. Ihm fehlt die Lösungsidee.
Johannes Berger schrieb: > Somit möchte ich die Drehzahl feststellen können (Berechnung > Zeit/Impulse) > > Jetzt meine Frage: Ist dies überhaupt möglich oder kennt ihr bessere > Ansätze? Drehzahlmessung ist doch kein Problem. Beitrag "einfache Drehzahlmessung mit ATmega88"
Johannes Berger schrieb: > Somit möchte ich die Drehzahl feststellen können (Berechnung > Zeit/Impulse) Wie bei jeder Meßaufgabe erstmal festlegen: - Max - Min (0 geht nicht) - Auflösung Dann daraus berechnen der Zeitbasis und max/min Meßzeit. Vorher ist jedes Schreiben einer Codezeile vollkommen nutzlos.
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.