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


von Nils (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


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

von Dr. Rat (Gast)


Lesenswert?

>Insbesondere warum nur A[10] /10 geteilt wird.

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

von Nils (Gast)


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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.