Wir unterbrechen dieses Programm Ihnen ein Arduino-Interrupt-Tutorial zu bringen

Wir unterbrechen dieses Programm Ihnen ein Arduino-Interrupt-Tutorial zu bringen

Ah ja ... die wunderbare und oft falsch verstandene Welt der Mikrocontroller unterbricht. Suchen Sie ein Projekt erstellen, die auf eine sehr genaue Timing beruht oder schnell reagieren muss mit einem Eingang? Dann ändern sich nicht, diesen Kanal, mein Freund. In diesem Tutorial werden wir abdecken, welche Interrupts sind, was sie tun und wie sie zu benutzen.






Was ist ein Interrupt?

ISR? Signale? Was ist all dieser Unsinn?

Wenn Sie in die Welt der Software-Entwicklung neu sind, könnte sich fragen, warum all diese Komplikation notwendig ist, nur auf externe Ereignisse zu reagieren. Schließlich können Sie den Zustand der externen Stifte jederzeit überprüfen oder eigene Timer erstellen, nicht wahr?

Sie können natürlich auch alle diese Dinge in Ihrem Haupt-Code tun, aber Unterbrechungen geben Ihnen einen entscheidenden Vorteil - sie asynchron sind. Ein asynchrones Ereignis ist etwas, das außerhalb des regulären Ablaufs Ihres Programms auftritt - es jederzeit passieren kann, egal, was Ihr Code zur Zeit Knirschen auf. Dies bedeutet, dass anstatt manuell zu prüfen, ob das gewünschte Ereignis geschehen ist, können Sie Ihren AVR tun Überprüfung der für Sie lassen.

Lassen Sie uns einen realen Welt Beispiel. Stellen Sie sich vor Sie auf der Couch sitzen, genießen Sie ein eisiges Gebräu und einen Film nach einem langen Tag zu beobachten. Das leben ist gut. Es gibt nur ein Problem: Sie für ein unglaublich wichtiges Paket warten, um zu erreichen, und Sie müssen es so schnell wie möglich. Wenn Sie ein normales AVR-Programm oder Arduino Skizze sind, würden Sie müssen immer wieder Ihren Film stoppen, steh auf, und die Mailbox alle 5 Minuten gehen zu überprüfen, um sicherzustellen, dass Sie wussten, wann das Paket dort war.

Stattdessen vorstellen, wenn das Paket wurde Fedex oder UPS mit Lieferbestätigung gesendet. Nun wird die Lieferung Mann zu Ihrer Haustür gehen und klingeln, sobald er eintrifft. Das ist Ihr Interrupt-Trigger. Sobald Sie den Auslöser erhalten, können Sie Ihren Film anhalten und befassen sich mit dem Paket gehen. Das ist Ihre Interrupt-Service-Routine. Sobald Sie fertig sind, können Sie den Film abholen, wo Sie aufgehört haben, ohne zusätzliche Zeit verschwendet. Das ist die Macht des Interrupts.

Die AVR-Chips in den meisten Arduinos verwendet werden, sind nicht in der Lage eine parallele Verarbeitung, das heißt sie mehrere Dinge auf einmal nicht tun kann. Mit asynchronen Verarbeitung über Interrupts ermöglicht es uns, die Effizienz unseres Codes zu maximieren, so dass wir verschwenden keine wertvollen Taktzyklen auf Abruf Schleifen oder warten auf die Dinge zu kommen. Interrupts ist für Anwendungen auch gut, die präzise Timing erfordern, weil wir wissen, dass wir unsere Veranstaltung den Moment fangen würden auftritt, und nicht versehentlich etwas verpassen.

Arten von Interrupts

Es gibt zwei Haupttypen von Interrupts:

  • Hardware-Interrupts, die in Reaktion auf ein externes Ereignis eintritt, wie beispielsweise ein Eingabestift geht hohen oder niedrigen
  • Software-Interrupts, die in Reaktion auf eine Anweisung auftreten in Software gesendet

8-Bit-AVR-Prozessoren, wie diejenigen, die Macht der meisten Arduino-Boards, sind nicht in der Lage Software-Interrupts (obwohl man sich durch Änderung stecknadel Zustand in Software emulieren kann). Wir werden jetzt auf Hardware konzentrieren. Die meisten Tutorials da draußen über den Umgang mit externen Unterbrechungen wie Stift Änderungen sprechen. Wenn Sie einen Arduino verwenden, das ist die einzige Art der Unterbrechung die Arduino „Sprache“ unterstützt, die attachInterrupt () Funktion. Das ist in Ordnung, aber es ist eine ganz andere Kategorie von Hardware-Interrupts, die in Zeiten gebaut auf der AVR verlassen, die unglaublich nützlich sein können. Wir decken externe Interrupts in diesem Tutorial, gehen dann über Timer-Interrupts in einem Followup-Tutorial, da genügend Informationen sind Splitting Dinge zu rechtfertigen oben.







Wie ein Interrupt bekommen zu tun, was wir wollen - Interrupt-Service-Routinen

Jeder AVR-Prozessor hat eine Liste von Interrupt-Quellen, oder Vektoren. zu denen auch die Art der Ereignisse, die einen Interrupt auslösen. Wenn Interrupts aktiviert sind und eines dieser Ereignisse auftreten, wird der Code an einer bestimmten Stelle im Programmspeicher springen - den Interrupt-Vektor. Mit der Einrichtung eines ISR schreiben und dann einen Link, um es an den Interrupt-Vektor der Speicherplatz platzieren, können wir unseren Code sagen, etwas Bestimmtes zu tun, wenn ein Alarm ausgelöst wird.

Lassen Sie uns dies umzusetzen anhand eines einfachen Beispiels: Erkennen, wenn eine Taste gedrückt wurde, und eine Aktion auf dieser Presse Basis durchgeführt wird. In diesem Tutorial werden wir eine Standard-Arduino-Board verwenden, um Dinge konsistent zu machen, wenn wir an den Pins und unser Setup-Programms verweisen. Auch Sie können diese Techniken mit einem einfachen AVR verwenden, benötigen Sie nur das Datenblatt zu überprüfen, um sicherzustellen, dass Sie wissen, welche Pins die Sie benötigen. Hier ist unser Beispiel-Schaltung:

Wir unterbrechen dieses Programm Ihnen ein Arduino-Interrupt-Tutorial zu bringen

Die Implementierung eines Interrupts in einem Programm

Um einen Interrupt erfolgreich zu verwenden, müssen wir drei Dinge tun:

  1. Stellen Sie den Global AVR aktivieren Bit Interrupts in Statusregister
  2. Stellen Sie den Interrupt-Bit für unsere spezifischen Interrupt-Vektor zu ermöglichen (jeder Vektor hat einen eigenen Ein- / Ausschalter)
  3. Schreiben Sie eine ISR und befestigen Sie es an unser Ziel Interruptvektor

Beginnend mit dem ersten Schritt werden wir die Interrupt-Bibliothek von avr-libc enthalten, dann eine avr-libc-Funktion nutzen, um unsere globalen Interrupt-Aktivierungs-Bit gesetzt. Als nächstes müssen wir die Interrupt wir wollen ermöglichen. Die meisten 8-Bit-AVR wie die ATMega328 haben 2 Hardware-Interrupts, INT0 und INT1. Wenn Sie eine Standard-Arduino-Board verwenden, werden diese digitalen Pins gebunden 2 und 3. Lassen Sie uns ermöglichen INT0 so können wir eine Eingangsänderung an Pin 2 von einem Knopf oder Schalter erkennen.

Schließlich werden wir eine ISR definieren, die unsere gewünschte Aufgabe ausführt. Jede ISR ist definiert als:

wo ist der Name unseres gewählten Interrupt-Vektor. Auch hier sind die Namen dieser Vektoren in dem Prozessor Datenblatt definiert sind; hier will das, was ich ist EXT_INT0. In diesem Beispiel werden wir die ISR nutzen die eingebaute LED an Pin 13 zu wechseln.

Mit unserem LED-Code hinzugefügt, hier ist, wie alles zusammen aus:

Klicken Sie doppelt in diesem Code, um es auszuwählen, so können Sie kopieren und in Ihren eigenen Skizzen.

Beachten Sie, dass wir das Programm der Hauptschleife verwenden () alles zu tun, wir in der Zwischenzeit wollen, und es wird nicht die Funktionalität unserer LED-Toggle beeinflussen.

Arduino Interrupt-Funktionalität

Für unser Beispiel könnten wir die attachInterrupt () Funktion verwenden, um die gleichen Interrupt-Setup zu ermöglichen ():

In diesem Fall definieren wir unsere eigene ISR (pin2ISR) und es als Argument übergeben. pin2ISR () würde einfach an die Stelle der ISR (EXT_INT0_vect). Dies ist oft ein bisschen einfacher als die rohen avr-libc-Funktionen verwenden, und es tut abstrakt einen Unterschied in der Chip-Modellen entfernt. Die beschriebenen Methoden AVR früher kann mit jedem Interrupt-Vektor verwendet werden, während attachInterrupt () nur mit externen Unterbrechungen arbeitet.

Dass sie alle zusammen

Es gibt ein paar letzten Dinge im Auge zu behalten, wenn Unterbrechungen zu implementieren.

Erstens, denken Sie daran, dass alles, was Sie Ihre ISR verwenden für, ist es empfehlenswert, um es kurz zu halten, weil während der ISR ausgeführt wird, wird es den Rest des Programms halten. Wenn Sie viele Unterbrechungen haben, kann dies die Dinge langsam zu einem Schleichen. Auch durch die „den Rest Ihres Programms“, meinen wir damit alles. Arduino Funktionen wie millis () nicht erhöht, und Verzögerung () wird innerhalb eines ISR nicht funktionieren.

Schließlich Interrupts werden in der Regel global innerhalb eines ISR deaktiviert (aus diesem Grunde Verzögerung () und millis () funktioniert nicht). Dies bedeutet, dass, wenn mehr Interrupt-Ereignisse auftreten, bevor Ihr ISR abgeschlossen ist, wird Ihr Programm sie nicht fangen. Dies ist ein weiterer Grund, ISR kurz zu halten.

Einwickeln

Das ist es für die Grundlagen. Wenn Sie bereit sind zu gehen zu halten, überprüfen Sie unsere Followup Artikel über Timer-Interrupts aus. Es baut auf den hier diskutierten Konzepten und helfen Sie, den eingebauten Timer des AVR verwenden, um nützliche Dinge zu tun. In der Zwischenzeit implementieren dieses Beispiel und tauchen Sie ein in die Atmel Datenblätter andere Interrupt-Vektoren zu entdecken. Sie Himmel ist die Grenze!

Wenn Sie dieses Tutorial genossen, stellen Sie sicher, für unsere E-Mail-Updates registrieren, so dass Sie Zugriff auf alle unsere Hardware-Hacking-Tipps und Tricks zu bekommen. Happy Hacking!

Artikelnavigation

17 thoughts on „Wir unterbrechen dieses Programm, um Ihnen ein Tutorial über ... Arduino Interrupts“







In Verbindung stehende Artikel