Forum: Mikrocontroller und Digitale Elektronik Nachträglich Timer einbauen


von Johannes B. (aprendiz)


Angehängte Dateien:

Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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
von Johannes B. (aprendiz)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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
von Stefan (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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"

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.