www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Abtastfrequenz der Flankenerkennung ATMEGA32


Autor: Peter Q. (q-ware)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich möchte die steigenden Flanken eines Rechtecksignals zählen. Bei
kleinen Frequenzen funktioniert das soweit auch ganz gut.
Die Messung mache ich über den externen Interrupt INT0.

Nur bei höheren Frequenzen (ich müsste bis knapp 3 kHz messen) gehen 
Flanken verloren. Im Handbuch (und im Forum) habe ich nichts zur 
Grenzfrequenz des ATMEGA32 bei der Flankenerkennung gefunden. Der Takt 
wird über einen 16 MHz Quarz generiert.

MfG

Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Q. (q-ware)

>ich möchte die steigenden Flanken eines Rechtecksignals zählen. Bei
>kleinen Frequenzen funktioniert das soweit auch ganz gut.
>Die Messung mache ich über den externen Interrupt INT0.

Kann man machen, bei 3 kHz ist aber die Nutzung eines Timers sinnvoller.

>Nur bei höheren Frequenzen (ich müsste bis knapp 3 kHz messen) gehen
>Flanken verloren. Im Handbuch (und im Forum) habe ich nichts zur
>Grenzfrequenz des ATMEGA32 bei der Flankenerkennung gefunden. Der Takt

Es ist der Prozessortakt, heir also 16 MHz. Ein Puls muss mind. 2 Takte 
breit sein, um sicher erkannt zu werden.

MFG
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur bei höheren Frequenzen (ich müsste bis knapp 3 kHz messen) gehen
>Flanken verloren.

30-40kHz sollten ohne Probleme gezählt werden können.

Autor: Peter Q. (q-ware)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Erstmal vielen Dank für die schnelle Antwort!!!

Falk Brunner wrote:
>>ich möchte die steigenden Flanken eines Rechtecksignals zählen. Bei
>>kleinen Frequenzen funktioniert das soweit auch ganz gut.
>>Die Messung mache ich über den externen Interrupt INT0.
>
> Kann man machen, bei 3 kHz ist aber die Nutzung eines Timers sinnvoller.

Wie wird das dann gemacht? Mir würde da nur permanentes Abfragen des Pin 
Zustands einfallen, was ja eher den µC blockieren würde oder?

>>Nur bei höheren Frequenzen (ich müsste bis knapp 3 kHz messen) gehen
>>Flanken verloren. Im Handbuch (und im Forum) habe ich nichts zur
>>Grenzfrequenz des ATMEGA32 bei der Flankenerkennung gefunden. Der Takt
>
> Es ist der Prozessortakt, heir also 16 MHz. Ein Puls muss mind. 2 Takte
> breit sein, um sicher erkannt zu werden.

Also sollte ich hier ja mit etwas über 300µs Pulslänge locker drüber 
liegen?!

MfG

Peter

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
die Frage ist auch, was du in der ISR des INT0 machst.
Wenn dort nur ein einziges Print auftaucht, wirst du die 3 KHz schon 
vergessen können.

Gruß

Rolf

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Q. wrote:

> Wie wird das dann gemacht? Mir würde da nur permanentes Abfragen des Pin
> Zustands einfallen, was ja eher den µC blockieren würde oder?

Mindestens einen der Timer kann man so konfigurieren, dass er an Stelle 
des internen Taktes einen externen Takt verwendet. Also externe Takte 
zählt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal die Pins T0 und T1 an.

Autor: Kai W. (kai-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Q. wrote:

>> Kann man machen, bei 3 kHz ist aber die Nutzung eines Timers sinnvoller.
>
> Wie wird das dann gemacht? Mir würde da nur permanentes Abfragen des Pin
> Zustands einfallen, was ja eher den µC blockieren würde oder?
>

Du kannst dafür einen Timer im CTC Modus benutzen, der z.B. alle 100us 
einen Interrupt auslöst. In dem Interrupt fragst Du den Pin ab und setzt 
bei Bedarf den Zähler für die Anzahl der Flanken hoch.
Das ganze "blockiert" den uC alle 1600 Takte für die paar Takte, die die 
Abfrageroutine braucht
(ich hoffe ich hab' die Zeiten jetzt richtig ausgerechnet ;) aber das 
Prinzip sollte trotzdem stimmen)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
T0, T1, CTC, ...
Womöglich noch einen externen Zählerbaustein? Sitzt Ihr auf ABM-Stellen?

Beim Mega32 läßt sich der INT0-Interrupt problemlos auf pos. 
Flankentriggerung einstellen. Die Interruptroutine besteht dann im 
einfachsten Falle aus:

volatile unsigned long timer;

...

void int0_interrupt()  // zusätzlich Compilerzusatz: signal, Vektor, ...
{
  timer++;
}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, aber so ein Interrupt kann verschütt gehen. Interrupts zählen tut 
er ja wohl schon.

Autor: Peter Q. (q-ware)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Also erstmal VIELEN VIELEN DANK euch allen für die schnellen Antworten.

Hatte jetzt mal die Chance mit dem Oszi das Signal anzusehen das ich 
reingebe. Der Fehler kommt nicht vom Atmega sondern das Signal hat bei 
höheren Frequenzen Lücken. Wo keine Flanke ist, kann er natürlich auch 
keine zählen. ;-)

Nochmals danke!

MfG

Peter

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas, Du enttäuschst mich jetzt aber ;-)

Bei 16MHz sind 100kHz an INT0 bei sorgfältiger Programmierung in 
C(verlustfrei) zählbar. Die von mir erwähnten 30-40kHz werden auch 
erreicht, wenn durch ungeschickte Programmierung der komplette 
Registersatz des Prozessors gerettet werden muß.
Die geforderten 3kHz sind garkein Problem, sofern man nicht - wie 
geschrieben - printf() in die (oder andere) Interruptroutine(n) einbaut 
oder irgendwelche Funktionen verwendet, die einem while(1); sehr nahe 
kommen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:

> Die geforderten 3kHz sind garkein Problem,

Weiss ich.

> sofern man nicht

Eben. Mit dem Timer verpasst man garantiert nichts, egal wie der Rest 
vom Programm aussieht.

Aber das hat sich ja jetzt erledigt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.