Forum: Mikrocontroller und Digitale Elektronik Zeitmessproblem


von crazy horse (Gast)


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 :-)

von Reinhard B. (brainstorm)


Lesenswert?

Hallo!

Ich würde beim Timer-Überlauf für jedes Signal eine Zähler-Varibale 
hochzählen, so kannst du doppelte Überlaufe feststellen und falls Bedarf 
besteht auch noch den Messbereich erweitern. Ich hoffe, ich schreibe 
jetzt nicht am Problem vorbei :-)

mfg
Reinhard

von inoffizieller WM-Rahul (Gast)


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.

von crazy horse (Gast)


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.

von Reinhard B. (brainstorm)


Lesenswert?

Wenn die Timer-ISR die höhere Priorität hat, dann ist das Inkrementieren 
der Zähler und der Überlauf selbst nicht trennbar. Sollte doch so 
passen. Oder hab ich nen Denkstau? gg

von crazy horse (Gast)


Lesenswert?

genau das geht ja beim AVR nicht, zumindest nicht so einfach. Und es 
laufen noch ne Menge andere Interrupts (CAN, RS232, Timer).

von Reinhard B. (brainstorm)


Lesenswert?

Huch, sorry, das wusste ich nicht. Bin nur auf 8051ern und XC16x 
unterwegs :-)

von Uwe (Gast)


Lesenswert?

Hi,
kannste nicht bei ext.Int das OVR-Bit abtasten?, wenn gesetzt Zähler +1

MFG Uwe

von Sonic (Gast)


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.

von crazy horse (Gast)


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 :-)

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.