«

»

Apr 05

Fungsi digitalWrite() pada Arduino

Semua pengguna Arduino pasti familiar dengan fungsi digitalWrite(). Fungsi ini adalah satu diantara sekian banyak fungsi yang disediakan, yang akan memudahkan pengguna Arduino. Namun, dibalik kemudahan yang ditawarkan, ada konsekuensi yang harus diterima.

Sebagai contoh, perhatikan program berikut:

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
    digitalWrite(2, HIGH);
    digitalWrite(2, LOW);
}

Setelah program disuntikkan ke dalam chip Arduino dengan clock 16MHz, pada layar osiloskop tampak gelombang kotak dengan durasi HIGH 3.3 mikrodetik atau sekitar 53 siklus clock, dan durasi LOW sekitar 3.45 mikrodetik atau sekitar 55 siklus clock. Frekuensi pulsa ~ 148 kHz!

Mari kita bandingkan dengan program berikut yang di-compile dengan WinAVR, yang sedikit lebih sulit untuk dimengerti:

void loop() {
    PORTD |= _BV(2);
    PORTD &= ~_BV(2);
}

Gelombang kotak yang dihasilkan memiliki durasi HIGH 125 nanodetik atau hanya 2 siklus clock dan durasi LOW 251 nanodetik atau sekitar 4 siklus clock. Frekuensi pulsa ~ 2.7 MHz!

Aplikasi kedua 18x lebih cepat dibanding yang pertama.

Dari pengujian lainnya, dengan assembly, dihasilkan frekuensi pulsa ~ 3.7 MHz!

Mengapa bisa demikian? Padahal, software Arduino dan WinAVR menggunakan engine yang sama. Silahkan sidang pembaca menebaknya 🙂

Selama kelambatan yang terjadi dapat diterima, maka kemudahan yang ditawarkan Arduino dapat menjadi advantages. Namun untuk aplikasi yang memerlukan respons yang lebih agresif, tentunya pilihan kedua atau sejumlah trick perlu dipertimbangkan.