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 :-)
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
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.
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.
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
genau das geht ja beim AVR nicht, zumindest nicht so einfach. Und es laufen noch ne Menge andere Interrupts (CAN, RS232, Timer).
Hi, kannste nicht bei ext.Int das OVR-Bit abtasten?, wenn gesetzt Zähler +1 MFG Uwe
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.