Zeitmessproblem

Gast #424579
Lesenswert?

heute steh ich mal auf dem Schlauch. Kann eigentlich nicht so schwer 
sein, aber mir fällt nichts passendes ein.
Es sollen 4 Kanäle gemessen werden, je an einem Interrupteingang. 
Gemessen wird mit dem Timer3, ext. Takt 312,5kHz.
Timer3 läuft durch, jede ex_int-Routine holt sich den aktuellen 
Zählerstand, subtrahiert davon den letzten, fertig. Funktioniert ja auch 
bestens. Der Messbereich geht dementsprechend bis 209,xx ms. Wird das 
Signal noch langsamer, soll als Ergebnis immer 0xffff geliefert werden. 
Es dürfen keinesfalls falsche Werte geliefert werden (doppelter Überlauf 
des TCNT3). Alle 4 Signale sind völlig asynchron.  Also nur einen 
Denkanstoss bitte :-)
Gast #424587
Lesenswert?

Ein Zähler (pro extINT), der bis 2 zählt.
Ist er gleich 2 war das Signal zu lange unterwegs.
Alle Zähler werden bei jedem Timer-Überlauf inkrementiert und bei 
Auftreten eines EXTINT zurückgesetzt.
Problem: EXTINT tritt um den Überlaufspunkt auf.
Gast #424598
Lesenswert?

ja, in die Richtung hatte ich auch schon gedacht - dabei ergibt sich 
aber ein dummes Dilemma: tritt ein ext. Int auf, kann es sein, ab 
Einsprung in die ISR der Timer3 überläuft, also auf 0 oder schon 1 
steht, die Zählererweiterung aber noch nicht incrementiert wurde -> 
alles falsch.
Etwas zeitkritisch ist das ganze auch, im schlimmsten Fall kommen 
4x32kHz rein. Und ein wenig Zeit brauch ich auch noch für diverse andere 
Sachen. Ich muss nur schnell und zuverlässig feststellen können, dass es 
ausserhalb des Messbereichs liegt. Und noch ne Kleinigkeit: das Signal 
kann auch auf Null gehen, auch dann muss 0xffff geliefert werden.
Gast #424787
Lesenswert?

Wieso lässt du mit dem Timer3 nicht einen (z.B.) ms-Zähler laufen (OCRx, 
CTC-Mode)? Den kannst du jederzeit auslesen und bei einem bestimmten 
Zählerstand auf 0xFFFF setzen. Die anderen INTs müssen natürlich nach 
Priorität benutzt werden.
Gast #425594
Lesenswert?

ok, besten Dank, besonders @Uwe, funktioniert.
In der Timer3-OV-ISR einen 16bit-Zähler laufen lassen, per union in der 
EX-ISR zu einer long-Zahl zusammengesetzt, falls TOV3 gesetzt den H-Teil 
incrementiert, mit long die Differenz gebildet, auf 0xffff begrenzt und 
ab damit. Geht auch alles schnell genug.

Manchmal hat man wirklich eine Blockade :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren