mikrocontroller.net

Forum: Compiler & IDEs Problem mit ATMega als Frequenzzähler


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche schon seit langem einen Frequenzzähler mit meinem ATmega 
hinzubekommen. Ich habe dazu einen definierten Rechteckimpuls von 
1,5KHz. Diesen möchte ich messen. Dazu habe ich den angehängten Code 
geschrieben. Leider bekomme ich über die UART nicht die Frequenz 
ausgegeben, die ich erwarte. Ich habe langsam keine Ahnung mehr was ich 
machen soll. Vielleicht könnt ihr mir helfen und mir einen Tipp geben, 
wo das Problem liegen könnte. Als Hardware benutze ich die RN-Control 
1.4 von roboternetz. Das Rechtecksignal speise ich an ICP ein.

Vielen Dank für eure Hilfe

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils wrote:

> Dazu habe ich den angehängten Code
> geschrieben.

Kannst Du den mal kommentieren?
Dann kann man sagen, wo der Knoten in Deinen Gedanken ist.
Es ist nämlich interessant, wie Du diesen merkwürdigen Algorithmus 
ausgetüftelt hast. Insbesondere warum nur A[10] /10 geteilt wird.

Es sind ne Menge Knoten in dem Code, schmeiß ihn besser weg und fang neu 
an.

Lies Dir auch mal die Beschreibung der Capturefunktion im Datenblatt 
durch.

Das Capture gibt Dir nur den Timestamp der Flanke, nicht aber die 
Differenz zur letzten Flanke, die mußt Du selber ausrechnen.

Wenn man gültige Werte haben will, sollte man daher erstmal bis zu einer 
Flanke warten.

Wenn zwischen 2 Flanken 2 Timerüberläufe eintreten, wirds etwas tricky.

Unter C brauchen long-Konstanten immer ein L.

Zumindest der AVR-GCC kennt die Timer 16bittig.
* 255 brauchst Du dann nicht, ist ja auch völlig falsch.


Peter

Autor: Dr. Rat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Insbesondere warum nur A[10] /10 geteilt wird.

Jaja, wieder mal die einfache Punkt vor Strichrechnung ...

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antworten.

ja die einfache Punkt vor Strich Rechnung habe ich schon berücksichtigt. 
Ich habe A[10] nachträglich noch hinten dran gehängt und vergessen die 
letzte Klammer auch zu versetzen. Kleiner Tippfehler mit großer Wirkung. 
Habe ich echt überlesen.

Es ist schon richtig, das mir die Capture Funktion nur den aktuellen 
Zählerstand gibt und nicht die Differenz zwischen den beiden Flanken. 
Aber ich habe das so verstanden, dass wenn ich die beiden Register 
auslese der Capture Stand auf null zurückgesetzt wird. Da ich mit null 
keine Differenz bilden brauch habe ich den die Taktzyklen im Wert des 
Capture Registers die zwischen zwei Flanken vergangen sind und somit 
auch die Frequenz.

Ein Überlauf des Capture Registers kann bei 1,5KHz Messfrequenz nicht 
passieren.

Ich werde heute Abend mal die Klammer verschieben und mir dann das 
Ergebnis anschauen ob es dann funktioniert.

Gruss
Nils

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

Bewertung
0 lesenswert
nicht lesenswert
Und gewöhn dich besser daran, dass in C bei 0 zu zählen angefangen
wird. So wie es zur Zeit aussieht wird A[0] zwar gemessen aber
niemals ausgewertet.
Auf der anderen Seite wird A[10] zwar in deiner Berechnung
berücksichtigt aber niemals beschrieben. Nur Gott alleine
weiss welcher Wert da beim Hochfahren des Programmes drinnen
steht.

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

Bewertung
0 lesenswert
nicht lesenswert
Nils wrote:

> Es ist schon richtig, das mir die Capture Funktion nur den aktuellen
> Zählerstand gibt und nicht die Differenz zwischen den beiden Flanken.
> Aber ich habe das so verstanden, dass wenn ich die beiden Register
> auslese der Capture Stand auf null zurückgesetzt wird.

Datenblatt lesen!
Warum sollte der Timer da auf 0 zurückgesetzt werden?

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.