- Apa itu TIMER dalam Elektronik Tertanam?
- Register Timer Arduino
- Pengatur Waktu Arduino Menginterupsi
- Komponen Diperlukan
- Diagram Sirkuit
- Pemrograman Arduino UNO Timer
Platform Pengembangan Arduino awalnya dikembangkan pada tahun 2005 sebagai perangkat yang dapat diprogram yang mudah digunakan untuk proyek desain seni. Tujuannya adalah membantu non-insinyur untuk bekerja dengan elektronika dasar dan mikrokontroler tanpa banyak pengetahuan pemrograman. Tapi kemudian, karena sifatnya yang mudah digunakan, ia segera diadaptasi oleh pemula dan penggemar elektronik di seluruh dunia dan hari ini bahkan lebih disukai untuk pengembangan prototipe dan pengembangan POC.
Meskipun tidak masalah untuk memulai dengan Arduino, penting untuk perlahan pindah ke mikrokontroler inti seperti AVR, ARM, PIC, STM dll dan memprogramnya menggunakan aplikasi asli mereka. Ini karena bahasa Pemrograman Arduino sangat mudah dipahami karena sebagian besar pekerjaan dilakukan oleh fungsi yang sudah dibuat sebelumnya seperti digitalWrite (), AnalogWrite (), Delay (), dll. Sedangkan bahasa mesin tingkat rendah tersembunyi di belakangnya. Program Arduino tidak mirip dengan pengkodean C yang disematkan lainnya di mana kita menangani bit register dan membuatnya tinggi atau rendah berdasarkan logika program kita.
Timer Arduino tanpa penundaan:
Karenanya, untuk memahami apa yang terjadi di dalam fungsi yang dibuat sebelumnya, kita perlu menggali di balik istilah-istilah ini. Sebagai contoh ketika sebuah fungsi delay () digunakan maka sebenarnya mengatur Timer dan Counter Register bit dari mikrokontroler ATmega.
Dalam tutorial pengatur waktu arduino ini kita akan menghindari penggunaan fungsi delay () ini dan sebaliknya benar-benar menangani Register itu sendiri. Hal baiknya adalah Anda dapat menggunakan Arduino IDE yang sama untuk ini. Kami akan mengatur bit register Timer kami dan menggunakan Timer Overflow Interrupt untuk mengaktifkan LED setiap kali interupsi terjadi. Nilai prapemuat bit Timer juga dapat disesuaikan menggunakan tombol tekan untuk mengontrol durasi terjadinya interupsi.
Apa itu TIMER dalam Elektronik Tertanam?
Timer adalah semacam interupsi. Ini seperti jam sederhana yang dapat mengukur interval waktu suatu peristiwa. Setiap mikrokontroler memiliki jam (osilator), katakanlah di Arduino Uno itu adalah 16Mhz. Ini bertanggung jawab atas kecepatan. Semakin tinggi frekuensi clock, semakin tinggi pula kecepatan pemrosesan. Pengatur waktu menggunakan penghitung yang menghitung pada kecepatan tertentu tergantung pada frekuensi clock. Di Arduino Uno dibutuhkan 1/16000000 detik atau 62nano detik untuk membuat satu hitungan. Arti Arduino berpindah dari satu instruksi ke instruksi lain untuk setiap 62 nano detik.
Timer di Arduino UNO:
Di Arduino UNO ada tiga timer yang digunakan untuk fungsi yang berbeda.
Timer0:
Ini adalah pengatur waktu 8-Bit dan digunakan dalam fungsi pengatur waktu seperti penundaan (), milis ().
Timer1:
Ini adalah timer 16-Bit dan digunakan di perpustakaan servo.
Timer2:
Ini adalah Timer 8-Bit dan digunakan dalam fungsi tone ().
Register Timer Arduino
Untuk mengubah konfigurasi timer, register timer digunakan.
1. Register Kontrol Pengatur Waktu / Penghitung (TCCRnA / B):
Register ini menyimpan bit kontrol utama timer dan digunakan untuk mengontrol prescalers timer. Ini juga memungkinkan untuk mengontrol mode timer menggunakan bit WGM.
Format Bingkai:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
Bit CS12, CS11, CS10 di TCCR1B menetapkan nilai prescaler. Prescaler digunakan untuk mengatur kecepatan clock pengatur waktu. Arduino Uno memiliki prescalers 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | MENGGUNAKAN |
0 | 0 | 0 | Tidak Ada Timer Jam BERHENTI |
0 | 0 | 1 | CLCK i / o / 1 Tanpa Prescaling |
0 | 1 | 0 | CLK i / o / 8 (Dari Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (Dari Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (Dari Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (Dari Prescaler) |
1 | 1 | 0 | Sumber jam eksternal pada T1 Pin. Jam di tepi jatuh |
1 | 1 | 1 | Sumber Jam Eksternal pada pin T1. Jam di tepi menanjak. |
2. Timer / Counter Register (TCNTn)
Register ini digunakan untuk mengontrol nilai penghitung dan untuk mengatur nilai prapemuat.
Rumus nilai prapemuat untuk waktu yang dibutuhkan dalam detik:
TCNTn = 65535 - (16x10 10 xTime dalam detik / Nilai Prescaler)
Untuk menghitung nilai prapemuat untuk timer1 untuk waktu 2 Detik:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Pengatur Waktu Arduino Menginterupsi
Kami sebelumnya belajar tentang Arduino Interrupts dan telah melihat bahwa Timer interupsi adalah jenis interupsi perangkat lunak. Ada berbagai interupsi pengatur waktu di Arduino yang dijelaskan di bawah ini.Timer Overflow Interrupt:
Setiap kali pengatur waktu mencapai nilai maksimumnya katakanlah misalnya (16 Bit-65535) Interupsi Kelebihan Pengatur Waktu terjadi. Jadi, rutinitas layanan interupsi ISR dipanggil ketika bit Timer Overflow Interrupt diaktifkan di TOIEx yang ada di register topeng interupsi timer TIMSKx.
Format ISR:
ISR (TIMERx_OVF_vect) { }
Output Bandingkan Register (OCRnA / B):
Di sini ketika Output Compare Match Interrupt maka layanan interupsi ISR (TIMERx_COMPy_vect) dipanggil dan juga bit flag OCFxy akan diatur dalam register TIFRx. ISR ini diaktifkan dengan menyetel bit aktif di OCIExy yang ada di register TIMSKx. Dimana TIMSKx adalah Timer Interrupt Mask Register.
Pengambilan Input Timer:
Selanjutnya ketika timer Input Capture Interrupt terjadi maka layanan interupsi ISR (TIMERx_CAPT_vect) dipanggil dan juga bit flag ICFx akan diset di TIFRx (Timer Interrupt Flag Register). ISR ini diaktifkan dengan menyetel bit pengaktifan di ICIEx yang ada di register TIMSKx.
Komponen Diperlukan
- Arduino UNO
- Tombol Tekan (2)
- LED (Warna apa saja)
- 10k Resistor (2), 2.2k (1)
- Layar LCD 16x2
Diagram Sirkuit
Koneksi Sirkuit antara Arduino UNO dan layar LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Ke pin tengah potensiometer untuk kontrol kontras LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
SEBUAH |
+ 5V |
K |
GND |
Dua tombol Push dengan resistor pull down 10K dihubungkan dengan pin Arduino 2 & 4 dan LED dihubungkan ke PIN 7 Arduino melalui resistor 2.2K.
Setup akan terlihat seperti gambar di bawah ini.
Pemrograman Arduino UNO Timer
Dalam tutorial ini kita akan menggunakan TIMER OVERFLOW INTERRUPT dan menggunakannya untuk mengedipkan LED ON dan OFF selama durasi tertentu dengan menyesuaikan nilai preloader (TCNT1) menggunakan tombol tekan. Kode lengkap untuk Arduino Timer diberikan di bagian akhir. Di sini kami menjelaskan kode baris demi baris:
Karena LCD 16x2 digunakan dalam proyek untuk menampilkan nilai prapemuat, maka perpustakaan kristal cair digunakan.
#include
Pin anoda LED yang dihubungkan dengan Arduino pin 7 didefinisikan sebagai ledPin .
#define ledPin 7
Selanjutnya objek untuk mengakses kelas Liquid Crystal dinyatakan dengan pin LCD (RS, E, D4, D5, D6, D7) yang dihubungkan dengan Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Kemudian atur nilai prapemuat 3035 selama 4 detik. Periksa rumus di atas untuk menghitung nilai prapemuat.
nilai float = 3035;
Selanjutnya dalam pengaturan void (), pertama-tama atur LCD dalam mode 16x2 dan tampilkan pesan selamat datang selama beberapa detik.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("PENGATUR WAKTU ARDUINO"); penundaan (2000); lcd.clear ();
Selanjutnya setel pin LED sebagai pin OUTPUT dan tombol Push disetel sebagai pin INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Selanjutnya nonaktifkan semua interupsi:
noInterrupts ();
Selanjutnya Timer1 diinisialisasi.
TCCR1A = 0; TCCR1B = 0;
Nilai pengatur waktu prapemuat diatur (Awalnya sebagai 3035).
TCNT1 = nilai;
Kemudian nilai Pre scaler 1024 diatur dalam register TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Interupsi luapan Timer diaktifkan dalam register Masker Interupsi Timer sehingga ISR dapat digunakan.
TIMSK1 - = (1 << TOIE1);
Akhirnya semua interupsi diaktifkan.
interupsi ();
Sekarang tulis ISR untuk Timer Overflow Interrupt yang bertanggung jawab untuk menyalakan dan mematikan LED menggunakan digitalWrite . Keadaan berubah setiap kali terjadi interupsi pengatur waktu overflow.
ISR (TIMER1_OVF_vect) { TCNT1 = nilai; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Dalam void loop () nilai prapemuat bertambah atau berkurang dengan menggunakan input tombol tekan dan nilai tersebut ditampilkan pada LCD 16x2.
if (digitalRead (2) == HIGH) { value = value + 10; // Tingkatkan nilai pramuat } if (digitalRead (4) == HIGH) { value = value-10; // Penurunan nilai pramuat } lcd.setCursor (0,0); lcd.print (nilai); }
Jadi begini cara pengatur waktu dapat digunakan untuk menghasilkan penundaan dalam program Arduino. Periksa video di bawah ini di mana kami telah mendemonstrasikan perubahan penundaan dengan meningkatkan dan menurunkan nilai prapemuat menggunakan tombol Push.