Processing math: 0%
\newcommand{\n}{\hat{n}}\newcommand{\thetai}{\theta_\mathrm{i}}\newcommand{\thetao}{\theta_\mathrm{o}}\newcommand{\d}[1]{\mathrm{d}#1}\newcommand{\w}{\hat{\omega}}\newcommand{\wi}{\w_\mathrm{i}}\newcommand{\wo}{\w_\mathrm{o}}\newcommand{\wh}{\w_\mathrm{h}}\newcommand{\Li}{L_\mathrm{i}}\newcommand{\Lo}{L_\mathrm{o}}\newcommand{\Le}{L_\mathrm{e}}\newcommand{\Lr}{L_\mathrm{r}}\newcommand{\Lt}{L_\mathrm{t}}\newcommand{\O}{\mathrm{O}}\newcommand{\degrees}{{^{\large\circ}}}\newcommand{\T}{\mathsf{T}}\newcommand{\mathset}[1]{\mathbb{#1}}\newcommand{\Real}{\mathset{R}}\newcommand{\Integer}{\mathset{Z}}\newcommand{\Boolean}{\mathset{B}}\newcommand{\Complex}{\mathset{C}}\newcommand{\un}[1]{\,\mathrm{#1}}

Bab 9 Timer

Bab 9 Timer
Instagram: @klinikarduino
Facebook: @klinikarduino
by Erwin Setiawan

Pemrograman Arduino

Contents

(Top)
Timer
Fungsi Delay
Contoh Program
  3.1  Program Timer Millis
  3.2  Program Timer Interrupt
  3.3  Hasil dan Analisis
Repository Kode Program

   

Timer

Sebagai programmer Arduino, kita pasti sudah pernah menggunakan timer bahkan tanpa kita sadari. Hal ini terjadi karena banyak bagian hardware low-level yang diabstraksi dengan library Arduino. Ada banyak fungsi Arduino yang menggunakan timer seperti delay, millis, micros, dan delayMicroseconds. Semua fungsi tersebut menggunakan timer.

Timer pada dasarnya berisi register untuk menyimpan nilai hitungan angka. Jika timer tersebut 8-bit, maka akan menghitung dari 0-255, atau disebut count-up timer seperti pada Figure 1. Timer juga bisa menghitung secara mundur dari 255-0, atau disebut count-down timer. Setiap hitungan naik atau turun dilakukan setiap periode clock timer tersebut.

 Figure 1: Cara kerja timer

Sebagai contoh, jika kita menggunakan clock timer 1 MHz, maka berapa maksimum waktu yang dapat dihitung oleh timer 8-bit? Dengan 1 MHz clock, maka periodenya adalah 1\mu s. Maksimum waktu yang dapat dihitung timer 8-bit adalah 256\cdot 1\mu s=256\mu s.

Pada module timer biasanya terdapat prescaler yang berfungsi untuk memperlambat clock timer agar maksimum hitungan timer bisa lebih panjang. Sebagai contoh, prescaler /2 akan memperlambat clock setengahnya, jika kita menggunakan clock timer 1 MHz, maka akan menjadi 500kHz. Oleh karena itu maksimum hitungan timer menjadi 256\cdot 2\mu s=512\mu s.

   

Fungsi Delay

Dengan library Arduino, kita tidak perlu repot mengkonfigurasi timer secara low-level karena itu sudah dilakukan oleh library. Kita hanya perlu mengerti prinsip kerja dan cara menggunakannya saja.

Fungsi delay merupakan cara paling sederhana untuk menggunakan timer. Fungsi tersebut memiliki satu argumen input yaitu nilai milliseconds. Selain delay ada juga fungsi delayMicroseconds yang memiliki satu argumen input yaitu nilai microseconds.

void delay(uint32_t ms); void delayMicroseconds(uint32_t us);
 Listing 1: Fungsi delay pada Arduino

Jika fungsi tersebut dipanggil, CPU akan berhenti dan menunggu (tidak bisa melakukan eksekusi task lain) sampai hitungan timer tersebut selesai. Untuk program sederhana, hal ini tidak menjadi masalah, tetapi untuk program yang membutuhkan respon cepat, maka fungsi delay dapat mengganggu.

   

Contoh Program

Pada contoh program ini, kita akan mempelajari dua contoh penggunaan timer selain fungsi delay yaitu timer millis dan timer interrupt. Contoh program ini menggunakan dua buah LED. LED merah berkedip setiap 200 ms dan LED hijau setiap 2000 ms.

Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:

Ilustrasi koneksi dari komponen-komponen ke ESP32 ditampilkan pada Figure 2. Pin yang digunakan untuk menghubungkan komponen-komponen ke ESP32 ditampilkan pada Table 1. LED tersebut menggunakan rangkaian active-low.

 Figure 2: Rangkaian breadboard untuk program timer millis dan timer interrupt

Sensor/Aktuator Pin ESP32 Pin
LED merah D25
LED hijau D26
 Table 1: Koneksi ESP32

   

Program Timer Millis

Timer millis merupakan timer dengan tipe data unsigned long 32-bit. Timer ini menghitung naik setiap periode 1 ms. Oleh sebab itu diberi nama millis. Timer ini akan kembali lagi ke 0 (rollover) setelah 2^{32}\cdot 1 ms=4294967296 ms\approx 49.7 days. Diperlukan waktu sekitar 50 hari sampai timer millis kembali lagi ke 0. Timer millis akan mulai menghitung ketika board dinyalakan.

Listing 2 menampilkan contoh program timer millis. Berikut ini penjelasan cara kerja program tersebut:

// LED pin #define RED_LED_PIN 25 #define GREEN_LED_PIN 26 unsigned long previousMillisRedLed = 0; unsigned long previousMillisGreenLed = 0; void setup() { // Konfigurasi GPIO pin sebagai output untuk LED pinMode(RED_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN, OUTPUT); // Set nilai LED ke kondisi off digitalWrite(RED_LED_PIN, HIGH); digitalWrite(GREEN_LED_PIN, HIGH); } void loop() { // Membaca nilai timer milliseconds unsigned long currentMillis = millis(); // Jika waktu timer untuk red LED sudah berlalu selama 200 ms if ((currentMillis-previousMillisRedLed) >= 200) { // Simpan nilai millis saat ini untuk referensi pada loop berikutnya previousMillisRedLed = currentMillis; // Invert nilai LED digitalWrite(RED_LED_PIN, !digitalRead(RED_LED_PIN)); } // Jika waktu timer untuk green LED sudah berlalu selama 2000 ms if ((currentMillis-previousMillisGreenLed) >= 2000) { // Simpan nilai millis saat ini untuk referensi pada loop berikutnya previousMillisGreenLed = currentMillis; // Invert nilai LED digitalWrite(GREEN_LED_PIN, !digitalRead(GREEN_LED_PIN)); } }
 Listing 2: Contoh program timer millis

Figure 3 mengilustrasikan kode program timer millis untuk program LED berkedip tanpa fungsi delay pada Listing 2. Pada setiap iterasi loop dilakukan pengecekan apakah nilai current millis sudah lebih besar sebanyak periode yang diinginkan (pada gambar tersebut yaitu 1000 ms) dari nilai previous millis. Jika kondisi terpenuhi, maka itu berarti waktu sudah berlalu sebanyak 1000 ms, kemudian nilai previous millis akan di-update dengan nilai current millis untuk iterasi berikutnya.

 Figure 3: Cara kerja timer millis

   

Program Timer Interrupt

Timer interrupt merupakan interrupt yang dihasilkan oleh timer setiap periode waktu tertentu. Figure 4 mengilustrasikan cara kerja timer interrupt. Setiap hitungan timer mencapai nilai yang sudah didefinisikan, maka interrupt akan di-generate. Di dalam kode ISR interrupt tersebut, kita dapat melakukan suatu task yang akan dieksekusi secara periodik.

 Figure 4: Cara kerja timer interrupt

Listing 3 menampilkan contoh program timer interrupt. Berikut ini penjelasan cara kerja program tersebut:

#include <ticker.h> // LED pin #define RED_LED_PIN 25 #define GREEN_LED_PIN 26 Ticker timerRedLed; Ticker timerGreenLed; void timerRedLed_isr() { // Invert nilai LED digitalWrite(RED_LED_PIN, !digitalRead(RED_LED_PIN)); } void timerGreenLed_isr() { // Invert nilai LED digitalWrite(GREEN_LED_PIN, !digitalRead(GREEN_LED_PIN)); } void setup() { // Konfigurasi GPIO pin sebagai output untuk LED pinMode(RED_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN, OUTPUT); // Set nilai LED ke kondisi off digitalWrite(RED_LED_PIN, HIGH); digitalWrite(GREEN_LED_PIN, HIGH); // Set ticker untuk generate interrupt setiap 200 ms timerRedLed.attach_ms(200, timerRedLed_isr); // Set ticker untuk generate interrupt setiap 2000 ms timerGreenLed.attach_ms(2000, timerGreenLed_isr); } void loop() { }
 Listing 3: Contoh program timer interrupt

Dapat kita lihat di fungsi loop pada program timer interrupt tidak ada kode apapun, sehingga CPU akan idle ketika tidak ada interrupt, dan bisa kita digunakan untuk eksekusi task lain.

   

Hasil dan Analisis

Figure 5 menampilkan hasil dari program timer millis dan timer interrupt. Keduanya akan menghasilkan hasil yang sama. Perbedaanya yaitu pada flow kode tersebut dieksekusi.

 Figure 5: Hasil program timer millis dan timer interrupt

Figure 6 berisi perbandingan timing diagram eksekusi CPU untuk fungsi delay, timer millis, dan timer interrupt. Contoh tersebut merupakan LED berkedip setiap 1 detik. Pada fungsi delay, CPU akan menunggu sampai fungsi delay selesai dan tidak bisa melakukan task lain. Pada timer millis, CPU hanya perlu melakukan pengecekan millis apakah target sudah tercapai atau belum, setelah itu CPU bisa melakukan task lain. Pada timer interrupt, CPU benar-benar idle tanpa perlu melakukan pengecekan millis dan bisa melakukan task lain.

 Figure 6: Timing diagram eksekusi CPU untuk fungsi delay, timer millis, dan timer interrupt

Pada program timer millis, kode LED akan dieksekusi di fungsi loop, sedangkan pada program timer interrupt, kode LED akan dieksekusi di fungsi ISR.

   

Repository Kode Program

Kode program untuk timer millis dan timer interrupt dapat didapatkan di repository ini: timer-millis dan timer-interrupt.

formatted by Markdeep 1.13