Wie kann ich einen Takt von 50kHz mit dem Arduino Mega2560 erzeugen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Genau geht das nur per Timer.

Wenn der Timer überläuft, entsteht ein Interrupt und das normale Programm wird unterbrochen und eine ISR (Interrupt Service Routine) gestartet. Die muss möglichst schnell ablaufen und darf keine Variablen beschrieben die das normale Programm auch beschreiben kann. Sonst könnte sich das beschreiben überschneiden bzw. die ISR noch laufen bevor die wieder aufgerufen wird.

Das Arduino System hat einen Timer laufen um in Hintergrund bestimmte Aufgaben zu erledingen, z.B. eine Echtzeituhr. Da könnte man sich rein klinken was aber gefährlich ist da man leicht das Timing des Arduino Systems versauen kann.

Aber die meisten µC haben zwei oder mehr Timer, das Arduino System braucht nur einen (Timer 0). Timer 1 und ggf weitere Timer stehen Dir also frei zur Verfügung.

Wie Du einen Timer verwendest kannst Du hier lesen:

https://laagewitt.de/wp-content/uploads/2021/03/Arduino-Kurs-Timer-und-Interrupts.pdf

Woher ich das weiß:Berufserfahrung
Commodore64  06.11.2023, 11:01

P.S.:

Der Datentyp "volatile" ist bei Interrupts immens wichtig!

Das besagt, dass der Inhalt der Variable jederzeit geändert werden kann. Verrbeitet man eine Variable wird oft eine Kopie in den CPU Registern gehalten bzw. eine Hilfsvariable benutzt und so werden veränderungen nicht bemerkt. Definiert man die Variable als "Volatile" wird die immer frisch aus dem RAM geladen für den Fall, dass eine ISR da was geändert hat. Das macht die Sache zwar deutlich langsamer, aber nur so hat man immer die aktuellen Werte im programmablauf.

1
ALAPHA 
Fragesteller
 10.11.2023, 20:19

Perfekte Antwort, mehr gibt es nicht zu sagen 👍. Vielen Dank!

0
Commodore64  11.11.2023, 12:58
@ALAPHA

Zu sagen gäbe es noch tausende Dinge wo eine ISR immense Vorteile hat.

Drehencoder z.B. lassen sich so wunderbar stotterfrei abfragen. Man kann eine ISR ja per Änderung eines Portpins auslösen. Die ISR macht dann einfach INC/DEC einer Variable und so kann das Hauptprogramm immer die Stellung des Drehknopfes sehen.

Und alles, was blinkt kann man per ISR schön gleichmäßig toggeln. Auch Displayausgaben bzw. Aktualisierungen lassen sich so wunderbar machen. Hier dann immer nur einen kleinen Teil auf einmal behandeln damit das normale Programm geschmeidig läuft.

Man kann eine ISR per "switch case" in verschiedene Aufgaben unterteilen so dass immer nur eine pro Aufruf gemacht wird. Dazu dann eine Variable inkrementieren pro Aufruf und per Switch-Case dann die Aktion auslösen. So hat man dann zwei Probleme gelöst. Zum einen dass jede Aufgabe nicht zu oft pro Sekunde aufgerufen wird (Timer Wertebereich ist ja begrenzt) und zum anderen kann man die Einzelaufgaben winzig halten so dass das Hauptprogramm nicht "humpelt" oder gar keine Zeit mehr hat irgendwas größeres zu tun.

1
Commodore64  11.11.2023, 13:08
@ALAPHA

Oh, und Taster abfragen per ISR ist extrem nützlich.

Die ISR misst dann die Zeit wie lange der Taster gedrückt wurde in Zehntelsekunden. Im programm kann man dann einfach fragen ob da was drin steht, also ist der überhaupt gedrückt oder man fragt ob der Wert eine bestimmte Größe überschritten hat und so kann man dann z.B. 1 Sekunde drücken leicht erkennen. Dazu ist der Taster dann auch automatisch entprellt.

Das erleichtert das abfragen von Tastern immens und man kann dann viel leichter 1-button abfragen machen, also kurz, lang und sehr lang unterscheiden und verschieden drauf reagieren.

1
Commodore64  17.11.2023, 22:27

Brauchst Du noch mehr Tipps für ISR Programmierung?

0