mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitmessung GCC


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

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

Autor: Sonic (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und man müsste nicht raten welchen µC du verwendest

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
OK, hier das ganze Programm. Ich verwende einen Mega16 mit externem
Quarz, Fuses sind alle außer BOOTSZ0 und BOOTSZ1 deaktiviert. Die
Signalquelle ist im Moment ein Funktionsgenerator der Rechtecke mit
80Hz ausgibt.

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.