Timing dan Interupsi pada Arduino

 

Timing dan Interupsi pada Arduino

Seperti yang diketahui sebelumnya, timer digunakan untuk membuat perhitungan waktu menyerupai real time (waktu sebenarnya). Karena timer dapat menyerupai waktu sebenarnya, maka penggunaan timer bisa sebagai pengganti fungsi delay() pada arduino. Selain itu penggunaan timer lebih menguntungkan karena bisa diinterupsi pada saat proses delay.

Contohnya dapat dilihat pada program nyala hidup LED tiap 1 detik menggunakan timer-0 :

int timer = 0;
bool state = 0;
void setup() {
  pinMode(13, OUTPUT);
  TCCR0A = (1 << WGM01); //Set the CTC mode
  OCR0A = 0xF9;    //Value for ORC0A for 1ms
  TIMSK0 |= (1 << OCIE0A); //Set the interrupt request
  sei();         //Enable interrupt
  TCCR0B |= (1 << CS01);   //Set the prescale 1/64 clock
  TCCR0B |= (1 << CS00);
}
 
void loop() {
  //in this way you can count 1 second because the interrupt request is each 1ms
  if (timer >= 1000) {
    state = !state;
    timer = 0;
  }
  digitalWrite(13, state);
}
 
ISR(TIMER0_COMPA_vect) {    //This is the interrupt request
  timer++;
}

 

Skematik rangkaiannya seperti berikut :

Gambar Skematik Rangkaian Timer Interrupt LED

 

Cara memilih prescaler :

Gambar Datasheet ATmega328P Timer/Counter Control Register B

Gambar Datasheet Ddeskripsi Clock Select Bit

 

Cara mencari OCR(Output Compare Registers) :

OCR = (kecepatan clock / prescaler * waktu yang diinginkan dalam second) – 1

OCR = (16.000.000 / 64 * 0,001) – 1

OCR = 250 – 1 = 249d

OCR = F9h

Jadi, permintaan interupsi (interrupt request) akan aktif setiap 1ms.

 

Fungsi delay()

delay() berfungsi untuk menjeda program dalam waktu yang ditentukan dalam satuan milisecond(ms)

delay(ms)

Contoh :

int ledPin = 13;              // LED connected to digital pin 13
void setup() {
  pinMode(ledPin, OUTPUT);    // sets the digital pin as output
}
 
void loop() {
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(1000);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(1000);                // waits for a second
}

Program diatas digunakan untuk menunda output pin selama 1 detik.

 

Fungsi Interrupt 

Fungsi interrupt pada Arduino adalah suatu fungsi dimana saat ada sebuah trigger baik secara eksternal maupun internal, fungsi interrupt akan menghentikan sejenak program yang sedang dijalankan oleh arduino. Fungsi interrupt berguna untuk membuat sesuatu terjadi secara otomatis dalam program mikrokontroler dan dapat membantu menyelesaikan masalah pengaturan waktu.

Syntax :

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (Recommended)
attachInterrupt(interrupt, ISR, mode) (Tidak Recommended)
attachInterrupt(pin, ISR, mode) (Tidak Recommended
dan perintah ini hanya berfungsi pada Arduino SAMD, Uno rev2, Due dan 101)

 

Keterangan :

1. interrupt : jumlah interupsi. Tipe data yang diperbolehkan : int.

2. pin           : pin yang digunakan.

3. ISR          : ISR yang akan dipanggil saat interupsi terjadi. Fungsi ini tidak boleh mengambil parameter dan tidak mengembalikan apa pun. Fungsi ini terkadang disebut sebagai interrupt service routine.

4. mode      : menentukan kapan interupsi harus di-trigger. Empat konstanta telah ditentukan nilainya sebagai berikut :

    • LOW         = interrupt akan dieksekusi terus menerus selama pin membaca logika LOW.
    • RISING     = interrupt akan dieksekusi jika terjadi perubahan nilai pembacaan dari LOW ke HIGH.
    • CHANGE  = interrupt akan dieksekusi jika terjadi perubahan nilai pembacaan, baik itu dari HIGH ke LOW ataupun LOW ke HIGH.
    • FALLING  = interrupt akan dieksekusi jika terjadi perubahan nilai pembacaan dari HIGH ke LOW.

 

Pin yang dapat digunakan untuk fungsi interrupt sebagai berikut :

Seri Arduino

Pin

Uno, Nano, Mini, other 328-based

2, 3

Uno WiFi Rev.2, Nano Every

Semua pin digital

Mega, Mega2560, MegaADK

2, 3, 18, 19, 20, 21

Micro, Leonardo, other 32u4-based

0, 1, 2, 3, 7

Zero

Semua pin digital, kecuali 4

MKR Family boards

0, 1, 4, 5, 6, 7, 8, 9, A1, A2

Nano 33 IoT

2, 3, 9, 10, 11, 13, 15, A5, A7

Nano 33 BLE, Nano 33 BLE Sense

Semua pin

Due

Semua pin digital

101

Semua pin digital (Hanya pin 2, 5, 7, 8, 10, 11, 12, 13 yang berfungsi dengan CHANGE)

Contoh :

Gambar Rangkaian

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = HIGH;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
  digitalWrite(ledPin, state);
}
 
void blink() {
  state = !state;
}

Pada program diatas, apabila terjadi perubahan pada pin 2(button dipencet) maka LED akan mati sejenak kemudian hidup kembali.

Subscribe to receive free email updates:

0 Response to "Timing dan Interupsi pada Arduino"

Post a Comment