Přerušení

 

 

Přerušení - Interrupt

Základní struktura programu Arduina obsahuje smyčku "vouid loop()". Z běhu smyčky lze vystoupit procedurou "přerušení" a lze vykonat naprogramovanou funkci mimo smyčku. Dojde k vykonání tzv. "ISR" (Interrupt Service Routine). Po vykonání ISR se program vrátí do běhu smyčky a smyčka pokračuje tam, kde skončila. Přerušení lze vyvolat pouze na určených pinech desek Arduino, v případě desky UNO a NANO to jsou piny D2 a D3. Zde uvedený příklad využije příkazu attachInterrupt() obsahující tři parametry v závorce:

attachInterrupt(interrupt, ISR, mode)

Příkaz "attachInterrupt()" se ve skeči uvede v části "void setup". V závorce příkazu jsou tři parametry:

interupt - pin, na kterém dojde k logické změně, v případě desek UNO a NANO jsou to piny D2 a D3, v příkazu "attachInterrupt" se musí piny označit  "0" a "1", tj. 0=D2, 1=D3,

ISR - zde se uvede označení bloku programu (funkce), který bude vykonán při přerušení, např. pokud uvedeme na pozici  ISR "preruseni", bude vykonán blok programu "void preruseni()",

mode - charakteristika logické změny na určeném pinu přerušení, lze použít např. RISING, FALLING, CHANGE (FALLING - změna z log. "1" na logickou "0"),

např.:

 attachInterrupt (0, preruseni, FALLING)

Pokud dojde na pinu D2 ke změně z log. "1" na log. "0" vykoná se blok programu "void preruseni()"

Stabilita při použití přerušení bývá často problematická, je třeba respektovat některé principy. Deklarace konstant a proměnných mají být "const" a "volatile" (vyžaduje kompilátor), při použití přerušení je nespolehlivé použití "delay()", často je nefunkční či generuje ztráty sériových dat (dáno architekturou procesoru). Spolehlivé zdržení lze dosáhnout příkazem "delayMicroseconds()" s max. hodnotou 16383, tj. zdržení cca 16 milisekund (má být v dalších Arduinech upraveno). Piny přerušení, tj. na deskách UNO a NANO piny D2 a D3  jsou především při použití přerušení citlivé na záchvěvy spínacího kontaktu. Celkem spolehlivě se chovalo sepnutí pinu D2 způsobem "PULLUP" (log. "1" přes vnitřní odpor). Na pin D2 připojíme proti GND kondenzátor 10 µF, který "vybíjíme" odporem 25K proti GND. Vytvoří se vhodná "vybíjeci FALLING" hrana trvající 0,2 sekundy. Zapojení pinu D2 desky NANO viz foto:

Ke spínání pinu D2 slouží dva černé "pin" vodiče.

Inspirací pro uvedený příklad byla internetová diskuse. Z uvedeného zdroje byla vypůjčená činnost smyčky "loop". Smyčka načítá hodnotu od 0 výše (0+1+1 ...) a tiskne na sériový monitor. Přerušením dojde k vystoupení ze smyčky a vykonání funkce "void preruseni()". Poté se činnost Arduina vrací do smyčky tam, kde smyčka skončila. Do Arduina nahrajeme skeč "preruseni.ino" :

 

Skeč "preruseni.ino" :

const byte D2=2;                        	//deklarace pinu D2                  

void setup()                                              
{Serial.begin(9600);                                      
pinMode(D2,INPUT_PULLUP);                      	//nastavení pinu D2 jako vstup s vnitřně zapnutou logickou "1" (PULLUP)         
attachInterrupt(0,preruseni, FALLING);}         //příkaz k přerušení na pinu D2 (zde 0), sestupná hrana FALLING na pinu D2 spustí blok "preruseni"          

void preruseni()                              	//část programu, která se vykoná po uzemnění pinu D2 vlivem přerušení FALLING             
{Serial.println("PRERUŠENÍ");}                  // vytiskne text                            

void loop()                                     // opakující se smyčka - zde je umístěn algoritmus pro demonstraci činnosti smyčky, činnost smyčky sledujeme na sériovém monitoru (převzato-viz výše)           
{for (int i = 0;i<10000;i++)                              
{for (int i = 0;i<10000;i++)
{for (int i = 0;i<10000;i++)
{int a = 145; int b = 114;int c = a + b;}}
Serial.println(i);                           	// odešle na sériový monitoru načtené číslo (0+1+1...)           
delay(1000);}}                                  // čeká 1 s         

 

Činnost Arduina sledujeme na sériovém monitoru. Každou sekundu vytiskne načtenou hodnotu smyčky. V okamžiku spojení dvou černých "pin" vodičů, viz fotografie výše, tj. vybití kondenzátoru a změny log. "1" na log. "0" na pinu D2 dojde ke splnění podmínky FALLING příkazu přerušení a vykoná se funkce "void prerusení ()", tj. dojde k tisku textu "PŘERUŠENÍ".  Poté se program vrátí do smyčky tam, kde smyčka přestala a tiskne dále číselnou řadu.

 

 

Listopad 2020

 

Home

 

Arby

arduinohobby@email.cz