Arduino - Menyela

Interupsi menghentikan pekerjaan Arduino saat ini sehingga beberapa pekerjaan lain dapat dilakukan.

Misalkan Anda sedang duduk di rumah, mengobrol dengan seseorang. Tiba-tiba telepon berdering. Anda berhenti mengobrol, dan mengangkat telepon untuk berbicara dengan penelepon. Setelah Anda menyelesaikan percakapan telepon, Anda kembali mengobrol dengan orang tersebut sebelum telepon berdering.

Demikian pula, Anda dapat menganggap rutinitas utama sebagai mengobrol dengan seseorang, dering telepon menyebabkan Anda berhenti mengobrol. Rutinitas layanan interupsi adalah proses berbicara di telepon. Ketika percakapan telepon berakhir, Anda kemudian kembali ke rutinitas utama Anda yaitu mengobrol. Contoh ini menjelaskan dengan tepat bagaimana interupsi menyebabkan prosesor bertindak.

Program utama sedang menjalankan dan menjalankan beberapa fungsi dalam suatu rangkaian. Namun, ketika interupsi terjadi, program utama terhenti sementara rutinitas lain dijalankan. Saat rutinitas ini selesai, prosesor kembali ke rutinitas utama lagi.

Fitur penting

Berikut beberapa fitur penting tentang interupsi -

  • Interupsi dapat berasal dari berbagai sumber. Dalam hal ini, kami menggunakan interupsi perangkat keras yang dipicu oleh perubahan status pada salah satu pin digital.

  • Sebagian besar desain Arduino memiliki dua interupsi perangkat keras (disebut sebagai "interrupt0" dan "interrupt1") masing-masing ke pin I / O digital 2 dan 3.

  • Arduino Mega memiliki enam interupsi perangkat keras termasuk interupsi tambahan ("interupsi2" hingga "interupsi5") pada pin 21, 20, 19, dan 18.

  • Anda dapat menentukan rutinitas menggunakan fungsi khusus yang disebut sebagai "Interrupt Service Routine" (biasanya dikenal sebagai ISR).

  • Anda dapat menentukan rutinitas dan menentukan kondisi di tepi naik, tepi jatuh, atau keduanya. Pada kondisi khusus ini, interupsi akan diperbaiki.

  • Dimungkinkan untuk menjalankan fungsi itu secara otomatis, setiap kali suatu peristiwa terjadi pada pin input.

Jenis Interupsi

Ada dua jenis interupsi -

  • Hardware Interrupts - Terjadi sebagai respons terhadap peristiwa eksternal, seperti pin interupsi eksternal yang naik atau turun.

  • Software Interrupts- Terjadi sebagai tanggapan atas instruksi yang dikirim dalam perangkat lunak. Satu-satunya jenis interupsi yang didukung "bahasa Arduino" adalah fungsi attachInterrupt ().

Menggunakan Interupsi di Arduino

Interupsi sangat berguna dalam program Arduino karena membantu memecahkan masalah pengaturan waktu. Aplikasi interupsi yang baik adalah membaca encoder putar atau mengamati input pengguna. Umumnya, ISR harus sesingkat dan secepat mungkin. Jika sketsa Anda menggunakan beberapa ISR, hanya satu yang dapat dijalankan dalam satu waktu. Interupsi lain akan dijalankan setelah yang sekarang selesai dalam urutan yang bergantung pada prioritas yang mereka miliki.

Biasanya, variabel global digunakan untuk melewatkan data antara ISR dan program utama. Untuk memastikan variabel yang dibagi antara ISR dan program utama diperbarui dengan benar, nyatakan sebagai volatile.

AttachInterrupt Statement Syntax

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

Tiga konstanta berikut ditentukan sebelumnya sebagai nilai yang valid -

  • LOW untuk memicu interupsi setiap kali pin rendah.

  • CHANGE untuk memicu interupsi setiap kali nilai pin berubah.

  • FALLING kapan pun pin berubah dari tinggi ke rendah.

Example

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}