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
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
>Insbesondere warum nur A[10] /10 geteilt wird.
Jaja, wieder mal die einfache Punkt vor Strichrechnung ...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.