Forum: Mikrocontroller und Digitale Elektronik Abtastfrequenz der Flankenerkennung ATMEGA32


von Peter Q. (q-ware)


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

von Falk B. (falk)


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

von Gast (Gast)


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.

von Peter Q. (q-ware)


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

von Rolf (Gast)


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

von Andreas K. (a-k)


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.

von Gast (Gast)


Lesenswert?

Schau Dir mal die Pins T0 und T1 an.

von Kai W. (kai-w)


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)

von Gast (Gast)


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++;
}

von Andreas K. (a-k)


Lesenswert?

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

von Peter Q. (q-ware)


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

von Gast (Gast)


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.

von Andreas K. (a-k)


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.

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.