Arduino Uno 1MHz Eingangssignal messen

Hallo Community,
ich möchte mit dem Arduino Uno ein Rechtecksignal von 1MHz einlesen, dazu habe ich direkt die Interrupts vom Atmega328P verwendet, jedoch ist bei ca. 260kHz Schluss, darüber bleibt es hängen und gibt erst wieder einen Wert über den Serial aus wenn man kleiner 260kHz kommt. Zur Messung, es werden die Flanken innerhalb einer bestimmten Zeit gezählt. Ist es überhaupt möglich ohne externe Hardware ein Signal mit 1MHz einzulesen bzw. wo liegen die Grenzen?

MfG
manuue

Capture_1MHz.ino (526 Bytes)

Was willst Du messen? Die Frequenz? oder die Anzahl der Impulse oder das Tastverhältnis?

Grüße Uwe

Hallo,

wenn ich mich mal melden darf, laut Code möchte er die Flanken zählen.

"kein Prescaler" ... knapp daneben, du hast genau den Prescaler 1 eingestellt :wink:

und dann sind hier viele Fehler drin, wovon du manche nicht erkennen kannst als Neuling.
Der Arduino nutzt standardmäßig verschiedene Timer und die sind laut meines Wissens immer vorkonfiguriert aber noch nicht aktiv, hängt von analogWrite ab. Das bedeutet, du mußt immer erstmal alle Register des Timers nullen/reseten für eigene Verwendung. Danach kannste die wie gewünscht neu konfigurieren.

Desweiteren sind Interrupt bedingte Dinge wie serielle Ausgaben innerhalb einer anderen Interrupt Service Routine verboten!

Und dann ist da noch die Sache mit der globalen Variablennutzung innerhalb einer ISR. Diese globale Variable muß volatile sein. Beim Zugriff außerhalb einer ISR auf eine von der ISR veränderbare Variablen, so muss auf diese mit atomic Schutz zugegriffen werden.

Wie jurs schon schreibt, ist die eigene Zählung in der ISR hier nicht notwendig und sogar schädlich. Denn das zählen der Flanken macht ein Timerregister für dich. Du kennst die Timergeschwindigkeit und du kannst bei Overflow den Flankenzählerstand auslesen. Der Rest ist umrechnen.

Du merkst schon, du hast hier in ein Wespennest gestochen. Mit Fleiß und ohne wildes um sich schlagen kommt man da aber raus. :slight_smile:

Mit dieser Library sind an Pin 5 wohl bis zu 8MHz möglich.

Einfach mal ausprobieren.

Gruß Peter

Vielen Dank für die vielen Antworten!!! Es hat schon geklappt, danke @jurs ich habe einfach von meinem icp1 auf T1 gewechselt und schon gings!

Frequenzen bis Systemtakt/2,5 sind möglich, also knapp über 6MHz.

MfG
manuue

Hallo,

eine Anmerkung noch, halte ich für wichtig. Wenn du den Code vom Aufbau her so beibehälst, dann stimmt deine Messung vorne und hinten nicht und irgendwann knallt es im Karton. Dann kommen irgendwann unerklärliche Effekte zum Vorschein. Beschäftige dich bitte mit Timerfunktionen und Interrupts im allgemeinen.