www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitmessproblem


Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

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

Autor: Reinhard B. (brainstorm)
Datum:

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

Autor: Uwe (Gast)
Datum:

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

MFG Uwe

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.