Abtastfrequenz der Flankenerkennung ATMEGA32

OP #934524
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
#934543
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
OP #934548
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
#934574
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.
#934586
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)
Gast #934641
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++;
}
OP #934708
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
Gast #934719
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren