Interrupt Timer dan Counters
Sistem Tertanam Interrupt Timer dan Counters
- Interrupt = Interupsi (penyelaan / pemotongan)
- Apa kaitannya dengan program?
- Apa keuntungannya menggunakan interrupt?
- Seberapa pentingkah menggunakan interrupt?
- Apa yang terjadi jika tidak menggunakan interrupt?
- Fungsi dalam arduino yang menggunakan inter>millis() dan micros()
- analogRead() dan analogWri>Built-in library yang menggunakan inter>Tone library
- Servo library
- Terdapat dua buah macam Interr>Hardware Interrupt • Timer Inter>Apa perbedaan keduanya?
- Pada saat apa kita memerlukan hardware interrupt?
- Pada saat apa kita memerlukan timer interrupt?
- Cara mainstream membuat program dengan periode tertentu?
- Apa saja kerugian menggunakan cara tersebut?
- Interrupt timer sangat dibutuhkan!
- Timer bekerja dengan menghitung (0,1,2,3,.....).
- Menambah 1 nilai per satu clock yang ada dalam variable counter.
- Overflow terjadi saat nilai tersebut mencapai nilai maksimum dari variable counter, dan nilai kembali menjadi 0
- Saat variable overflow kita dapat mendefinisikan Interrupt Service Routine (
- ISR dapat berisi program yang kita ingin kerjakan secara periodik
Nama timer bits channel Atmega Pin Arduino Pin timer0 8 A PD6 6 timer0 8 B PD5 5 timer1 16 A PB1 9 timer1 16 B PB2 10 timer2 8 A PB3 11 timer2 8 B PD3 3
- Timer interrupt sudah dipakai oleh fungsi dalam arduino
- timer0 dipakai untuk millis() dan micros()
timer1 dan timer2 dipakai untuk analogWrite()
- Kita tetap bisa menggantinya, bukan berarti kita tidak bisa memakainya.
- T
C
C
R
- T
C
C
R
ou
egister B : OCR nB
ompare
utput
:
TCNT n
imer
egister A : TCCR nA
imer /
egister A : TCCR nB
ontrol
ounter
imer /
ounter
ontrol
- T
C
NT
- O utput C ompare R egister A : OCRn A •
O
C
R
- n = nomor timer/counter
- Apa saja yang kegunaan register-register terse>Set-up mode untuk timer/counter
- Set-up parameter-parameter yang dibutuhkan
- Memilih bentuk gelombang (waveform) output kita
- Meyediakan opsi/setting untuk membandingkan nilai waveform kita dengan nilai yang kita tentukan yang lain.
- Apa saja yang kegunaan register-register terse>Set-up mode untuk timer/counter
- Set-up parameter-parameter yang dibutuhkan
- Memilih bentuk gelombang (waveform) output kita
- Meyediakan opsi/setting untuk membandingkan nilai waveform kita dengan nilai yang kita tentukan yang lain.
- COMnA1
- TC
- COMnA2
Bits Register Built-in variable yang langsung bisa Built-in konstanta yang siap kita • COMnB1 kita pakai tanpa deklarasi pakai untuk mengisi nilai register • COMnB2
- WGMn1
- W
- Bit COMnx, mengontrol
behavior dari Output Compare Pins (OCnA, OCnB)
- Bit WGMnx, mengontrol
fungsi dari Output Compare Pins (OCnA, OCnB) Normal? Fast PWM?
CTC? Phase Correct
- Mode 1: Normal • Mode 2: CTC (Clear Timer on Compare)
- Mode 3: Fast PWM
- Mode 4: Phase-Correct PWM
Mode 3: Fast PWM Mode 4: Phase Correct PWM
Pre sca ller?
- Masih ingat prinsip kerja interrupt timer? • Menghitung nilai (0,1,2,3,....) sampai TCNTn overf>
• Saat overflow, ISR (Interrupt Service Routine) kita ditrigger dan dijalankan>Contoh sederh>kita gunakan timer1 (besar TCNTn 16 bit)
- kita coba gunakan berikan nilai CS12:0 menjadi 001 (tidak ada prescalling)
- Anggap kita memiliki rutin untuk menyalakan LED di dalam ISR kita
- Coba tebak, seberapa cepat LED kita berkedip?
- Jawa
- Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik)
- Timer1 memiliki nilai maksimum 65535 (16 bit)
- Atmega hanya membutuhkan 1/16,000,000 * 65536 =
0.0041 detik untuk berhitung dari 0 sampai 65525 dan membuat TCNT1 overflow
- LED kita akan berkedip setiap 0.0041 detik!
terlalu cepat!
- Prescaller dapat mengurangi kecepatan hitung timer1 kita!
• Penambahan nilai TCNTn bisa diatur untuk tidak secepat kecepatan clock kita,
tetapi setiap
1/n * kecepatan clock kita
- dimana n adalah prescaller yang kita inginkan
• Supaya tidak terlalu cepat, kita coba untuk menggunakan 1024 prescaller. Apa
yang akan terjadi?
- Sekarang kita gunakan CS12:0 menjadi 101 (1024 prescalling)
- Diketa>Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik)
- Timer1 memiliki nilai maksimum 65535 (16
- Atmega akan membutuhkan
1/(16,000,000 / 1024) * 65536 = 4.194 detik.
- Sekarang, jadi terlalu lama...
- Sekarang kita gunakan CS12:0 menjadi 100 (256 prescalling)
- Diketa>Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik)
- Timer1 memiliki nilai maksimum 65535 (16
- Atmega akan membutuhkan
1/(16,000,000 / 256) * 65536 = 1.048 detik.
- Lumayan..
- Sekarang pertanyaannya kalau kita menginginkan setiap 2 detik?
??? ??? ???
- Kita membutuhkan
Output Compare Register (OCRnA)
- OCRnA mengijinkan kita untuk melakukan penetapan waktu yang
fleksibel (kita dapat menentukannya sendiri)
- Setiap penambahan nilai
TCNTn, Atmega akan selalu
membandingkannya dengan OCRnA.
- Jika
TCNTn sama dengan OCRnA maka komparator akan
memberikan sinyal "match"
- Kemudian ISR kita dapat ditrigger!
- Pertanyaanya, bagaimana mengaktifkan OCRnA?
Masih ingat?
( target waktu ) = ( resolusi waktu ) * ( jumlah counter + 1)
- Diketahui:
- Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik)
- Timer1 memiliki nilai maksimum 65535 (16 bit)
- Bit CS12:0 diset menjadi 101 (1024 prescall>Tujuan:
- Timer setia
- Jawaban:
- 1s = 1/(16,000,000 / 1024) * (jumlah counter+1)
- (jumlah counter+1) = 1s / 0.000064
- (jumlah counter+1) = 15625
- jumlah counter = 15624
- Dengan demikian nilai OCR1A yang harus ditetapkan adalah
15624
- Maka, LED kita akan berkedip tepat 1 detik se
• Tidak peduli ada seberapa banyak program yang tetap berjalan, LED kita
akan tetap berkedip 1 detik sekali.
- Mari buat program untuk menyalakan LED setiap 1 detik dengan menggunakan interrupt timer (gunakan timer1)
- Dari analisa kita sebelumnya, mari gunakan interrupt timer 1 dengan prescaller 1024.
- Apa saja yang harus di konfigurasikan?
- COM1A1:0 = 00
- COM1B1:0 = 00
- COM1A1:0 = 00
- COM1B1:0 = 00
- WGM13:0 = 0100
- COM1A1:0 = 00
- COM1B1:0 = 00
- WGM13:0 = 0100
- CS12:0 = 101
- COM1A1:0 = 00
- COM1B1:0 = 00
- WGM13:0 = 0100
- CS12:0 = 101
- OCR1A = 15624
- FOC1A = 00
- FOC1B = 00
ISR(TIMER1_COMPA_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }
- Buat 500 ppr quadrature encoder simulator yang memberikan output sinyal quadrature keluar dari pin arduino dengan menggunakan timer 0
- Asumsikan simulator quadrature encoder bergerak dengan kecepatan konstan 10 rev/sec
- 500ppr quadrature dengan gerakan 10 rev>berarti 500ppr * 10 rev/sec = 5000pps (5
- Periodenya adalah setiap 0.2ms sekali terdapat pulsa
- COM1A1:0 = 01
- COM1B1:0 = 01
- COM1A1:0 = 01
- COM1B1:0 = 01
- WGM12:0 = 010
- COM1A1:0 = 01
- COM1B1:0 = 01
- WGM12:0 = 010
- CS12:0 = 011
- COM1A1:0 = 00
- COM1B1:0 = 00
- WGM13:0 = 0100
- CS12:0 = 101
- OCR0A = 200
- OCR0B = 100
- FOC1A = 00
- FOC1B = 00