Arduino katkestused04. Jun '14

Sissejuhatus

Osadel Arduino pesadel on katkestuste (interrupt) võimekus, mis lubab digitaalsisendi lugemist optimeerida. Selle asemel et tsüklis korduvalt digitaalsisendi väärtust lugeda, saab Arduino mikrokontrolleri programmeerida käivitama funktsiooni kui huvi pakkuv sündmus aset leiab.

Arduino Uno puhul on katkestuste kasutamine võimalik pesadel 2 ning 3. Arduino Mega 2560 puhul on see lisaks veel toetatud pesadel 18, 19, 20 ja 21. Arduino Due puhul on katkestused võimalikud kõigil pesadel 1.

Katkestuste liigid

Sündmuseid mille peale katkestuse funktsioon käivitatakse on laias laastus viite tüüpi:

  • LOW - Käivita funktsioon mil iganes digitaalsisend on madalal pingenivool.

  • RISING - Käivita funktsioon kui digitaalsisendi tõeväärtus muutub tõeseks.

  • CHANGE - Käivita funktsioon kui digitaalsisendi tõeväärtus muutub.

  • FALLING - Käivita funktsioon kui digitaalsisendi tõeväärtus muutub vääraks.

  • HIGH - Käivita funktsioon mil iganes digitaalsisend on kõrgel pingenivool, see funktsionaalsus on hetkel küll toetatud ainult Arduino Due mikrokontrolleril

Arduino Uno ning Arduino Mega 2560 puhul on katkestused nummerdatud järgnevalt:

  • Pesa nr 2 → Katkestus nr 0

  • Pesa nr 3 → Katkestus nr 1

  • Pesa nr 18 → Katkestus nr 5

  • Pesa nr 19 → Katkestus nr 4

  • Pesa nr 20 → Katkestus nr 3

  • Pesa nr 21 → Katkestus nr 2

Koodinäide

Nupuvajutust võib lugeda näiteks järngeva koodijupiga:

int led = 13;
int button  = 2;
int buttonInterrupt = 0;

void setup() {
    pinMode(led, OUTPUT);         // Seadista 13 jalg digitaalväljundiks
    pinMode(button, INPUT);       // Seadista 9 jalg digitaalsisndiks
    digitalWrite(button, HIGH);   // Lülita sisse pull-up takisti

    // Seosta sündmused funktsioonidega
    attachInterrupt(buttonInterrupt, onButtonPressed, FALLING);
    attachInterrupt(buttonInterrupt, onButtonReleased, RISING);
}

void onButtonPressed() {
    digitalWrite(led, HIGH);
}

void onButtonReleased() {
    digitalWrite(led, LOW);
}

void loop() {
    // Tee midagi asjalikku
}

Skeemina kasutame sama mida kõige lihtsamaski digitaalsisendi lugemise näites:

layer 21012345678910111213text:0A0text:1A1text:2A2text:3A3text:4A4text:5A5text:66text:7A7text:8A8text:9A9text:10A10text:11A11text:12A12text:13A13text:14A14text:15A15text:2222text:2424text:2626text:2828text:3030text:3131text:3232text:3333text:3434text:3535text:3636text:3737text:3838text:3939text:4141text:4040text:4343text:4242text:4545text:4747text:4949text:5151text:4444text:4646text:5050text:4848text:5353text:5252element:C1package:C0603-ROUNDelement:C2package:C0603-ROUNDelement:C3package:C0603-ROUNDelement:C4package:C0603-ROUNDelement:C5package:C0603-ROUNDelement:C6package:C0603-ROUNDelement:C7package:C0603-ROUNDelement:C8package:C0603-ROUNDelement:C9package:C0603-ROUNDelement:C10package:C0603-ROUNDelement:C11package:C0603-ROUNDelement:C12package:C0603-ROUNDelement:C13package:C0603-ROUNDelement:C14package:C0603-ROUNDelement:C15package:C0603-ROUNDelement:F1package:L1812element:FD1package:FIDUCIA-MOUNTelement:FD2package:FIDUCIA-MOUNTelement:FD3package:FIDUCIA-MOUNTelement:FD4package:FIDUCIA-MOUNTelement:GROUNDpackage:SJelement:Ltext:LLelement:R1package:R0603-ROUNDelement:R2package:R0603-ROUNDelement:RN1package:CAT16element:RN2package:CAY16element:RN3package:CAY16element:RN4package:CAY16element:RN5package:CAT16element:RXtext:RXRXelement:TXtext:TXTXelement:Z1package:CT/CN0603element:Z2package:CT/CN0603layer 25text:ANALOG INANALOG INCOMMUNICATIONtext:ANALOG INPOWERAREFGNDTX0RX0RESET3V35Vtext:VINVINtext:GNDGNDtext:GNDGNDSDA 20SCL 21TX2 16RX2 17RX3 15text:TX3TX3 14RX1 19TX1 18text:MADE INMADE INtext:ITALYITALYPWMtext:5V5Vtext:GNDGNDtext:DIGITALDIGITALtext:MEGA 2560MEGAtext:M.Banzitext:D.Cuartiellestext:D.Mellistext:G.Martinotext:T.IgoeIOREFtext:SDAtext:SCLelement:C1package:C0603-ROUNDelement:C2package:C0603-ROUNDelement:C3package:C0603-ROUNDelement:C4package:C0603-ROUNDelement:C5package:C0603-ROUNDelement:C6package:C0603-ROUNDelement:C7package:C0603-ROUNDelement:C8package:C0603-ROUNDelement:C9package:C0603-ROUNDelement:C10package:C0603-ROUNDelement:C11package:C0603-ROUNDelement:C12package:C0603-ROUNDelement:C13package:C0603-ROUNDelement:C14package:C0603-ROUNDelement:C15package:C0603-ROUNDelement:D1package:SMBelement:D2package:MINIMELFelement:D3package:MINIMELFelement:F1package:L1812element:FD1package:FIDUCIA-MOUNTelement:FD2package:FIDUCIA-MOUNTelement:FD3package:FIDUCIA-MOUNTelement:FD4package:FIDUCIA-MOUNTelement:GROUNDpackage:SJelement:IC3package:TQFP100element:IC4package:MLF32element:IC6package:SOT23-DBVelement:IC7package:MSOP08element:Lpackage:CHIP-LED0805element:L1package:0805element:ONtext:ONONelement:R1package:R0603-ROUNDelement:R2package:R0603-ROUNDelement:RN1package:CAT16element:RN2package:CAY16element:RN3package:CAY16element:RN4package:CAY16element:RN5package:CAT16element:RXpackage:CHIP-LED0805element:T1package:SOT-23element:TXpackage:CHIP-LED0805element:XIOpackage:2X18text:XIOelement:Y1package:RESONATORelement:Y2package:QSelement:Z1package:CT/CN0603element:Z2package:CT/CN0603

Arduino nupuga ühendatud pessa number 2

Kokkuvõte

Katkestusi kasutades saame vabastada loop() funktsiooni nupu lugemisest ning seal hoopis midagi muud asjalikku teha. Tähele tuleks panna seda, et katkestuse funktsiooni (interrupt handler) sisu peaks olema nii lühike kui võimalik. Katkestuse funktsiooni käivitamisel salvestatakse mikrokontrolleri olek, ning muu sel ajal käitatud funktsioon pannakse pausile. Katkestuse funktsiooni lõpetamisel jätkab mikrokontroller samast kohast.

1

attachInterrupt()

Arduino GPIO Tiigriülikool Estonian IT College