Inhaltsverzeichnis:

Arduino - Periodischer Interrupt - Gunook
Arduino - Periodischer Interrupt - Gunook

Video: Arduino - Periodischer Interrupt - Gunook

Video: Arduino - Periodischer Interrupt - Gunook
Video: Feuchtesensor Sensirion SHT31 und SHT35 (Eigenschaften und Ansteuerung mit Hilfe eines Arduinos) 2024, Juli
Anonim
Arduino - Periodische Unterbrechung
Arduino - Periodische Unterbrechung

In diesem Instructable geht es um die Verwendung eines periodischen Interrupts für das Timing in Arduino-Programmen. Dies ist ein Schritt für einen angehenden Arduino-Programmierer, der weiß, dass der Arduino mehr kann, aber nicht genau weiß, wie er das erreichen soll.

Wenn es ein Leistungsproblem gibt, gehe ich davon aus, dass Sie eine oder mehrere delay()-Funktionen verwenden. Der Trick besteht darin, die delay()-Funktion(en) loszuwerden und einen Interrupt zu ersetzen. Die Funktion delay () zwingt den Arduino, nichts zu tun, während er auf den Abschluss von delay () wartet. Wenn Sie einen Interrupt verwenden, kann Ihr Programm andere Dinge tun, während es auf das Ende der Verzögerung wartet. Normalerweise gibt es eine große Menge ungenutzter Totzeit, die bei Verwendung von delay() für andere Dinge verwendet werden könnte. Die Verwendung eines Interrupts löst dieses Problem.

Schritt 1: Interrupt-Handler

1. Fügen Sie Ihrem Programm den Interrupt-Handler hinzu. Einfach kopieren und irgendwo über setup() einfügen;

const unsigned long TIMER0_COUNT = 500; // 500 ms Timer-Intervall

// TIMER0 Interrupt-Handler volatile bool time = false; ISR (TIMER0_COMPA_vect) { statischer unsigned long count = 0; if (++count > TIMER0_COUNT) {count = 0; Zeit = wahr; // die Zeit wird alle TIMER0_COUNT ms auf true gesetzt } // (die Zeit muss in der Hauptroutine gelöscht werden) }

Schritt 2: Periodisches Zeitintervall einstellen

2. Stellen Sie das Zeitintervall ein. Diese Routine setzt sich huckepack auf den TIMER0-Interrupt, der so eingestellt ist, dass er alle ~1 ms ausgelöst wird.

Ihr "Intervall" ist die Anzahl der zu verarbeitenden TIMER0-Interrupts. Jedes Intervall beträgt ~1 ms, Sie legen also wirklich fest, wie viele TIMER0-Interrupts gezählt werden sollen, bevor Ihr Intervall aktiviert wird. IOW, setzen Sie die Variable TIMER0_COUNT auf die Anzahl der Millisekunden, die Sie warten möchten. Verwenden Sie beispielsweise 500 für eine halbe Sekunde. Verwenden Sie 3000 für 3 Sekunden.

Schritt 3: Initialisierung unterbrechen

3. Fügen Sie Ihrer setup()-Methode den Code "TIMER0-Initialisierung" hinzu. Auch hier einfach kopieren und in setup() einfügen.

// *** TIMER0-Initialisierung ***

cli(); // alle Interrupts ausschalten TIMSK0 = 0; // Timer0 für niedrigeren Jitter ausschalten OCR0A = 0xBB; // beliebige Interrupt-Zählung TIMSK0 |= _BV (OCIE0A); // Huckepack auf Interrupt sei(); // Interrupts wieder einschalten

Schritt 4: Wo Sie Ihren Code hinzufügen

4. Fügen Sie Ihrer loop()-Methode den Code "time check" hinzu. Kopieren und einfügen in loop().

wenn (Zeit) {

Zeit = falsch; // hier etwas tun }

Die "Zeit = falsch;" Linie ist wichtig. Ohne diese Zeile würde(n) die Zeile(n) "hier etwas tun" jedes Mal ausgeführt, wenn das Programm loop() ausführt.

Selbstverständlich ersetzen Sie Ihre eigenen Aktivitäten in der Zeile "Hier etwas tun". Beginnen Sie mit dem Drucken von Text oder dem Blinken der LED.

Sie sind fertig!

Empfohlen: