Forum: Mikrocontroller und Digitale Elektronik AVR: Probleme mit hoher Frequenz am ICP1


von siralos (Gast)


Lesenswert?

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?

von Slowhand (Gast)


Lesenswert?

Was hast denn für einen Quarz dranhängen?

von Ulrich (Gast)


Lesenswert?

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).

von Stefan E. (sternst)


Lesenswert?

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.

von J. I. (siralos)


Lesenswert?

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
Noch kein Account? Hier anmelden.