Zeitmessung GCC

Gast #401531
Lesenswert?
• ▲
▼
Hallo,

ich versuche gerade die Zeit zwischen 2 Impulsen zu messen. Leider
messe ich fast Zufällige Werte, weshalb wohl irgendwo ein größerer
Fehler sein muss. Ich habe den entsprechenden Programmteil angehängt.
Die Messung starte ich indem ich mit "GICR |= (1<<INT0);" den Int0
aktiviere.
Vieleicht kann mir jemand weiterhelfen und weiß wo der Fehler liegt.


Vielen Dank schon mal
Angehängte Dateien:
Gast #401532
Lesenswert?
• ▲
▼
Vielleicht ist der Interrupt schon ausgelöst bevor Du ihn freigibst.
Durch '1' schreiben ins entsprechendes Flag-Register kannst Du das
INT0-Flag vor der Freigabe rücksetzen (siehe Datenblatt).
die TCCRB-Anweisungen würde ich immer als erstes in die Abfrage stellen
um evtl Laufzeitunterschiede bein Starten und beim Stoppen zu vermeiden.
Gast #401533
Lesenswert?
• ▲
▼
> ich versuche gerade die Zeit zwischen 2 Impulsen zu messen. Leider
> messe ich fast Zufällige Werte, weshalb wohl irgendwo ein größerer
> Fehler sein muss.

Oder du hast tatsächlich "fast Zufällige" Impulse. Ein anderer Grund
könnte sein, daß Impulse reinkommen, während du noch darauf wartest,
daß die serielle Schnittstelle endlich bereit ist, die Daten
anzunehmen. Dann wird die Interrupt-Routine für den nächsten (oder
sonst einen späteren) Impuls verzögert ausgeführt.
Wichtige Regel: Warteschleifen in Interrupt-Routinen sind PFUI!
Gast #401534
Lesenswert?
• ▲
▼
Was ich noch vergessen habe:
Das cli() und sei() ist überflüssig. Ein sei() kann sogar schädlich
sein, denn es bedeutet, daß die Interrupt-Routine sich selbst
unterbrechen und einen Stacküberlauf produzieren kann.
Gast #401535
Lesenswert?
• ▲
▼
Hallo,

danke für eure Hilfe. Leider funktioniert es noch nicht ganz. Der
Hinweis mit dem INT0 Flag war auf jeden Fall richtig. Das habe ich
behoben, indem ich die Messung mittels
GIFR |= (1<<INTF0);
GICR |= (1<<INT0);
aktiviere. Die Wartescheleifen habe ich auch auf der ISR genommen,
indem ich die Werte einfach mal in 2 globalen Variablen ablege. Jetzt
erhalte ich auch bei jeder 2. bis 5. Messung genau den richtigen Wert.
Daher wollte ich wissen ob ich vieleich den Interrupt oder den Timer
falsch initialisiert habe? Ich möchte auf steigende Flanken an INT0
triggern und eine Prescaler von 1024 verwenden.
Ich habe euch dei entsprechenden Teile wieder angehängt und hoffe
nochnal auf eure Hilfe.
Angehängte Dateien:
#401536
Lesenswert?
• ▲
▼
> Ich habe euch dei entsprechenden Teile

Poste bitte nicht die entsprechenden Teile, sondern poste dein
Program.

In dem geposteten entsprechenden Teil' wird weder das Interrupt
Flag INTF0 gelöscht, noch der spezielle INT0 aktiviert noch
Interrupts generell eingeschaltet.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.