Sistem Tertanam
Bagian 1: Pendahuluan
• Interrupt = Interupsi (penyelaan / pemotongan) • Apa kaitannya dengan program?
• Apa keuntungannya menggunakan interrupt? • Seberapa pentingkah menggunakan interrupt?
Bagian 1: Pendahuluan
• Fungsi dalam arduino yang menggunakan interrupt • millis() dan micros()
• analogRead() dan analogWrite()
• Built-in library yang menggunakan interrupt • Tone library
Bagian 1: Pendahuluan
• Terdapat dua buah macam Interrupt: • Hardware Interrupt
• Timer Interrupt
• Apa perbedaan keduanya?
Bagian 2: Interrupt Timer
• Cara mainstream membuat program dengan periode tertentu? • Apa saja kerugian menggunakan cara tersebut?
Bagian 2: Interrupt Timer
• 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 (IST)
Bagian 2: Timer Interrupt
Nama
timer bits channel Atmega Pin Arduino Pin
Bagian 2: Timer Interrupt
• Timer interrupt sudah dipakai oleh fungsi dalam arduino • timer1 dan timer2 dipakai untuk analogWrite()
• timer0 dipakai untuk millis() dan micros()
Bagian 3: Register Penting Timer Interrupt
• Timer / Counter Control Register A : TCCRnA
• Timer / Counter Control Register A : TCCRnB
• Timer CouNT : TCNTn
• Output Compare Register A : OCRnA
• Output Compare Register B : OCRnB
Bagian 3: Register Penting Timer Interrupt
• Apa saja yang kegunaan register-register tersebut?
• Set-up mode untuk timer/counter
• Set-up parameter-parameter yang dibutuhkan
• Memilih bentuk gelombang (waveform) output kita
Bagian 3: Register Penting Timer Interrupt
• Apa saja yang kegunaan register-register tersebut?
• Set-up mode untuk timer/counter
• Set-up parameter-parameter yang dibutuhkan
• Memilih bentuk gelombang (waveform) output kita
Bagian 4: Detail Register TCCRnA
Bits
Built-in konstanta yang siap kita pakai untuk mengisi nilai register Register
Built-in variable yang langsung bisa kita pakai tanpa deklarasi
• COMnA1
• Bit COMnx, mengontrol behavior dari Output Compare Pins (OCnA, OCnB)
Bagian 4a: Mode Waveform
• Mode 1: Normal
• Mode 2: CTC (Clear Timer on Compare) • Mode 3: Fast PWM
Bagian 4a: Mode Waveform
Bagian 4: Detail Register TCCRnB
Presca
Bagian 4b: Prescaller
• Masih ingat prinsip kerja interrupt timer?
• Menghitung nilai (0,1,2,3,....) sampai TCNTn overflow.
• Saat overflow, ISR (Interrupt Service Routine) kita ditrigger dan dijalankan • Contoh sederhana!
• kita gunakan timer1 (besar TCNTn 16 bit)
Bagian 4b: Prescaller
• Anggap kita memiliki rutin untuk menyalakan LED di dalam ISR kita
• Coba tebak, seberapa cepat LED kita berkedip?
• Jawaban:
• 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
Bagian 4b: Prescaller
• 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
Bagian 4b: Prescaller
• Sekarang kita gunakan CS12:0 menjadi 101 (1024 prescalling) • Diketahui:
• Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik) • Timer1 memiliki nilai maksimum 65535 (16 bit)
• Atmega akan membutuhkan
1/(16,000,000 / 1024) * 65536 = 4.194 detik.
Bagian 4b: Prescaller
• Sekarang kita gunakan CS12:0 menjadi 100 (256 prescalling) • Diketahui:
• Atmega memiliki 16MHz clock (16,000,000 cycle dalam 1 detik) • Timer1 memiliki nilai maksimum 65535 (16 bit)
• Atmega akan membutuhkan
1/(16,000,000 / 256) * 65536 = 1.048 detik.
• Lumayan..
Bagian 4b: Prescaller
??????
Bagian 4b: Prescaller
• Kita membutuhkan Output Compare Register (OCRnA)
Bagian 4b: Prescaller
• 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!
Bagian 4b: Prescaller
Bagian 4b: Prescaller
(
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 prescalling)
• Tujuan:
• Timer setiap 1s
• Jawaban:
• 1s = 1/(16,000,000 / 1024) * (jumlah counter+1) • (jumlah counter+1) = 1s / 0.000064
• (jumlah counter+1) = 15625
Bagian 4b: Prescaller
• Dengan demikian nilai OCR1A yang harus ditetapkan adalah 15624
• Maka, LED kita akan berkedip tepat 1 detik sekali
Bagian 5: Contoh 1
• 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.
Bagian 5: Contoh 1
• COM1A1:0 = 00
Bagian 5: Contoh 1
• COM1A1:0 = 00
• COM1B1:0 = 00
Bagian 5: Contoh 1
• COM1A1:0 = 00
• COM1B1:0 = 00
• WGM13:0 = 0100
Bagian 5: Contoh 1
void setup() {
pinMode(LEDPIN, OUTPUT);
Bagian 5: Contoh 1
void setup() {
pinMode(LEDPIN, OUTPUT);
cli(); //disable global interrupt TCCR1A = 0;
Bagian 5: Contoh 2
• Buat 500 ppr quadrature encoder simulator yang memberikan output sinyal quadrature keluar dari pin arduino dengan
menggunakan timer 0
Bagian 5: Contoh 2
• 500ppr quadrature dengan gerakan 10 rev/sec
• berarti 500ppr * 10 rev/sec = 5000pps (5 KHz)
Bagian 5: Contoh 2
• COM1A1:0 = 01
Bagian 5: Contoh 2
• COM1A1:0 = 01
• COM1B1:0 = 01
Bagian 5: Contoh 2
• COM1A1:0 = 01
• COM1B1:0 = 01
• WGM12:0 = 010
Bagian 5: Contoh 2
cli(); //disable global interrupt