AVR: Probleme mit hoher Frequenz am ICP1

Gast #2827456
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?
Gast #2827496
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).
#2827506
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.