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
@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
>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.
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
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
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.
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)
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++; }
Klar, aber so ein Interrupt kann verschütt gehen. Interrupts zählen tut er ja wohl schon.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.