Forum: Mikrocontroller und Digitale Elektronik Input Capture mit Überlauf / Interrupt-Priorität


von Johannes R. (Gast)


Lesenswert?

Hallo liebes Forum,

ich habe ein kleines Problem. Es geht darum, dass ich den Input Capture 
nutzen möchte, dabei aber ja überläufe des Counters stattfinden können.
Beispiel:
ein Event passiert bei Zählerstand 0xE000 (16-Bit Timer Counter des 
ATMega48) und das Nächste bei 0x0100.
Nun es ist also anzunehmen, dass in der Zwischenzeit mindestens ein 
Überlauf stattgefunden hat... nicht gerade hilfreich diese Info.

Zur Lösung würde ich also im Overflow-Interrupt einen Zähler laufen 
lassen, der bei jedem Capture-Event genullt wird. Dann hätte ich eine 
präziese Zeitmessung.
Aber dann habe ich ein neues Problem: der Grenzfall.
ein Capture-Event passiert genau synchron mit dem Overflow. Der 
Capture-Zähler gibt dann vermutlich 0x0000 aus, doch mein 
Overflow-Counter?!
Zählt der jetzt noch eins weiter? oder Zählt er erst nach dem 
Capture-interrupt weiter, was dann die folgende Messung ebenfalls 
verfälschen würde!?


Welche Ansätze gibt es um dieses Problem zu lösen?

Wäre es sinnvoll den Counter bei jedem Capture zu nullen (prescaler ist 
übrigends 256)? Während den ersten 256-Prozessortakten dürfte das ja zu 
keinen Verlustein in der Genauigkeit der Messung führen, oder?


Vielen Dank
MfG
Johannes R.

von ulrich (Gast)


Lesenswert?

Wenn man Input Capture mit Overflows nutzt, kann es bei dem 
beschreibenen fast gleichzeitigen Auftreten passieren, dass der Overflow 
interrupt zu spät ausgeführt wird (zu früh kommt nicht vor). Man kann 
diesen Fall aber in der ISR zum ICP erkennen und korrigieren:
Wenn da noch ein overflow Interrupt aussteht der vor das ICP Event 
gehört, ist das Overflow interrupt-flag gesetzt, und der Zahlen Wert im 
ICP Register ist klein. Bei gesetztem Overflow Flag sind nur sehr kleine 
oder sehr große Werte Möglich, halt maximal die Zeit die ein Interrupt 
blockiert war.

Bei einem Vorteiler von 256 kommt ein Overflow ja nicht besonders häufig 
vor, kaum mehr als 1 mal die Sekunde.

Den Zähler braucht man zum Start nicht zurücksetzen, auch wenn es bei 
einem großen Vorteiler wohl gehen sollte. Es ist einfacher sich die 
Startzeit zu merken und dann abzuziehen.

von Johannes R. (Gast)


Lesenswert?

Danke ulrich,

ulrich schrieb:
> Wenn man Input Capture mit Overflows nutzt, kann es bei dem
> beschreibenen fast gleichzeitigen Auftreten passieren, dass der Overflow
> interrupt zu spät ausgeführt wird (zu früh kommt nicht vor)

Warum? hat der AVR etwa doch irgend eine Interruptpriorisierung?

> Wenn da noch ein overflow Interrupt aussteht der vor das ICP Event
> gehört, ist das Overflow interrupt-flag gesetzt, und der Zahlen Wert im
> ICP Register ist klein.

Das ist natürlich auch richtig. Nur: Wie liest man Interrupt-Flags aus?
löschen tut man sie ja paradoxer weise durch überschreiben mit 1. Wie 
liest man die aus? 0 bedeutet ausstehender Interrupt?

Ganz am Rande gefragt. Bei AVRs wird kein Interrupt einen anderen 
unterbrechen, oder? D.h. der Overflow-Int. kann den ICP-Int nicht 
unterbrechen?!

> Es ist einfacher sich die
> Startzeit zu merken und dann abzuziehen.

Da grübel ich gerade sogar drüber ob das tatsächlich einfacher ist?

von Stefan E. (sternst)


Lesenswert?

Johannes R. schrieb:
> Warum? hat der AVR etwa doch irgend eine Interruptpriorisierung?

Wenn mehrere Interruptflags gesetzt sind, wird der mit der niedrigeren 
Nummer (in der Interrupt-Tabelle) zuerst ausgeführt.

> 0 bedeutet ausstehender Interrupt?

Nein, 1.

> Ganz am Rande gefragt. Bei AVRs wird kein Interrupt einen anderen
> unterbrechen, oder? D.h. der Overflow-Int. kann den ICP-Int nicht
> unterbrechen?!

Nicht solange du es nicht selber explizit erlaubst.

>> Es ist einfacher sich die
>> Startzeit zu merken und dann abzuziehen.
>
> Da grübel ich gerade sogar drüber ob das tatsächlich einfacher ist?

Ist einfacher, funktioniert aber nicht bei mehr als einem Overflow 
dazwischen.

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.