#define LED 8
#define BUTTON 2

void setup()
{
  pinMode(BUTTON, INPUT);
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
    digitalWrite(LED, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    delay(1000);
  if(digitalRead(BUTTON)){
    Serial.println("Button pressed");
  }
}

Prerušenie

  • Prerušenie je mechanizmus, ktorým dá prostredie mikrokontroléru vedieť, že sa práve stalo niečo dôležité. Vo všeobecnosti je možné povedať, že prerušenie je špeciálny signál pre mikrokontrolér, ktorý poslal softvér alebo hardvér a vyžaduje si okamžitú pozornosť.
  • hardvérové prerušenia, známe tiež ako externé prerušenia, alebo tiež pin-change prerušenia, a
  • softvérové prerušenia, ktoré sú známe ako interné prerušenia alebo tiež časovače.

Interrupt Service Routine

  • ISR majú byť čo najkratšie a čo najrýchlejšie, aby zbytočne nebrzdili hlavný program alebo prípadne ďalšie prerušenia, ktoré môžu nastať.
  • Je potrebné sa vo vnútri ISR vyhnúť použitiu funkcie delay()!
  • Nepoužívať sériovú komunikáciu!
  • Ak programujete v jazyku C, tak globálne premenné, ktoré používate na zdieľanie údajov medzi ISR a programom, označte pomocou kvalifikátora volatile! Tým poviete prekladaču, že táto premenná môže byť použiteľná kdekoľvek v kóde a prekladač jej obsah vždy pri použití znovu načíta a nebude sa spoliehať na jej kópiu v registri. 

Reasons to use Interrupts

  • To detect pin changes (eg. rotary encoders, button presses)
  • Watchdog timer (eg. if nothing happens after 8 seconds, interrupt me)
  • Timer interrupts - used for comparing/overflowing timers
  • SPI data transfers
  • I2C data transfers
  • USART data transfers
  • ADC conversions (analog to digital)
  • EEPROM ready for use
  • Flash memory ready

Code

attachInterrupt()

digitalPinToInterrupt(pin)

 

 

attachInterrupt(digitalPinToInterrupt(3), ISR, RISING);

Režim prerušenia

  • LOW - Prerušenie je vyvolané vtedy, keď sa na pine nachádza úroveň LOW. Tento proces sa deje napríklad vtedy, ak je tlačidlo pripojené k digitálnemu pinu v režime INPUT_PULLUP a po jeho stlačení sa na pin privedie úroveň LOW.

  • CHANGE - Prerušenie je vyvolané vtedy, keď dôjde k zmene úrovne pinu buď z HIGH na LOW alebo z LOW na HIGH. Tento proces sa deje napríklad pri stláčaní prepínača.

  • RISING - Prerušenie je vyvolané vtedy, keď dôjde k zmene úrovne z LOW na HIGH. Tento proces sa deje napríklad pri stlačení tlačidla.

  • FALLING - Prerušenie je vyvolané vtedy, keď dôjde k zmene úrovne z HIGH na LOW. Tento proces sa deje napríklad pri uvoľnení stlačeného tlačidla.

void setup()
{
  attachInterrupt(digitalPinToInterrupt(2), callback_1, RISING);
  attachInterrupt(digitalPinToInterrupt(3), callback_2, CHANGE);
}

void loop()
{
	delay(10000);
}

void callback_1(){
	Serial.println("State of pin 2 changed from LOW to HIGH");
}

void callback_2(){
	Serial.println("State of pin 3 changed");
}

Odporúčane zdroje

  • https://kurzy.kpi.fei.tuke.sk/pvjc/2019/lecture.10.htmlBullet Two
  • https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
  • https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

Domáce zadanie

Made with Slides.com