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
void setup() { pinMode(LEDPIN, OUTPUT); cli(); //disable global interrupt TCCR1A = 0; TCCR1B = 0; OCR1A = 15624; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS10); TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); sei(); // enable global interrupts: }

void setup() { pinMode(LEDPIN, OUTPUT); cli(); //disable global interrupt TCCR1A = 0; TCCR1B = 0; OCR1A = 15624; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS10); TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); sei(); // enable global interrupts: }

  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
void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); cli(); //disable global interrupt OCR1A = 200; OCR1B = 100; TCCR0A |= (1 << COM0A0) | (1 << COM0B0) | (1 << WGM01); TCCR1B |= (1 << CS01); TIMSK0 |= (1 << OCIE1A); sei(); // enable global interrupts: }