Guten Tag alle miteinander. Folgendes Szenario: - Am ICP1 liegt eine bestimmte extern gesteuerte Frequenz an. - TIMER1_CAPT_vect wird bei jeder einkommenden Flanke ausgelöst und zählt jedes Mal einen Counter hoch. - Der zweite Timer löst nach einer gewissen Zeit TIMER2_COMPA_vect aus, Interrupts werden dann kurz blockiert, mit dem Counter-Wert Berechnungen gemacht und auf einem angeschlossenen LCD-Display angezeigt. Zunächst will ich mir nur die Frequenz anzeigen lassen, die am ICP1 anliegt. Da ich diese mit einem Frequenzgenerator erzeuge, habe ich einen genauen Vergleichswert. Jetzt kommt mein Problem: Bis ca. 25 kHz funktioniert alles wie gewünscht, alles darüber aber nicht mehr, da TIMER1_CAPT_vect beim Hochzählen des Counters anscheinend schlichtweg nicht mehr hinterherkommt... Ich müsste aber in der Lage sein, Frequenzen bis 100 kHz messen zu können. Ich benutze einen Atmega168 und habe den Code in C gecchrieben (mit Ateml Studio 6). Hat jemand generell eine Idee, wie ich das Problem lösen könnte? Assembler (was ich leider nicht sonderlich gut kann) statt C? Anderen Chip?
Rein für die Frequenzmessung reicht es nur bei je einer Flanke den ICP zu triggern - das ist ohnehin der einfachere Fall. Auch mit 20 MHz Quarz Takt wird es rein in C wird es vermutlich schon sehr knapp die 100 kHz zu erreichen, wenn man auf beide Flanken triggert. Mit nur einer Flanke sollte es noch gehen, wenn der Code passt für ein kurze Laufzeit. Wie sieht denn der C-Code für die ISR aus ? Wenn es nur bis 25 kHz geht, ist da vermutlich noch was drin, dass zu einer unnötig langen Laufzeit führt. ASM geht natürlich. Das würde dann wohl auf eine ISR ganz in ASM hinauslaufen. Immerhin spart man sich so die etwas umständliche und nicht ganz einfache Syntax für Inline-ASM. Der Rest könnte noch als C Code bleiben (bis ca. 500 kHz).
siralos schrieb: > Folgendes Szenario: > > - Am ICP1 liegt eine bestimmte extern gesteuerte Frequenz an. > - TIMER1_CAPT_vect wird bei jeder einkommenden Flanke ausgelöst und > zählt jedes Mal einen Counter hoch. > - Der zweite Timer löst nach einer gewissen Zeit TIMER2_COMPA_vect aus, > Interrupts werden dann kurz blockiert, mit dem Counter-Wert Berechnungen > gemacht und auf einem angeschlossenen LCD-Display angezeigt. Und warum überhaupt Capturing für dieses Szenario? Füttere den Timer mit deinem Signal als externen Takt, und das Ganze funktioniert bis CPU_Takt/2.
Okay, klingt auch nach einer plausiblen Möglichkeit. Ich bin in der Hinsicht leider noch absoluter Anfänger, werde mich jetzt aber nochmal durchs Datenblatt kämpfen um zu verstehen wie das damit geht...
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.