www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Frequenzzähler


Autor: Daniel Schillinger (enton)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Ich wollte mir nen Frequenzzähler machen.
Aber in der Routine ist irgendwo der Wurm drin. Ich hab aber keine 
Ahnung warum( Routine im Anhang).

Anstatt das eine konstante Frequenz auf dem Display ausgegeben wird, 
beginnt es bei ca. 500 und zählt dann runter bis auf 0. Dort bleibt es 
dann stehen.

Wenn ich in der Frequenzberechnung uint64_t durch uint32_t ersetzte, 
zählt es von ca. 500 auf ca. 20 und fängt dann wieder von neuem an.
(Schätze das der Fehler irgendwo in der Berechnung liegt.)

Ich hab schon alles mögliche probiert, kann aber nirgends nen Fehler 
erkennen.
Wäre euch sehr dankbar, wenn ihr mir weiterhelfen könntet.

Falls jemand zufällig schon ne fertige Routine zur Frequenzmessung hat 
wäre auch nicht schlecht, falls sich der Fehler nicht beheben lässt.

Gruß Enton

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

Bewertung
0 lesenswert
nicht lesenswert
Ich kann nirgends sehen, wo du deine 'Stoppuhr' nach einer
Messung wieder auf 0 zurückstellst.

PS: Du treibst zwar ne Menge Aufwand um da möglichst auf einen
Takt genau zu messen, versaust dir das aber alles unter Umständen
damit, dass in deiner INT1 ISR viel zu viel passiert.

Während deine ISR mit der Auswertung und der Ausgabe auf das LCD
beschäftigt ist, kann ein weiterer Input Puls kommen. Der muss
warten, bis die ISR fertig ist und triggert dir dann sofort
wieder den nächsten Interrupt.

-> zumindest am Ende der INT1-ISR einen möglichen INT1 Interrupt
Flag löschen.

Autor: Daniel Schillinger (enton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre es geschickter die Ausgabe in die main Routine zu packen?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Schillinger wrote:
> Wäre es geschickter die Ausgabe in die main Routine zu packen?

Auf jeden Fall.

Und dann wärs natürlich noch sinnvoll, dein Signal nicht an den INT-Pin 
zu geben sondern an den Externen Clock-Eingang vom Timer0 oder Timer1 
(T0 oder T1-Pin). Dann kommt dein Interrupt (der TimerOverflow) nämlich 
nur einmal alle 256 (oder 65536) Takte, und du kannst wesentlich höhere 
Frequenzen genau auszählen.

Autor: Daniel Schillinger (enton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und dann wärs natürlich noch sinnvoll, dein Signal nicht an den INT-Pin
> zu geben sondern an den Externen Clock-Eingang vom Timer0 oder Timer1
> (T0 oder T1-Pin). Dann kommt dein Interrupt (der TimerOverflow) nämlich
> nur einmal alle 256 (oder 65536) Takte, und du kannst wesentlich höhere
> Frequenzen genau auszählen.

Sehe ich das richtig?
Ich zähle mit dem Timer1 meine Zeit und mit dem Timer0 zähle ich meine 
positiven Flanken des Signals. Sobald der Timer0 dann nen Overflow hat, 
lese ich die Zeit aus, die der Timer 1 gezählt hat und berechne daraus 
meine Frequenz?

Noch ne kurze Frage zur Interruptflag:
Ich wollte die Interruptflag bei INT1 löschen(in der INT1 ISR):
INTF1=0;
Dann bekomm ich aber folgende Fehlermeldung:
main.c:82: error: invalid lvalue in assignment

Was mach ich da falsch?

Gruß Enton

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.