SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
MODUL TRAINING
MIKROKONTROLER AVR

BIDANG KEPROFESIAN
BADAN PENGURUS HME ITB
2009/2010

DIVISI WORKSHOP
HME ITB
PENDAHULUAN
Mikrokontroller AVR memiliki arsitektur RISC 8 bit, dimana semua instruksi dikemas dalam kode 16-bit (16-bits
word) dan sebagian besar instruksi dieksekusi dalam satu siklus clock, berbeda dengan instruksi MCS51 yang
membutuhkan 12 siklus clock. Hal ini terjadi karena perbedaan arsitektur yang dipakai. AVR menggunakan
arsitektur RISC (Reduced Instruction Set Computing) sedangkan MCS51 menggunakan arsitektur CISC (Complex
Instruction Set Computing).
AVR secara umum dapat dibagi menjadi empat kategori antara lain; ATtiny, AT90Sxx, ATmega, dan AT86RFxx.
Yang membedakan keempat kategori diatas secara mendasar ialah ukuran memori, peripheral, dan fungsinya.
Skematik sistem minimum dari AVR versi DIP (Dual Inline Package) 40 pin disajikan pada gambar dibawah ini:

Skematik ISP dongle STK200 yang dihubungkan ke port parallel pada komputer untuk mendownload program dari
komputer ke mikrokontroler AVR:

Nilai C1 = 100nF dan R1 = ?
CodeVisionAVR C Compiler
Pendahuluan
Pada Kontes Robot Cerdas Indonesia (KRCI) bahasa pemrograman yang umum dipakai ialah bahasa C. Bahasa ini
dipakai karena lebih dekat dan mudah dimengerti oleh manusia. Namun bahasa ini kurang machine friendly.
Sehingga untuk beberapa akses membutuhkan code dalam bahasa assembly. Kelebihan yang dimiliki bahasa C
adalah dapat dimasukkannya code assembly dalam code C.
Program CodeVisionAVR ini tidaklah gratis. Namun banyak versi evaluasi yang tersedia. Versi evaluasi ini hanya
mengijinkan sebagian kecil code dari total code yang bisa di burn ke dalam mikrokontroler. Misal kapasitas flash
mikrokontroler sebesar 8KB maka total code yang bisa di compile sekitar 1 KB. Sebenarnya terdapat alternatif lain
untuk pemrograman dalam bahasa C dengan menggunakan software WinAVR yang gratis.
Sebagai permulaan maka penulis akan sedikit mencoba memprogram AVR dengan menggunakan CodeVisionAVR
karena source code-nya telah tersedia. Selain itu penulis telah mendapatkan beberapa sample hasil pengalaman
dan percobaan dari code sendiri serta code gratis yang disediakan di internet. Semua code yang terlampir disini
sebagian besar merupakan program robot otaku. Robot ini diperlombakan pada KRCI 2006 di balairung UI.
Penulis menggunakan program CodeVisionAVR C Compiler v1.24.7e
Fitur-fitur yang dimiliki CodeVisionAVR terbilang lengkap. Program ini menyediakan interface hyperterminal
didalamnya. Hyperterminal ini dapat digunakan untuk berkomunikasi antara mikrokontroler dengan komputer.
Untuk proses pembakaran atau pengisian program ke dalam mikrokontroler terdapat tool tersendiri.
Untuk proses debugger program ini akan menyediakan link pada AVR studio 4 yang memang telah memiliki fitur
tersebut. Atau jika ingin, sesudah program C di compile oleh CodeVisionAVR maka akan dihasilkan file *.cof yang
dapat disimulasikan langsung di AVR studio 4.
Project Management
Setiap akan membuat program baru pada CodeVisionAVR, kita akan diarahkan untuk membuat project terlebih
dahulu.

Pada menu File pilih New lalu lalu klik Project dan klik OK.
CodeVisionAVR akan menanyakan apakah anda akan menggunakan fasilitas CodeWizardAVR.

Fasilitas ini sangatlah berguna jika anda tidak ingin bersusah payah melakukan settingan dengan mengetik codecode tertentu yang banyak dan kompleks. Intinya terdapat tab-tab yang tinggal klik dan anda akan langsung
disajikan contoh kodenya.

Contohnya jika anda ingin membuat program yang memakai eksternal interrupt maka tinggal pilih tab External IRQ
pada tampilan CodeWizard. Klik pada INT 0 Enabled untuk memilih external interrupt 0 dan pilih mode
pembangkitan interrupt yang ingin digunakan.

Mode pembangkitan eksternal interrupt terdiri dari rising edge atau falling edge atau any change. Untuk melihat
code yang akan dihasilkan klik pada menu File dan pilih Program Preview.
Lihat pada code:
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
}

Jika terdapat code diatas maka anda telah mendapatkan header program yang akan dieksekusi jika terjadi trigger
eksternal interrupt.
Sebaliknya jika pada pertanyaan apakah akan digunakan CodeWizard anda menjawab tidak (NO), maka akan
muncul window Create New Project seperti dibawah ini:

Ketik nama project yang akan dibuat dan klik save. Anda akan dihadapkan pada window Configure Project seperti:
File code yang memiliki ekstensi *.c yang akan dibuat nantinya disave pada suatu tempat dan di masukkan ke
dalam project dengan mengklik Add pada tab File seperti diatas. Pada tab C Compiler akan ditemukan tab lagi
didalamnya. Tab yang sering digunakan ialah tab Code Generation. Pada tab ini anda akan menentukan
mikrokontroler apa dan kecepatan (speed dalam MHz) yang nantinya akan digunakan. Pilih ATmega8535 dan
speed yang sesuai dengan frekuensi crystal yang akan digunakan lalu klik OK.

Proses coding menggunakan bahasa C belum dapat dimulai setelah mengkonfigurasi project yang dibuat. Untuk
membuat file *.c klik pada menu File dan pilih source dan klik OK.

Selanjutnya akan tampil window utama dengan tampilan dibawah ini. Ingat, file masih dalam bentuk untitled.c dan
belum disave. Untuk mengetahuinya dapat dilihat pada sisi kiri dimana file untitled.c terletak pada Other Files. Hal
ini meyatakan pula bahwa file untitled.c belum masuk dalam project. Save dulu file untitled.c pada folder yang
sama dengan file project dan beri nama yang sama.

Untuk memasukkan file *.c yang telah disave ke dalam project klik menu Project dan pilih Configure.
Anda akan dihadapkan kembali pada window seperti pada Configure Project diatas. Klik Add dan akan tampil
window yang menayakan file *.c mana yang akan dimasukkan kedalam project. Klik OK.

Jika file *.c telah dimasukkan ke dalam project maka statusnya dapat dilihat pada bagian kiri window utama
dimana file *.c terdapat pada tree project.

Kini anda siap melakukan coding dalam bahasa C di CodeVisionAVR.
Melakukan proses compiling terhadap sourcecode yang sudah jadi
Klik pada tombol yang ditunjukkan pada gambar dibawah. Tombol tersebut selain melakukan compiling akan
mengenerate beberapa file termasuk *.hex yang akan diburn ke mikrokontroler dan file *.coff yang dapat
disimulasikan pada AVR studio

Setelah proses compiling berhasil maka akan muncul window:
Window ini berisi informasi-informasi penting mengenai jenis mikrokontroller, speed, ukuran program, sisa space
EEPROM dan FLASH, jumlah error dari code dan sebagainya. Jika terdapat error pada code yang kita buat, maka
klik OK dan anda akan kembali pada window utama dengan tampilan seperti dibawah ini:

Untuk mengetahui letak kesalahan pada code anda, tinggal klik pada tab navigator bagian Errors. Atau anda dapat
mengklik pada tab Messages untuk mengetahui letak kesalahan pada code. Pada contoh diatas dapat dilihat
sintaks #include <mega32.h akan diblok dengan warna biru yang menunjukkan kesalahan terletak pada sintaks
tersebut.
Memprogram Chip dengan menggunakan Chip Programmer
Proses compiling yang sukses akan menghasilkan file *.hex pada folder dimana file project disimpan. File *.hex ini
telah siap untuk diburn ke dalam mikrokontroler dengan menggunakan tool yang telah tersedia pada
CodeVisionAVR yaitu CodeVisionAVR Chip Programmer. Untuk membuka window ini klik pada tombol seperti di
bawah ini:

Window Chip Programmer akan muncul dengan tampilan:
Sebelum mulai memprogram chip, anda harus melakukan setup terhadap programming dongle yang akan
digunakan. Pada window utama klik pada menu Settings dan pilih Programmer.

Tampilan window Programmer Settings:

Tipe dongle yang dipakai diatas ialah STK200 yang menggunakan port printer (LPT). Kolom Delay Multiplier berisi
pengali yang akan memperlambat proses programming terhadap chip. Penulis sering memakai dongle ini karena
simple. Kelemahannya ialah proses programming yang lebih lama jika dibandingkan dengan dongle STK500.
Dongle yang dipakai baik STK200 atau STK500 ialah dongle dengan sirkuit pengganti. Karena jika harus membeli
maka harga programming dongle itu sangatlah mahal. Tampilan untuk dongle STK500 yang menggunakan port
serial (COM):

Setelah selesai klik OK dan lanjutkan pada window Chip Programming. Pada window Chip Programming terdapat
banyak settingan programming yang dapat dipilih. Dengan settingan default anda sudah dapat memprogram chip
langsung.
MEMBUAT PROGRAM SEDERHANA PADA ATMEGA8535
Basic Input Output
Pada proyek ini anda akan membuat code sederhana yaitu memberikan nilai logika 0 atau 1 pada port output
ATmega8535. Port I/O akan diset menjadi port output. Port yang sama dapat dialihkan fungsinya menjadi port
input dengan mengatur DDR (Data Direction Register) dari tiap-tiap port. Layout dari tiap-tiap port dari
ATmega8535 dengan packaging PDIP:

Konfigurasi port I/O pada ATmega8535 dapat dilakukan dengan melakukan settingan:
Port I/O sebagai output:
DDR diset high atau bit 1 dengan mengetikkan DDRx =1; x bisa berarti A,B,C,D (port). Penyettingan ini dilakukan
dengan akses per byte pada satu port dengan delapan pin sekaligus. Misal kita ingin menjadikan PA0 menjadi port
output, contoh kodenya:
DDRA = 0x01; //menjadikan porta.0 menjadi port output (hex)
DDRA = 0b00000001; //sama dengan diatas namun dengan bilangan bit,
//kedua perintah diatas membuat port selain //porta.0 menjadi port
input
Untuk melakukan penyettingan terhadap satu pin saja maka dapat dilakukan dengan DDRx.y = 1; y bisa terdiri
angka 0,1,...,7 (8 bit). Contoh kodenya:
DDRA.0 = 1; //menjadikan porta.0 menjadi port output
Memberikan keluaran high pada PA0 dilakukan dengan mengetikan kode:
PORTA = 1; //porta.0 diberi logic high ‘1’
Jika ingin memberikan logic high pada lebih dari satu port ketikkan kode:
PORTA = 0xAA; //porta.1,3,5,7 diberi logic high atau
PORTA = 0b10101010;
Penyettingan hanya terhadap satu pin saja dari satu port dapat menggunakan kode:
PORTA.2 = 1; //porta.2 memiliki logic high
Port output pada ATmega8535 dapat memberikan arus source sebesar 20 mA. Arus ini cukup untuk menyalakan
LED sedang. Arus ini dapat terjadi karena AVR telah memiliki internal pull up resistor di dalamnya untuk setiap pinnya.
Port I/O sebagai input:
Untuk menjadikan port I/O menjadi port output DDR diset low atau ‘0’. Ketikkan kode
DDRA.0 = 0; //porta.0 menjadi port input
Untuk mengambil data dari port input kita gunakan perintah PINA . Akses byte atau per bit dari port input sama
dengan penjelasan pada DDR dan port output diatas. Contoh dari penggunaan perintah PINA :
if (PINA.0 == 1)
{
PORTA.2 = 1;
} // jika pin A0 = 1, maka port A2 diberi logic high
Port input dapat di pullup dengan menambahkan perintah PORT setelah DDR seperti pada contoh dibawah ini:
DDRA.0 = 0;
PORTA.0 = 1; //membuat porta.0 sebagai input dan di pullup
Contoh program kecil:
#include <mega8535.h>
void main()
{
DDRA.0 = 1;
PORTA.0 = 1;
DDRB = 0b00110011;
PORTB.3 = 1;
}
INTERRUPT / INTERUPSI
Interrupt/Interupsi ialah suatu kondisi dimana CPU (Central Processing Unit) mikrokontroler berhenti dari rutinitas
yang sedang dikerjakan dan mengerjakan rutinitas lain yang ditunjuk oleh interupsi tersebut. Ketika rutinitas yang
ditunjuk interupsi telah selesai dieksekusi, maka CPU akan mulai mengekseskusi rutinitas awal sebelum adanya
interupsi yang terhenti dari tempat terakhir.
Pada AVR ATmega8535 terdapat 21 buah interrupt yang ditunjukkan pada tabel dibawah ini:

Pada bagian ini jenis interrupt yang akan dibahas ialah external interrupt. ATmega8535 memiliki tiga buah
eksternal interrupt yaitu INT0, INT1, dan INT2. Ketiga interrupt ini yaitu INT0 s.d INT2 akan tertrigger walaupun
portnya dikonfigurasi sebagai output. Fitur ini memungkinkan interrupt yang dikondisikan oleh software. Semua
interrupt akan tertrigger jika terdapat perubahan rising edge atau falling edge. Mode any change tidak dimiliki
INT2, sedangkan INT0 dan INT1 memilikinya. Mode any change memungkinkan interrupt terpanggil baik ketika
rising dan falling edge.
Register-register yang harus di setting untuk mengaktifkan eksternal interupsi ialah GICR (General Interrupt
Control Register), GIFR (General Interrupt Flag Register), MCUCR (MCU Control Register), dan MCUCSR (MCU
Control and Status Register).
GICR (General Interrupt Control Register)

• Bit 7 – INT1: External Interrupt Request 1 Enable
Untuk meng-enable kan External Interrupt 1
• Bit 6 – INT0: External Interrupt Request 0 Enable
Untuk meng-enable kan External Interrupt 0
• Bit 5 – INT2: External Interrupt Request 2 Enable
Untuk meng-enable kan External Interrupt 2
GIFR (General Interrupt Flag Register)
• Bit 7 – INTF1: External Interrupt Flag 1
Ketika terjadi eksternal interrupt pada INT1, maka Flag INTF1 diset 1. Setelah routine eksternal interrupt selesai di
eksekusi maka Flag INTF1 diset 0.
• Bit 6 – INTF0: External Interrupt Flag 0
Ketika terjadi eksternal interrupt pada INT0, maka Flag INTF0 diset 1. Setelah routine eksternal interrupt selesai di
eksekusi maka Flag INTF0 diset 0.
• Bit 5 – INTF2: External Interrupt Flag 2
Ketika terjadi eksternal interrupt pada INT2, maka Flag INTF2 diset 1. Setelah routine eksternal interrupt selesai di
eksekusi maka Flag INTF2 diset 0.
MCUCR (MCU Control Register)

• Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0
Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 1. pilihan sensitifitas dapat dilihat pada
tabel dibawah:

• Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 0. pilihan sensitifitas dapat dilihat pada
tabel dibawah:

MCUCSR (MCU Control and Status Register)

• Bit 6 – ISC2: Interrupt Sense Control 2
Jika ISC2 ditulis 0 maka falling edge pada INT2 akan mengaktifasi interupsi. Jika ISC2 ditulis 1, maka rising edge
pada INT2 akan mengaktifasi interupsi.
Contoh program yang menggunakan ketiga eksternal interrupt diatas:
#include <mega32.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTA.0 = 1;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
PORTA.1 = 1;
}
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
PORTA.2 = 1;
}
void main()
{
DDRD.2 = 0; //pind.2 INT0 (input)
DDRD.3 = 0; //pind.3 INT1 (input)
DDRB.2 = 0; //pinb.2 INT2 (input)
DDRA.0 = 1; //output
DDRA.1 = 1; //output
DDRA.2 = 1; //output
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
// INT2: On
// INT2 Mode: Rising Edge
GICR |=0xE0; // GICR |=0b11100000
MCUCR =0x0F; // MCUCR =0b00001111
MCUCSR=0x40; // MCUCSR=0b01000000
GIFR =0xE0; // GIFR =0b11100000
#asm("sei") //global enable interrupts (SREG)
While(1)
{};
}
TIMER / COUNTER
Timer/Counter pada mikrokontroler AVR dapat digunakan untuk melakukan pencacahan waktu seperti pada jam
digital maupun untuk menghasilkan sinyal PWM (Pulse Width Modulation) yakni sinyal kotak dengan frekuensi dan
duty cycle yang nilainya bisa diatur. Atmega8535 memiliki tiga unit Timer/Counter yaitu Timer/Counter 0 (8 bit),
Timer/Counter 1 (16 bit), dan Timer/Counter 2 (8 bit).
1. TIMER/COUNTER 0
Fitur-fitur yang dimiliki:
• Satu buah unit Compare Counter (Unit ini akan meng-count dan meng-compare)
• Clear timer pada saat compare match (Auto reload)
• Phase Correct PWM yang bebas glitch
• Frequency generator
• External event counter
• Prescaler clock hingga 10 bit
• Source interrupt overflow dan compare match (TOV0 dan OCF0)
Definisi timer:
Timer/Counter adalah sebuah unit yang dapat menghitung (Counter) dan melakukan timing dengan menggunakan
frekuensi kristal sebagai sumber clock counternya internal atau sumber eksternal melalui pin T0.
Berikut blok diagram Timer/Counter 0:

Register
Timer/Counter (TCNT0) dan Output Compare Register (OCR0) adalah register 8 bit. Sinyal permintaan interrupt
dapat dilihat pada TIFR (Timer Interrupt Flag Register). Semua interrupt secara individual terlindungi oleh Timer
Interrupt Mask Register (TIMSK). TIMSK dan TIFR tidak diperlihatkan pada gambar diatas karena penggunaannya
di-share dengan unit timer yang lain.
Timer/Counter dapat diberi sumber clock secara internal dan dapat diatur frekuensinya dengan prescaler bit (bit
pembagi) atau diberi sumber clock eksternal melalui pin T0. Blok Clock Select Logic akan menentukan sumber
clock mana yang digunakan untuk menambah atau mengurangi nilai yang terdapat pada register timernya.
Timer/Counter akan tidak aktif ketika tidak ada sumber clock yang dipilih.
Nilai yang ada pada Output Compare Register (OCR) akan di bandingkan dengan nilai yang ada pada
Timer/Counter setiap saat. Hasil dari proses pembandingan ini dapat digunakan waveform generation untuk
menghasilkan PWM (Pulse Width Modulation) atau output yang memiliki frekuensi yang berubah pada pin Output
Compare (OC0). Kejadian pembandingan output yang sesuai nilainya antara OCR dan nilai pada Timer/Counter
akan mengeset nilai pada Output Compare Flag (OCF0) yang dapat digunakan untuk menghasilkan permintaan
output compare interrupt.
Definisi
Beberapa definisi mengenai batasan nilai pada Timer/Counter0:
BOTTOM
MAX
TOP

Counter akan mencapai BOTTOM ketika bernilai 0x00
Counter akan mencapai MAX ketika bernilai 0xFF (dalam decimal 255)
Counter akan mencapai TOP ketika bernilai sama dengan nilai tertinggi dalam urutan
penghitungan. Nilai TOP ini dapat ditetapkan dari nilai fix seperti 0xFF (MAX) atau nilai yang
terdapat pada register OCR0. Penetapan nilai TOP ini bergantung pada mode operasi yang sedang
dijalankan

Unit Counter
Bagian utama dari Timer/Counter 8-bit ialah unit counter yang dapat diprogram secara bi-directional. Gambar
dibawah ini memperlihatkan blok diagram dari unit counter dan lingkungannya.

Deskripsi sinyal:
Count
Increment (menambah) atau decrement (mengurangi) TCNT0 dengan nilai 1
Direction
Untuk memilih antara menambah atau mengurangi
Clear
Clear TCNT0 (mengeset semua nilai menjadi 0)
TOP
Memberi sinyal bahwa TCNT0 telah mencapai nilai maksimum
BOTTOM
Memberi sinyal bahwa TCNT0 telah mencapai nilai minimum (nol)
Unit Output Compare
Komparator 8 bit secara kontinu membandingkan nilai TCNT0 dengan nilai register Output Compare (OCR0). Ketika
TCNT0 sama dengan OCR0, maka komparator akan memberi sinyal bahwa terjadi kesamaan. Kesamaan ini akan
mengeset Output Compare Flag (OCF0) pada saat clock cycle timer selanjutnya. Jika OCIE0 = 1 dan Global
Interrupt Flag di SREG di set, maka Output Compare Flag akan menghasilkan interupsi output compare. Flag OCF0
akan secara otomatis di clear kan ketika interupsi dieksekusi. Gambar dibawah ini memperlihatkan blok diagram
unit Output Compare.

Mode Operasi
Mode operasi ialah kelakuan dari Timer/Counter dan pin Output Compare. Mode ini dibedakan melalui kombinasi
dari bit mode Waveform Generation (WGM01:0) dan bit mode Compare Output (COM01:0). Mode Compare Output
tidak akan mempengaruhi alur penghitungan, sedangkan mode Waveform Generation mempengaruhinya. Bit-bit
COM01:0 mengatur apakan output PWM yang dihasilkan dibalik atau tidak (inverted atau non-inverted PWM).
Untuk mode yang non-PWM maka bit-bit COM01:0 akan mengontrol output akan di set, di clear, atau di balik
(toggle) saat terjadi compare match.
Mode-mode yang terdapat antara lain:
• Mode Normal
Mode operasi yang paling simpel ialah mode normal (WGM01:0 = 0). Pada mode ini arah penghitungan selalu
naik (incrementing), dan tidak terdapat clear terhadap counter yang dilaksanakan. Counter akan mengalami
overrun ketika telah mencapai nilai maksimumnya yaitu 8 bit (TOP = 0xFF) dan direstart dari bawah (0x00).
Pada operasi normal, Flag Overflow Timer/Counter (TOV0) akan di set pada saat clock cycle timer yang sama
ketika TCNT0 menjadi nol. Flag TOV0 ini jika digabungkan dengan dengan interupsi timer overflow yang akan
secara otomatis mengclearkan flag TOV0, maka resolusi timer akan dapat ditingkatkan melalui software.
• Mode Clear Timer on Compare (CTC) match
Pada mode CTC ini (WGM01:0 = 2), register OCR0 digunakan untuk memanipulasi resolusi counter. Pada
mode ini counter akan di clear menjadi nol ketika nilai counter (TCNT0) mengalami nilai yang sama dengan
OCR0. OCR0 mendefinisikan nilai TOP dari counter dan juga resolusi dari counter tersebut. Mode ini
memberikan kontrol yang lebih besar pada frekuensi output compare match. Hal ini pula mempermudah
operasi penghitungan event eksternal. Diagram timing untuk mode CTC ditunjukkan pada gambar. Nilai
counter (TCNT0) naik terus hingga terjadi compare match antara TCNT0 dan OCR0, lalu counter (TCNT0) di
clear kan (di nol kan).

Interupsi dapat dibangkitkan setiap kali nilai counter mencapai TOP dengan menggunakan flag OCF0. Jika
interupsi diaktifkan, maka interrupt handler routine (rutinitas yang akan dieksekusi ketika terjadi interupsi)
dapat digunakan untuk mengupdate nilai TOP. Bagaimanapun, mengubah nilai TOP dengan nilai yang dekat
dengan nilai BOTTOM ketika counter sedang berjalan dengan nilai prescaler yang rendah atau nol harus
dilakukan dengan ekstra hati-hati karena mode CTC tidak memiliki fitur double buffering. Jika nilai yang
dimasukkan ke dalam OCR0 lebih rendah daripada nilai saat itu yang terdapat pada TCNT0, maka counter
akan kehilangan event compare match. Counter akan menghitung hingga nilai maksimum (0xFF) lalu mulai
kembali dari 0x00 sebelum event compare match terjadi.
Untuk menghasilkan output yang berupa gelombang pada mode CTC, output OC0 dapat diset untuk mentoggle
logic level output tersebut setiap terjadi event compare match dengan mensetting mode Compare Output
menjadi mode toggle (COM01:0 = 1). Nilai OC0 tidak akan muncul pada port pin hingga data direction untuk
pin di set menjadi output. Baca kembali bagian Basic Input Output diatas pada seksi Port I/O sebagai output.
Frekuensi dari gelombang yang dibangkitkan akan memiliki frekuensi maksimum f
= f
/2 ketika OCR0
OC0

clk_I/O

diset bernilai nol (0x00). Frekuensi dari gelombang didefinisikan melalui persamaan sebagai berikut:

Variabel N merepresentasikan faktor nilai prescaler (1, 8, 64, 256, atau 1024)
Sama dengan mode operasi normal, flag TOV0 akan di set pada saat clock cycle timer yang sama ketika
peralihan dari MAX ke 0x00.
• Mode Fast PWM
Mode fast Pulse Width Modulation atau mode fast PWM (WGM01:0 = 3) memberikan opsi untuk
membangkitkan gelombang PWM yang berfrekuensi tinggi. Operasi fast PWM ini berbeda dengan dengan opsi
PWM lain yang ditandai dengan operasi kemiringan tunggalnya (single slope operation). Counter akan
menghitung mulai dari BOTTOM hingga MAX lalu restart kembali dari BOTTOM. Pada mode non-inverting
Compare Output, Output Compare (OC0) akan di clear kan (0) ketika terjadi event compare match antara
TCNT0 dan OCR0, dan di set (1) pada nilai BOTTOM. Pada mode inverting Compare Output, output di set
ketika terjadi event compare match dan di clear kan pada BOTTOM. Karena operasinya yang single slope,
maka frekuensi operasinya fast PWM dapat mencapai dua kali lebih tinggi dari frekuensi operasi mode phase
correct PWM yang menggunakan operasi dual slope. Frekuensi yang tinggi ini membuat mode fast PWM cocok
digunakan untuk aplikasi power regulation, rectification, dan aplikasi DAC (Digital to Analog Converter).
Frekuensi yang tinggi membolehkan penggunaan komponen fisik eksternal seperti kapasitor dan induktor yang
kecil yang dapat mengurangi biaya total sistem.
Pada mode fast PWM, counter akan menghitung secara naik (incremented) hingga nilai counter mencapai nilai
MAX. Counter kemudian di clear kan pada saat clock cycle timer selanjutnya. Diagram timing untuk mode fast
PWM ditunjukkan pada gambar. Nilai TCNT0 pada diagram ditunjukkan dengan setengah segitiga histogram
untuk mengilustrasikan operasi single slope. Garis panah horizontal kecil yang menandai kemiringan TCNT0
merepresentasikan event compare match antara TCNT0 dan OCR0.

Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai nilai MAX. Jika interupsi
diaktifkan, maka interrupt handler routine dapat digunakan untuk mengupdate nilai compare.
Pada mode fast PWM, unit compare dapat digunakan untuk membangkitkan gelombang PWM pada pin OC0.
Mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan non-inverted PWM dan inverted PWM dapat
dihasilkan dengan mengeset bit-bit tersebut menjadi 3. Nilai OC0 yang aktual akan dapat didapat pada port
pin jika data direction pada port pin di set sebagai ouput. Gelombang PWM dibangkitkan dengan mengeset
(atau mengclearkan) register OC0 pada saat terjadi compare match antara TCNT0 dan OCR0, dan
mengclearkan (atau mengeset) register OC0 pada clock cycle timer saat counter di clearkan (perubahan ketika
MAX menuju BOTTOM).
Frekuensi PWM dari output dapat dihitung melalui persamaan berikut ini:

Variabel N merepresentasikan nilai faktor prescaler (1, 8, 64, 256, 1024).
• Mode Phase Correct PWM
Mode phase correct PWM (WGM01:0 = 1) memberikan opsi untuk membangkitkan gelombang phase correct
PWM yang memiliki resolusi tinggi. Mode phase correct PWM ini berdasarkan pada operasi dual slope (dua
kemiringan yaitu kemiringan naik dan turun). Counter akan menghitung secara berulang-ulang dari BOTTOM
menuju MAX lalu dari MAX menuju BOTTOM. Pada mode non-inverting Compare Output, Output Compare
(OC0) akan di clear kan ketika terjadi event compare match antara TCNT0 dan OCR0 ketika penghitungan naik
(upcounting), dan di set ketika terjadi event compare match pada saat penghitungan mundur (downcounting).
Pada mode inverting Output Compare, operasinya di invert atau dibalik. Operasi dual slope memiliki frekuensi
maksimum yang lebih rendah daripada operasi single slope. Bagaimanapun, karena fitur kesimetrisan dari
mode PWM dual slope ini menjadikannya cocok untuk aplikasi kontrol motor.
Resolusi PWM untuk mode phase correct PWM di fix kan menjadi delapan bit. Pada mode phase correct PWM
counter akan melakukan penghitungan naik hingga mencapai nilai MAX. Ketika telah mencapai nilai MAX maka
arah penghitungan dibalik yaitu mundur atau berkurang. Nilai TCNT0 akan sama dengan nilai MAX dalam
waktu satu clock cycle timer. Diagram timing untuk mode phase correct PWM ini diperlihatkan pada gambar.
Nilai TCNT0 pada diagram menunjukkan bentuk histogram segitiga penuh untuk mengilustrasikan operasi dual
slope. Diagram ini memberikan ilustrasi output inverting dan non inverting. Garis panah horizon yang
menandai kemiringan TCNT0 merepresentasikan event compare match antara TCNT0 dan OCR0.

Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai BOTTOM. Flag interupsi dapat
digunakan untuk membangkitkan interupsi setiap kali counter mencapai nilai BOTTOM.
Pada mode phase correct PWM, unit compare dapat digunakan untuk membangkitkan gelombang PWM pada
pin OC0. Dengan mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan PWM non-inverting. Output PWM
inverting dapat dihasilkan dengan mengeset bit-bit COM01:0 menjadi 3. Nilai aktual OC0 akan terlihat pada
port pin jika data direction untuk port pin diset menjadi output. Gelombang PWM dibangkitkan dengan
mengclearkan (atau mengeset) register OC0 pada saat compare match antara TCNT0 dan OCR0 ketika counter
menghitung naik (increment), dan mengeset (atau mengclearkan) register OC0 pada saat compare match
antara TCNT0 dan OCR0 ketika counter melakukan penghitungan mundur (decrement). Frekuensi output PWM
ketika menggunakan phase correct PWM dapat dihitung melalui persamaan:

Variabel N merepresentasikan nilai faktor prescaler (1, 8, 64, 256, atau 1024)
Nilai ekstrim untuk register OCR0 merepresentasikan kasus spesial ketika membangkitkan output gelombang
PWM pada mode phase correct PWM. Jika OCR0 di set sama dengan BOTTOM, maka output akan secara
kontinyu bernilai low atau 0 dan jika OCR0 diset sama dengan MAX maka output akan secara kontinyu bernilai
high atau 1. untuk PWM inverted nilainya akan memiliki logika yang berkebalikan.
Pada permulaan perioda 2 pada gambar OCn memiliki transisi dari high menuju low walaupun tidak terdapat
compare match. Poin penting dari kejadian ini adalah untuk menjamin kesimetrisan di sekitar BOTTOM.
Terdapat dua kasus yang yang dapat menghasilkan transisi walaupun pada keadaan aslinya tidak terdapat
compare match:
� Nilai OCR0A berubah dari nilai MAX seperti pada gambar. Ketika nilai OCR0A ialah MAX maka nilai pin OCn
akan sama dengan hasil compare match ketika down counting. Untu memastikan kesimetrian disekitas
BOTTOM maka nilai OCn ketika MAX berkorespondensi dengan hasil compare match ketika up counting.
� Timer mulai menghitung pada nilai yang lebih besar dari OCR0A, dan untuk alasan itu akan mengalami
kehilangan event compare match dan juga perubahan pada OCn yang seharusnya terjadi ketika up
counting.
Deskripsi register timer/counter 8 bit
Timer/Counter Control Register (TCCR0)

• Bit 7 – FOC0 : Force Output Compare
Bit FOC0 hanya aktif ketika bit WGM00 menspesifikasikan mode non-PWM. Bagaimanapun, untuk memastikan
kompatibilitas dengan peralatan masa depan, bit ini harus diset nol ketika TCCR0 ditulis ketika beroperasi
pada mode PWM.
• Bit 6, 3 – WGM01:0 : Waveform Generation Mode
Bit ini mengontrol urutan penghitungan dari counter, sumber bagi nilai counter maksimum (TOP), dan tipe apa
dari Waveform Generation yang akan digunakan. Mode operasi yang disupport oleh unit Timer/Counter ialah:
mode Normal, mode Clear Timer on Compare Match (CTC), dan dua tipe mode PWM.

• Bit 5, 4 – COM01:0 : Compare Match Output Mode
Bit ini mengontrol kelakuan pin Output Compare (OC0). Jika satu atau lebih bit pada COM01:0 di set, maka
output OC0 akan mengesampingkan fungsionalitas normal port dari pin I/O yang terhubung padanya.
Bagaimanapun, harus dicatat bahwa bit Data Direction Register (DDR) yang berhubungan dengan pin OC0
harus di set dalam rangka untuk mengaktifkan driver output.
Ketika OC0 terhubung pada pin, fungsi dari bit-bit COM01:0 bergantung kepada settingan bit WGM01:0. Tabel
memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode Normal atau
mode CTC (non-PWM).

Tabel 40 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode fast
PWM.
Tabel 41 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode
phase correct PWM.

• Bit 2:0 - CS02:0 : Clock Select
Tiga buah bit Clock Select akan memilih sumber clock yang akan dipakai oleh Timer/Counter.

Jika mode pin eksternal digunakan untuk Timer/Counter0, transisi pada pin T0 akan memberi clock pada
counter walaupun pin tersebut dikonfigurasi sebagai pin output. Fitur ini memberikan kesempatan untuk
mengontrol clock secara software.
Timer/Counter Register - TCNT0

Register Timer/Counter memberikan akses langsung, baik untuk operasi baca dan tulis ke unit counter 8-bit
Timer/Counter0. Memodifikasi counter (TCNT0) ketika counter sedang berjalan, akan menampilkan resiko
kehilangan compare match antara register TCNT0 dan OCR0.
Output Compare Register - OCR0

Output Compare Register memiliki 8 bit nilai yang secara kontinyu dibandingkan dengan nilai counter (TCNT0).
Sebuah match atau kesamaan dapat digunakan untuk menghasilkan interupsi output compare, atau untuk
membangkitkan output berupa gelombang pada pin OC0.
Timer/Counter Interrupt Mask Register - TIMSK

• Bit 1 - OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable
Ketika bit OCIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi compare match
Timer/Counter0 diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika compare match pada
Timer/Counter0 terjadi atau dengan kata lain bit OCF0 diset di Timer/Counter Interrupt Flag Register - TIFR.
• Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable
Ketika bit TOIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi overflow Timer/Counter0
diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika overflow pada Timer/Counter0 terjadi atau
dengan kata lain bit TOV0 diset di Timer/Counter Interrupt Flag Register - TIFR.
Timer/Counter Interrupt Flag Register – TIFR

• Bit 1 - OCF0: Output Compare Flag 0
Bit OCF0 akan di set (1) ketika terjadi compare match antara Timer/Counter0 dan data pada OCR0 - Output
Compare Register. OCF0 akan di clearkan oleh hardware ketika mengeksekusi interrupt handling vektor yang
berkaitan.
• Bit 0 - TOV0: Timer/Counter0 Overflow Flag
Bit TOV akan di set (1) ketika terjadi overflow pada Timer/Counter0. TOV akan di clear kan oleh hardware
ketika mengeksekusi interrupt handling vektor yang berkaitan.
2. TIMER/COUNTER1 (16-BIT)
Unit Timer/Counter 16-bit mengijinkan timing eksekusi program yang akurat (event management), pembangkitan
gelombang, dan mengukur timing sinyal. Fitur utama unit ini adalah:
• Desain 16 bit yang sesungguhnya
• Dua unit independen Output Compare
• Double buffered Output Compare Register
• Satu buah unit Input Capture
• Clear Timer ketika terjadi Compare Match (Auto Reload)
• Phase Correct PWM yang bebas glitch
• Periode PWM yang variabel
• Generator Frekuensi
• External Event Counter
• Empat buah sumber Interupsi independen (TOV1, OCF1A, OCF1B, dan ICF1)
Register
Register Timer/Counter (TCNT1), Output Compare Register (OCR1A/B), dan Input Capture Register (ICR1) ialah
register 16-bit.
Untuk melakukan penulisan 16-bit, high byte harus dituliskan terlebih dahulu sebelum low byte. Untuk melakukan
pembacaan 16-bit, pembacaan low byte dilakukan terlebih dahulu sebelum pembacaan high byte.
Definisi
BOTTOM
MAX
TOP

Unit Counter

Counter akan mencapai BOTTOM ketika bernilai 0x0000.
Counter akan mencapai MAXimum ketika bernilai 0xFFFF (desimal 65535).
Counter akan mencapai TOP ketika mencapai nilai tertinggi dalam alur penghitungan. Nilai TOP
dapat dimasukkan ke dalam salah satu nilai fix: 0x00FF, 0x01FF, atau 0x03FF atau pada nilai
yang tersimpan pada register OCR1A atau ICR1. Pemasukan nilai TOP ini bergantung pada
mode operasi yang dijalankan.

Bagian utama dari Timer/Counter 16-bit ialah sebuah unit counter 16-bit yang dapat diprogram secara bidirectional. Gambar memperlihatkan blok diagram counter dan sekelilingnya.
Deskripsi sinyal (sinyal internal):
Count
Direction
Clear
TOP
BOTTOM

Increment atau decrement TCNT dengan nilai 1.
Pilih antara increment dan decrement
Clear TCNT1 (mengeset semua bit menjadi nol)
Memberi sinyal bahwa TCNT1 telah mencapai nilai maksimum
Memberi sinyal bahwa TCNT1 telah mencapai nilai minimum (nol)

Counter 16-bit dipetakan ke dalam dua buah lokasi I/O memori 8-bit: Counter High (TCNT1H) mengandung
delapan bit paling atas dari counter, dan Counter Low (TCNT1L) mengandung delapan bit yang bawah. Register
TCNT1H hanya dapat diakses secara indirect oleh CPU. Ketika CPU mengakses lokasi I/O TCNT1H, CPU akan
mengakses high byte register temporary (TEMP). Register temporary ini diupdate dengan nilai TCNT1H ketika
TCNT1L dibaca, dan TCNT1H diupdate dengan nilai pada register temporary ketika TCNT1L ditulis.
Bergantung pada mode operasi yang digunakan, counter akan di clear kan, di increment, atau di decrement setiap
clock timer. Sumber clock timer ini dapat dibangkitkan dari sumber internal atau eksternal, yang dipilih melalui bit
Clock Select (CS12:0). Ketika tidak ada sumber clock yang dipilih (CS12:0 = 0) maka timer akan berhenti.
Alur penghitungan ditentukan dengan mengeset bit-bit Waveform Generation Mode (WGM13:0) yang berlokasi di
Timer/Counter Control Register A dan B (TCCR1A dan TCCR1B).
Mode Operasi
Mode operasi ialah kelakuan dari Timer/Counter dan pin output compare yang didefinisikan melalui kombinasi bitbit yang ada pada Waveform Generation mode (WGM13:0) dan bit-bit pada Compare Output mode (COM1x1:0).
Bit-bit mode Compare Output tidak mempengaruhi alur penghitungan, sedangkan bit-bit mode Waveform
Generation mempengaruhi. Bit-bit COM1x1:0 mengontrol apakah output PWM yang dibangkitkan akan di invert
atau tidak (inverted atau non-inverted PWM). Untuk mode non-PWM, bit-bit COM1x1:0 mengontrol apakah output
akan di set, di clear atau di toggle ketika terjadi compare match.
• Mode Normal
Mode operasi yang paling simpel ialah mode Normal (WGM13:0 = 0). Pada mode ini arah penghitungan selalu
naik atau up counting (incrementing), dan tidak ada clear counter yang dilakukan. Counter akan secara simple
mengalami overrun atau overflow ketika telah mencapai nilai maksimum 16-bit.
KOMUNIKASI MIKROKONTROLER ATMEGA32 DAN PC DENGAN METODE USART
Pada bagian ini akan dibahas sedikit mengenai salah satu fitur mikrokontroler AVR yakni ATMega32 untuk
berkomunikasi dengan komputer melalui port serial / DB9 dengan 9 buah pin yang dapat dijumpai di belakang CPU
komputer desktop. Untuk menyesuaikan level tegangan dari mikrokontroler ke port serial diperlukan IC MAX232
seperti terlihat pada gambar di bawah

Pada IC MAX232, pin nomor 11 (TXD) dihubungkan ke pin 14 (RXD) dari ATMega32. Sedangkan pin nomor 12
pada IC MAX232 (RXD) dihubungkan ke pin 15 (TXD) dari ATMega32.
Berikut adalah source code yang dipergunakan untuk melakukan komunikasi secara serial:
#include <mega32.h>
#include <stdio.h>
#include <lcd.h>
#include <delay.h>
//************************ #asm for LCD routine *****************************
#asm
.equ __lcd_port=0x15 ;PORTC
.equ __lcd_wait_state=0x0a
#endasm
//************************ #define for USART routine *****************************
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
//************************** Global Variable Declaration ***************************
char Str[16];
char slave_data='0'; //variabel u/ memastikan slave telah selesai melakukan tugasnya
//************************** USART Routine ***************************
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void) //untuk melakukan aksi setelah menerima data masuk
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE)
rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
//bagian ini mengambil data kiriman dan menampilkannya ke lcd
slave_data = data;
lcd_gotoxy(0,1);
sprintf(Str,"%s",slave_data);
lcd_puts(Str);
//delay_ms(400);
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE)
rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE)
tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used#endif
void main()
{
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(Str,"Agfa keren bgt!!");
lcd_puts(Str);
delay_ms(1000);
//perintah printf dibawah ini digunakan untuk mengirim data melalui serial
printf("1");
while(slave_data != 'x' )
{};
}
ANALOG TO DIGITAL CONVERTER (ADC)

Pada mikrokontroler AVR terdapat fitur ADC yang dapat digunakan untuk melakukan pembacaan tegangan analog
ke dalam bentuk digital sehingga ADC banyak digunakan dalam perancangan alat ukur digital. Secara umum,
proses inisialisasi ADC meliputi proses penentuan clock, tegangan referensi, format output data, dan mode
pembacaan.
Register ADMUX
Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer Selection Register), ADCSRA (ADC Control and
Status Register), dan SFIOR (Special Function IO Register). ADMUX merupakan register 8 bit yang berfungsi
menentukan tegangan referensi ADC, format data output, dan saluran ADC yang digunakan.

Untuk memilih channel ADC yang digunakan (single ended atau diferensial), dilakukan dengan mengatur nilai
MUX4 :0. Misalnya channel ADC0 sebagai input ADC, maka MUX4 :0 diberi nilai 00000B. Informasi lebih lengkap
dapat dilihat pada datasheet mikrokontroler yang dipakai.
Konfigurasi ADC
Tegangan referensi ADC dapat ditentukan antara lain dari pin AREF, pin AVCC atau menggunakan tegangan
referensi internal mikrokontroler sebesar 2.56V. Agar fitur ADC mikrokontroler dapat digunakan maka ADEN (ADC
Enable, dalam I/O register ADCSRA) harus diberi nilai 1.
Setelah konversi selesai (ADIF high), hasil konversi dapat diperoleh pada register hasil (ADCL, ADCH).Untuk
konversi single ended, hasilnya ialah :

Di mana VIN ialah tegangan pada input yang dipilih dan VREF merupakan tegangan referensi. Jika hasil ADC
=000H, maka menunjukkan tegangan input sebesar 0V, jika hasil ADC=3FFH menunjukkan tegangan input sebesar
tegangan referensi dikurangi 1 LSB.
Sebagai contoh, jika diberikan VIN sebesar 0.2V dengan VREF 5V, maka hasil konversi ADC ialah 41. Jika
menggunakan differensial channel, hasilnya ialah 40.96, yang bila digenapkan bisa sekitar 39,40,41 karena
ketelitian ADC ATmega 16 sebesar +- 2LSB. Jika yang digunakan saluran diferensial, maka hasilnya ialah :

Di mana VPOS ialah tegangan pada input pin positif, VNEG ialah tegangan input pada pin negatif, GAIN ialah
faktor penguatan dan VREF ialah tegangan referensi yang digunakan. Kita dapat mengkonfigurasi fasilitas ADC
pada CodeVision AVR sebagai berikut :
Melakukan setting penggunaan ADC dengan CodeWizardAVR
Dengan mencentang ADC Enabled akan mengaktifkan on-chip ADC. Dengan mencentang Use 8 bits, maka hanya
8 bit terpenting yang digunakan. Hasil konversi 10 bit dapat dibaca pada ADC Data Registers ADCH dan ADCL.
Misalnya, jika hasil konversi ADC bernilai 54(36H), dalam 10 bit biner ditulis dengan 00 0011 0110B. Jika dalam
format right adjusted (ADLAR=0), maka I/O register ADCH berisi 0000 0000B(00H) dan I/O register ADCL berisi
0011 0110B (36H).
Penerapan ADC untuk pengukuran suhu
Salah satu aplikasi ADC pada mikrokontroler AVR (di sini digunakan ATMega16) adalah untuk melakukan
pengukuran suhu. Dalam hal ini, transduser / pengubah suhu ke dalam bentuk tegangan yang digunakan adalah IC
LM35.
Menerima data ADC
Langkah-langkah:
1.

Siapkan Smart AVR ATmega 16 ver. 2.0, dan hubungkan

dengan kabel AVR ISP Programmer ke PC.

Hubungkan juga kabel serial dari mikrokontroler ke PC. Hubungan keluaran sensor suhu LM35 di PA.0,
dengan susunan sensor sebagai berikut:

Sensor suhu LM35

2.

Buat program yang otomatis digenerate di bawah ini, dengan terlebih dahulu mengkonfigurasi ADC
menggunakan CodeWizardAVR.
Konfigurasi ADC dan Serial

Berikut adalah source code pengukuran suhu menggunakan ADC untuk ATMega16 (Nama file ADC.c)
// Percobaan 7.1,

percobaan terima data ADC dari sensor LM35

// LED terhubung di Port B
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x60
flash unsigned char string1[]={"data

adc:

%d; "};

// Baca 8 bit terpenting
unsigned char read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Mulai konversi ADC
ADCSRA|=0x40;
// Tunggu konversi ADC selesai
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void) {
// Inisialisasi Port B
PORTB=0xFF;
DDRB=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 31,250 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA7;
SFIOR&=0x1F;
while (1)
{
//Panggil fungsi

baca adc di sini

};
}
3.

Lakukan kompilasi dan jalankan. Sambil memanaskan LM35, lihat perubahan nyala LED di port B atau di
Hyperterminal.

Contenu connexe

Tendances

Modul simulasi pemograman mikrokontroler
Modul simulasi pemograman mikrokontrolerModul simulasi pemograman mikrokontroler
Modul simulasi pemograman mikrokontrolerpersonal
 
Presentasi workshop cvavr
Presentasi workshop cvavrPresentasi workshop cvavr
Presentasi workshop cvavrPriyo Harjiyono
 
Modul 2 teknik pemrograman mengenal bahasa c dan compiler
Modul 2 teknik pemrograman mengenal bahasa c dan compilerModul 2 teknik pemrograman mengenal bahasa c dan compiler
Modul 2 teknik pemrograman mengenal bahasa c dan compilerBeny Abd
 
Modul algoritma dan pemograman
Modul algoritma dan pemogramanModul algoritma dan pemograman
Modul algoritma dan pemogramanPANJI_ADITYAN
 
Pemrograman c-wakuadratn
Pemrograman c-wakuadratnPemrograman c-wakuadratn
Pemrograman c-wakuadratnLanoy Jr.
 
Modul teknik pemrograman mikrokontroler dan mikroprosesor
Modul teknik pemrograman mikrokontroler dan mikroprosesorModul teknik pemrograman mikrokontroler dan mikroprosesor
Modul teknik pemrograman mikrokontroler dan mikroprosesorBeny Abd
 
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010eddie Ismantoe
 
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMAN
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMANPENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMAN
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMANNur Kholifah Hidayah
 
Modul praktikum aplikasi c
Modul praktikum aplikasi cModul praktikum aplikasi c
Modul praktikum aplikasi cBebebecaaa
 
Pengantar algoritma dan pemrograman
Pengantar algoritma dan pemrogramanPengantar algoritma dan pemrograman
Pengantar algoritma dan pemrogramanMAFauzan
 
Bahasa c++ (p)
Bahasa c++ (p)Bahasa c++ (p)
Bahasa c++ (p)Eddy_TKJ
 
Materi matakuliah bahasa c
Materi matakuliah bahasa cMateri matakuliah bahasa c
Materi matakuliah bahasa cIzhan Nassuha
 
Pemrogaman Visual Basic.NET (Modul 1)
Pemrogaman Visual Basic.NET (Modul 1)Pemrogaman Visual Basic.NET (Modul 1)
Pemrogaman Visual Basic.NET (Modul 1)Materi Kuliah Online
 
Langkah Dasar Pemrograman pada Aplikasi Dev C++
Langkah Dasar Pemrograman pada Aplikasi Dev C++Langkah Dasar Pemrograman pada Aplikasi Dev C++
Langkah Dasar Pemrograman pada Aplikasi Dev C++Ishardi Nassogi
 
Mikrokontroler io tombol dan led
Mikrokontroler io tombol dan ledMikrokontroler io tombol dan led
Mikrokontroler io tombol dan ledJodit Sulistyo
 

Tendances (20)

Modul visual c++
Modul visual c++Modul visual c++
Modul visual c++
 
Modul simulasi pemograman mikrokontroler
Modul simulasi pemograman mikrokontrolerModul simulasi pemograman mikrokontroler
Modul simulasi pemograman mikrokontroler
 
Presentasi workshop cvavr
Presentasi workshop cvavrPresentasi workshop cvavr
Presentasi workshop cvavr
 
Modul 2 teknik pemrograman mengenal bahasa c dan compiler
Modul 2 teknik pemrograman mengenal bahasa c dan compilerModul 2 teknik pemrograman mengenal bahasa c dan compiler
Modul 2 teknik pemrograman mengenal bahasa c dan compiler
 
Modul algoritma dan pemograman
Modul algoritma dan pemogramanModul algoritma dan pemograman
Modul algoritma dan pemograman
 
Pemrograman c-wakuadratn
Pemrograman c-wakuadratnPemrograman c-wakuadratn
Pemrograman c-wakuadratn
 
Modul teknik pemrograman mikrokontroler dan mikroprosesor
Modul teknik pemrograman mikrokontroler dan mikroprosesorModul teknik pemrograman mikrokontroler dan mikroprosesor
Modul teknik pemrograman mikrokontroler dan mikroprosesor
 
Modul c++
Modul c++Modul c++
Modul c++
 
Pascal
PascalPascal
Pascal
 
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010
Modul Pratikum Algoritma dan Pemrograman dalam Bahasa Visual C++ 2010
 
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMAN
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMANPENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMAN
PENGENALAN SSISTEM OPERASI, IDE VISUAL C++, DAN ALGORITMA PEMROGRAMAN
 
Laporan praktikum dpk modul 1
Laporan praktikum dpk modul 1Laporan praktikum dpk modul 1
Laporan praktikum dpk modul 1
 
Modul praktikum aplikasi c
Modul praktikum aplikasi cModul praktikum aplikasi c
Modul praktikum aplikasi c
 
Pengantar algoritma dan pemrograman
Pengantar algoritma dan pemrogramanPengantar algoritma dan pemrograman
Pengantar algoritma dan pemrograman
 
Bahasa c++ (p)
Bahasa c++ (p)Bahasa c++ (p)
Bahasa c++ (p)
 
Materi matakuliah bahasa c
Materi matakuliah bahasa cMateri matakuliah bahasa c
Materi matakuliah bahasa c
 
Pemrogaman Visual Basic.NET (Modul 1)
Pemrogaman Visual Basic.NET (Modul 1)Pemrogaman Visual Basic.NET (Modul 1)
Pemrogaman Visual Basic.NET (Modul 1)
 
C/C++ programming
C/C++ programmingC/C++ programming
C/C++ programming
 
Langkah Dasar Pemrograman pada Aplikasi Dev C++
Langkah Dasar Pemrograman pada Aplikasi Dev C++Langkah Dasar Pemrograman pada Aplikasi Dev C++
Langkah Dasar Pemrograman pada Aplikasi Dev C++
 
Mikrokontroler io tombol dan led
Mikrokontroler io tombol dan ledMikrokontroler io tombol dan led
Mikrokontroler io tombol dan led
 

Similaire à 6 modul avr

Sekilas20codevisionavr
Sekilas20codevisionavrSekilas20codevisionavr
Sekilas20codevisionavrTimbul Mu
 
Membuat program running led menggunakan
Membuat program running led menggunakanMembuat program running led menggunakan
Membuat program running led menggunakanAnwar Rahman
 
Aplikasi komunikasi serial mikrokontroller
Aplikasi komunikasi serial mikrokontrollerAplikasi komunikasi serial mikrokontroller
Aplikasi komunikasi serial mikrokontrollerWeldan Kusuf
 
Pertemuan 1 Pengenalan CodeBlocks (CB)
Pertemuan 1 Pengenalan CodeBlocks (CB)Pertemuan 1 Pengenalan CodeBlocks (CB)
Pertemuan 1 Pengenalan CodeBlocks (CB)Endang Retnoningsih
 
Pask 1 14_s16010_sandro
Pask 1 14_s16010_sandroPask 1 14_s16010_sandro
Pask 1 14_s16010_sandroSandroSiagian
 
Pertemuan 6 Mikroprosessor dan Mikrokontroler
Pertemuan 6 Mikroprosessor dan MikrokontrolerPertemuan 6 Mikroprosessor dan Mikrokontroler
Pertemuan 6 Mikroprosessor dan MikrokontrolerAhmad Nawawi, S.Kom
 
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdf
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdfDasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdf
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdfRizaJr
 
pemrograman-dasar-cpp_01-perkenalan.pdf
pemrograman-dasar-cpp_01-perkenalan.pdfpemrograman-dasar-cpp_01-perkenalan.pdf
pemrograman-dasar-cpp_01-perkenalan.pdfRegarianTaring1
 
Octave dan Mikrokontroller Communication
Octave dan Mikrokontroller CommunicationOctave dan Mikrokontroller Communication
Octave dan Mikrokontroller CommunicationLusiana Diyan
 
Tugas so2 fitriana bakar044
Tugas so2 fitriana bakar044Tugas so2 fitriana bakar044
Tugas so2 fitriana bakar044charis_fit
 
pendahuluanv2.ppt
pendahuluanv2.pptpendahuluanv2.ppt
pendahuluanv2.pptKemangKres
 
Pertemuan 1 Pengenalan Code Blocks
Pertemuan 1 Pengenalan Code BlocksPertemuan 1 Pengenalan Code Blocks
Pertemuan 1 Pengenalan Code BlocksEndang Retnoningsih
 
Makalah praktikum mikro
Makalah praktikum mikroMakalah praktikum mikro
Makalah praktikum mikroAnjar OI
 
Pembahasan UKK TKJ Paket 1
Pembahasan UKK TKJ Paket 1Pembahasan UKK TKJ Paket 1
Pembahasan UKK TKJ Paket 1Dt Yunizaldi
 
PID Implementation on Octave
PID Implementation on OctavePID Implementation on Octave
PID Implementation on OctaveLusiana Diyan
 

Similaire à 6 modul avr (20)

Sekilas20codevisionavr
Sekilas20codevisionavrSekilas20codevisionavr
Sekilas20codevisionavr
 
Laporan led
Laporan ledLaporan led
Laporan led
 
2. CodeBlocks & C++
2. CodeBlocks & C++2. CodeBlocks & C++
2. CodeBlocks & C++
 
Membuat program running led menggunakan
Membuat program running led menggunakanMembuat program running led menggunakan
Membuat program running led menggunakan
 
Aplikasi komunikasi serial mikrokontroller
Aplikasi komunikasi serial mikrokontrollerAplikasi komunikasi serial mikrokontroller
Aplikasi komunikasi serial mikrokontroller
 
Pertemuan 1 Pengenalan CodeBlocks (CB)
Pertemuan 1 Pengenalan CodeBlocks (CB)Pertemuan 1 Pengenalan CodeBlocks (CB)
Pertemuan 1 Pengenalan CodeBlocks (CB)
 
Pask 1 14_s16010_sandro
Pask 1 14_s16010_sandroPask 1 14_s16010_sandro
Pask 1 14_s16010_sandro
 
Pertemuan 6 Mikroprosessor dan Mikrokontroler
Pertemuan 6 Mikroprosessor dan MikrokontrolerPertemuan 6 Mikroprosessor dan Mikrokontroler
Pertemuan 6 Mikroprosessor dan Mikrokontroler
 
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdf
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdfDasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdf
Dasar-Pemrograman-Modul-1-Pengenalan-Pemrograman.pdf
 
pemrograman-dasar-cpp_01-perkenalan.pdf
pemrograman-dasar-cpp_01-perkenalan.pdfpemrograman-dasar-cpp_01-perkenalan.pdf
pemrograman-dasar-cpp_01-perkenalan.pdf
 
Octave dan Mikrokontroller Communication
Octave dan Mikrokontroller CommunicationOctave dan Mikrokontroller Communication
Octave dan Mikrokontroller Communication
 
Assembly
AssemblyAssembly
Assembly
 
Tugas so2 fitriana bakar044
Tugas so2 fitriana bakar044Tugas so2 fitriana bakar044
Tugas so2 fitriana bakar044
 
pendahuluanv2.ppt
pendahuluanv2.pptpendahuluanv2.ppt
pendahuluanv2.ppt
 
Pertemuan 1 Pengenalan Code Blocks
Pertemuan 1 Pengenalan Code BlocksPertemuan 1 Pengenalan Code Blocks
Pertemuan 1 Pengenalan Code Blocks
 
Bahasa assemler
Bahasa assemlerBahasa assemler
Bahasa assemler
 
Pertemuan_2
Pertemuan_2Pertemuan_2
Pertemuan_2
 
Makalah praktikum mikro
Makalah praktikum mikroMakalah praktikum mikro
Makalah praktikum mikro
 
Pembahasan UKK TKJ Paket 1
Pembahasan UKK TKJ Paket 1Pembahasan UKK TKJ Paket 1
Pembahasan UKK TKJ Paket 1
 
PID Implementation on Octave
PID Implementation on OctavePID Implementation on Octave
PID Implementation on Octave
 

Dernier

UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptx
UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptxUTS CT (ppg prajabatan gelombang 1 tahun 2023).pptx
UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptxYusufAmirudin3
 
Program Roots Indonesia - Aksi Nyata.pdf
Program Roots Indonesia - Aksi Nyata.pdfProgram Roots Indonesia - Aksi Nyata.pdf
Program Roots Indonesia - Aksi Nyata.pdfrizalrulloh1992
 
Materi Rotasi Bumi Kelas 6 Sekolah Dasar
Materi Rotasi Bumi Kelas 6 Sekolah DasarMateri Rotasi Bumi Kelas 6 Sekolah Dasar
Materi Rotasi Bumi Kelas 6 Sekolah Dasarmuhldorianto
 
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docx
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docxKISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docx
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docxrulimustiyawan37
 
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdf
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdfDOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdf
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdfssuserb45274
 
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama Islam
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama IslamKELOMPOK 2 PUTARAN 2 Mata kuliah Agama Islam
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama IslamabdulhamidalyFKIP
 
sifat sifat rasul rasul allah yang wajibpptx
sifat sifat rasul rasul allah yang wajibpptxsifat sifat rasul rasul allah yang wajibpptx
sifat sifat rasul rasul allah yang wajibpptxjusriadi72
 
keutamaan dan hikmah shaalat fardhu .pdf
keutamaan dan hikmah shaalat fardhu .pdfkeutamaan dan hikmah shaalat fardhu .pdf
keutamaan dan hikmah shaalat fardhu .pdfatsira1
 
Sasaran dan Pengembangan Sikap Profesional Guru.pptx
Sasaran dan Pengembangan Sikap Profesional Guru.pptxSasaran dan Pengembangan Sikap Profesional Guru.pptx
Sasaran dan Pengembangan Sikap Profesional Guru.pptxFidelaNiam
 
Menyiapkan Guru Masa Depan yang Bagus da
Menyiapkan Guru Masa Depan yang Bagus daMenyiapkan Guru Masa Depan yang Bagus da
Menyiapkan Guru Masa Depan yang Bagus daWijaya Kusumah
 
,..........Penyalahgunaan Narkotika.pptx
,..........Penyalahgunaan Narkotika.pptx,..........Penyalahgunaan Narkotika.pptx
,..........Penyalahgunaan Narkotika.pptxfurqanridha
 
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...Shoffan shoffa
 
Algoritma dan Pemrograman Aplikasi Scratch
Algoritma dan Pemrograman Aplikasi ScratchAlgoritma dan Pemrograman Aplikasi Scratch
Algoritma dan Pemrograman Aplikasi ScratchFarichah Riha
 
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan murid
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan muridAksi Nyata Modul 3.3.pdf tentang kepemimpinan murid
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan muridYusnelMarni
 
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...Aminullah Assagaf
 
MATERI PESANTREN KILAT RAMADHAN AQIDAH ISLAM.pptx
MATERI PESANTREN KILAT RAMADHAN  AQIDAH ISLAM.pptxMATERI PESANTREN KILAT RAMADHAN  AQIDAH ISLAM.pptx
MATERI PESANTREN KILAT RAMADHAN AQIDAH ISLAM.pptxSuarniSuarni5
 
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptx
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptxPaket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptx
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptxDarmiahDarmiah
 
Seminar Seri AI Talks - AI dan Media Kristen
Seminar Seri AI Talks - AI dan Media KristenSeminar Seri AI Talks - AI dan Media Kristen
Seminar Seri AI Talks - AI dan Media KristenSABDA
 
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIK
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIKcontoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIK
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIKTaufik241763
 

Dernier (20)

UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptx
UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptxUTS CT (ppg prajabatan gelombang 1 tahun 2023).pptx
UTS CT (ppg prajabatan gelombang 1 tahun 2023).pptx
 
Program Roots Indonesia - Aksi Nyata.pdf
Program Roots Indonesia - Aksi Nyata.pdfProgram Roots Indonesia - Aksi Nyata.pdf
Program Roots Indonesia - Aksi Nyata.pdf
 
Materi Rotasi Bumi Kelas 6 Sekolah Dasar
Materi Rotasi Bumi Kelas 6 Sekolah DasarMateri Rotasi Bumi Kelas 6 Sekolah Dasar
Materi Rotasi Bumi Kelas 6 Sekolah Dasar
 
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docx
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docxKISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docx
KISI-KISI DAN KARTU SOAL INFORMATIKA PAKET A.docx
 
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdf
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdfDOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdf
DOKUMEN PENJAJARAN_KSSR MATEMATIK TAHAP 1_EDISI 3.pdf
 
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama Islam
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama IslamKELOMPOK 2 PUTARAN 2 Mata kuliah Agama Islam
KELOMPOK 2 PUTARAN 2 Mata kuliah Agama Islam
 
sifat sifat rasul rasul allah yang wajibpptx
sifat sifat rasul rasul allah yang wajibpptxsifat sifat rasul rasul allah yang wajibpptx
sifat sifat rasul rasul allah yang wajibpptx
 
keutamaan dan hikmah shaalat fardhu .pdf
keutamaan dan hikmah shaalat fardhu .pdfkeutamaan dan hikmah shaalat fardhu .pdf
keutamaan dan hikmah shaalat fardhu .pdf
 
Sasaran dan Pengembangan Sikap Profesional Guru.pptx
Sasaran dan Pengembangan Sikap Profesional Guru.pptxSasaran dan Pengembangan Sikap Profesional Guru.pptx
Sasaran dan Pengembangan Sikap Profesional Guru.pptx
 
Menyiapkan Guru Masa Depan yang Bagus da
Menyiapkan Guru Masa Depan yang Bagus daMenyiapkan Guru Masa Depan yang Bagus da
Menyiapkan Guru Masa Depan yang Bagus da
 
,..........Penyalahgunaan Narkotika.pptx
,..........Penyalahgunaan Narkotika.pptx,..........Penyalahgunaan Narkotika.pptx
,..........Penyalahgunaan Narkotika.pptx
 
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...
Implementasi Model pembelajaran STEAM Holistik-Integratif Berbasis Digital Me...
 
Algoritma dan Pemrograman Aplikasi Scratch
Algoritma dan Pemrograman Aplikasi ScratchAlgoritma dan Pemrograman Aplikasi Scratch
Algoritma dan Pemrograman Aplikasi Scratch
 
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan murid
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan muridAksi Nyata Modul 3.3.pdf tentang kepemimpinan murid
Aksi Nyata Modul 3.3.pdf tentang kepemimpinan murid
 
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...
Aminullah Assagaf_Regresi Lengkap 19_8 Nov 2023_Inc. Data panel & Perbandinga...
 
MATERI PESANTREN KILAT RAMADHAN AQIDAH ISLAM.pptx
MATERI PESANTREN KILAT RAMADHAN  AQIDAH ISLAM.pptxMATERI PESANTREN KILAT RAMADHAN  AQIDAH ISLAM.pptx
MATERI PESANTREN KILAT RAMADHAN AQIDAH ISLAM.pptx
 
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptx
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptxPaket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptx
Paket Substansi_Pengelolaan Kinerja Guru dan KS [19 Dec].pptx
 
DEFINISI DAN KONTEKS MANAJEMEN ISU DAN KRISIS.pptx
DEFINISI DAN KONTEKS MANAJEMEN ISU DAN KRISIS.pptxDEFINISI DAN KONTEKS MANAJEMEN ISU DAN KRISIS.pptx
DEFINISI DAN KONTEKS MANAJEMEN ISU DAN KRISIS.pptx
 
Seminar Seri AI Talks - AI dan Media Kristen
Seminar Seri AI Talks - AI dan Media KristenSeminar Seri AI Talks - AI dan Media Kristen
Seminar Seri AI Talks - AI dan Media Kristen
 
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIK
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIKcontoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIK
contoh DOKUMEN AKSI NYATA DALAM HAL PENERAPAN COACHING KEPADA PESERTA DIDIK
 

6 modul avr

  • 1. MODUL TRAINING MIKROKONTROLER AVR BIDANG KEPROFESIAN BADAN PENGURUS HME ITB 2009/2010 DIVISI WORKSHOP HME ITB
  • 2. PENDAHULUAN Mikrokontroller AVR memiliki arsitektur RISC 8 bit, dimana semua instruksi dikemas dalam kode 16-bit (16-bits word) dan sebagian besar instruksi dieksekusi dalam satu siklus clock, berbeda dengan instruksi MCS51 yang membutuhkan 12 siklus clock. Hal ini terjadi karena perbedaan arsitektur yang dipakai. AVR menggunakan arsitektur RISC (Reduced Instruction Set Computing) sedangkan MCS51 menggunakan arsitektur CISC (Complex Instruction Set Computing). AVR secara umum dapat dibagi menjadi empat kategori antara lain; ATtiny, AT90Sxx, ATmega, dan AT86RFxx. Yang membedakan keempat kategori diatas secara mendasar ialah ukuran memori, peripheral, dan fungsinya. Skematik sistem minimum dari AVR versi DIP (Dual Inline Package) 40 pin disajikan pada gambar dibawah ini: Skematik ISP dongle STK200 yang dihubungkan ke port parallel pada komputer untuk mendownload program dari komputer ke mikrokontroler AVR: Nilai C1 = 100nF dan R1 = ?
  • 3. CodeVisionAVR C Compiler Pendahuluan Pada Kontes Robot Cerdas Indonesia (KRCI) bahasa pemrograman yang umum dipakai ialah bahasa C. Bahasa ini dipakai karena lebih dekat dan mudah dimengerti oleh manusia. Namun bahasa ini kurang machine friendly. Sehingga untuk beberapa akses membutuhkan code dalam bahasa assembly. Kelebihan yang dimiliki bahasa C adalah dapat dimasukkannya code assembly dalam code C. Program CodeVisionAVR ini tidaklah gratis. Namun banyak versi evaluasi yang tersedia. Versi evaluasi ini hanya mengijinkan sebagian kecil code dari total code yang bisa di burn ke dalam mikrokontroler. Misal kapasitas flash mikrokontroler sebesar 8KB maka total code yang bisa di compile sekitar 1 KB. Sebenarnya terdapat alternatif lain untuk pemrograman dalam bahasa C dengan menggunakan software WinAVR yang gratis. Sebagai permulaan maka penulis akan sedikit mencoba memprogram AVR dengan menggunakan CodeVisionAVR karena source code-nya telah tersedia. Selain itu penulis telah mendapatkan beberapa sample hasil pengalaman dan percobaan dari code sendiri serta code gratis yang disediakan di internet. Semua code yang terlampir disini sebagian besar merupakan program robot otaku. Robot ini diperlombakan pada KRCI 2006 di balairung UI. Penulis menggunakan program CodeVisionAVR C Compiler v1.24.7e Fitur-fitur yang dimiliki CodeVisionAVR terbilang lengkap. Program ini menyediakan interface hyperterminal didalamnya. Hyperterminal ini dapat digunakan untuk berkomunikasi antara mikrokontroler dengan komputer. Untuk proses pembakaran atau pengisian program ke dalam mikrokontroler terdapat tool tersendiri. Untuk proses debugger program ini akan menyediakan link pada AVR studio 4 yang memang telah memiliki fitur tersebut. Atau jika ingin, sesudah program C di compile oleh CodeVisionAVR maka akan dihasilkan file *.cof yang dapat disimulasikan langsung di AVR studio 4. Project Management Setiap akan membuat program baru pada CodeVisionAVR, kita akan diarahkan untuk membuat project terlebih dahulu. Pada menu File pilih New lalu lalu klik Project dan klik OK.
  • 4. CodeVisionAVR akan menanyakan apakah anda akan menggunakan fasilitas CodeWizardAVR. Fasilitas ini sangatlah berguna jika anda tidak ingin bersusah payah melakukan settingan dengan mengetik codecode tertentu yang banyak dan kompleks. Intinya terdapat tab-tab yang tinggal klik dan anda akan langsung disajikan contoh kodenya. Contohnya jika anda ingin membuat program yang memakai eksternal interrupt maka tinggal pilih tab External IRQ pada tampilan CodeWizard. Klik pada INT 0 Enabled untuk memilih external interrupt 0 dan pilih mode pembangkitan interrupt yang ingin digunakan. Mode pembangkitan eksternal interrupt terdiri dari rising edge atau falling edge atau any change. Untuk melihat code yang akan dihasilkan klik pada menu File dan pilih Program Preview.
  • 5. Lihat pada code: // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here } Jika terdapat code diatas maka anda telah mendapatkan header program yang akan dieksekusi jika terjadi trigger eksternal interrupt. Sebaliknya jika pada pertanyaan apakah akan digunakan CodeWizard anda menjawab tidak (NO), maka akan muncul window Create New Project seperti dibawah ini: Ketik nama project yang akan dibuat dan klik save. Anda akan dihadapkan pada window Configure Project seperti:
  • 6. File code yang memiliki ekstensi *.c yang akan dibuat nantinya disave pada suatu tempat dan di masukkan ke dalam project dengan mengklik Add pada tab File seperti diatas. Pada tab C Compiler akan ditemukan tab lagi didalamnya. Tab yang sering digunakan ialah tab Code Generation. Pada tab ini anda akan menentukan mikrokontroler apa dan kecepatan (speed dalam MHz) yang nantinya akan digunakan. Pilih ATmega8535 dan speed yang sesuai dengan frekuensi crystal yang akan digunakan lalu klik OK. Proses coding menggunakan bahasa C belum dapat dimulai setelah mengkonfigurasi project yang dibuat. Untuk membuat file *.c klik pada menu File dan pilih source dan klik OK. Selanjutnya akan tampil window utama dengan tampilan dibawah ini. Ingat, file masih dalam bentuk untitled.c dan belum disave. Untuk mengetahuinya dapat dilihat pada sisi kiri dimana file untitled.c terletak pada Other Files. Hal ini meyatakan pula bahwa file untitled.c belum masuk dalam project. Save dulu file untitled.c pada folder yang sama dengan file project dan beri nama yang sama. Untuk memasukkan file *.c yang telah disave ke dalam project klik menu Project dan pilih Configure.
  • 7. Anda akan dihadapkan kembali pada window seperti pada Configure Project diatas. Klik Add dan akan tampil window yang menayakan file *.c mana yang akan dimasukkan kedalam project. Klik OK. Jika file *.c telah dimasukkan ke dalam project maka statusnya dapat dilihat pada bagian kiri window utama dimana file *.c terdapat pada tree project. Kini anda siap melakukan coding dalam bahasa C di CodeVisionAVR. Melakukan proses compiling terhadap sourcecode yang sudah jadi Klik pada tombol yang ditunjukkan pada gambar dibawah. Tombol tersebut selain melakukan compiling akan mengenerate beberapa file termasuk *.hex yang akan diburn ke mikrokontroler dan file *.coff yang dapat disimulasikan pada AVR studio Setelah proses compiling berhasil maka akan muncul window:
  • 8. Window ini berisi informasi-informasi penting mengenai jenis mikrokontroller, speed, ukuran program, sisa space EEPROM dan FLASH, jumlah error dari code dan sebagainya. Jika terdapat error pada code yang kita buat, maka klik OK dan anda akan kembali pada window utama dengan tampilan seperti dibawah ini: Untuk mengetahui letak kesalahan pada code anda, tinggal klik pada tab navigator bagian Errors. Atau anda dapat mengklik pada tab Messages untuk mengetahui letak kesalahan pada code. Pada contoh diatas dapat dilihat sintaks #include <mega32.h akan diblok dengan warna biru yang menunjukkan kesalahan terletak pada sintaks tersebut. Memprogram Chip dengan menggunakan Chip Programmer Proses compiling yang sukses akan menghasilkan file *.hex pada folder dimana file project disimpan. File *.hex ini telah siap untuk diburn ke dalam mikrokontroler dengan menggunakan tool yang telah tersedia pada CodeVisionAVR yaitu CodeVisionAVR Chip Programmer. Untuk membuka window ini klik pada tombol seperti di bawah ini: Window Chip Programmer akan muncul dengan tampilan:
  • 9. Sebelum mulai memprogram chip, anda harus melakukan setup terhadap programming dongle yang akan digunakan. Pada window utama klik pada menu Settings dan pilih Programmer. Tampilan window Programmer Settings: Tipe dongle yang dipakai diatas ialah STK200 yang menggunakan port printer (LPT). Kolom Delay Multiplier berisi pengali yang akan memperlambat proses programming terhadap chip. Penulis sering memakai dongle ini karena simple. Kelemahannya ialah proses programming yang lebih lama jika dibandingkan dengan dongle STK500. Dongle yang dipakai baik STK200 atau STK500 ialah dongle dengan sirkuit pengganti. Karena jika harus membeli maka harga programming dongle itu sangatlah mahal. Tampilan untuk dongle STK500 yang menggunakan port serial (COM): Setelah selesai klik OK dan lanjutkan pada window Chip Programming. Pada window Chip Programming terdapat banyak settingan programming yang dapat dipilih. Dengan settingan default anda sudah dapat memprogram chip langsung.
  • 10. MEMBUAT PROGRAM SEDERHANA PADA ATMEGA8535 Basic Input Output Pada proyek ini anda akan membuat code sederhana yaitu memberikan nilai logika 0 atau 1 pada port output ATmega8535. Port I/O akan diset menjadi port output. Port yang sama dapat dialihkan fungsinya menjadi port input dengan mengatur DDR (Data Direction Register) dari tiap-tiap port. Layout dari tiap-tiap port dari ATmega8535 dengan packaging PDIP: Konfigurasi port I/O pada ATmega8535 dapat dilakukan dengan melakukan settingan: Port I/O sebagai output: DDR diset high atau bit 1 dengan mengetikkan DDRx =1; x bisa berarti A,B,C,D (port). Penyettingan ini dilakukan dengan akses per byte pada satu port dengan delapan pin sekaligus. Misal kita ingin menjadikan PA0 menjadi port output, contoh kodenya: DDRA = 0x01; //menjadikan porta.0 menjadi port output (hex) DDRA = 0b00000001; //sama dengan diatas namun dengan bilangan bit, //kedua perintah diatas membuat port selain //porta.0 menjadi port input Untuk melakukan penyettingan terhadap satu pin saja maka dapat dilakukan dengan DDRx.y = 1; y bisa terdiri angka 0,1,...,7 (8 bit). Contoh kodenya: DDRA.0 = 1; //menjadikan porta.0 menjadi port output Memberikan keluaran high pada PA0 dilakukan dengan mengetikan kode: PORTA = 1; //porta.0 diberi logic high ‘1’ Jika ingin memberikan logic high pada lebih dari satu port ketikkan kode: PORTA = 0xAA; //porta.1,3,5,7 diberi logic high atau PORTA = 0b10101010; Penyettingan hanya terhadap satu pin saja dari satu port dapat menggunakan kode: PORTA.2 = 1; //porta.2 memiliki logic high Port output pada ATmega8535 dapat memberikan arus source sebesar 20 mA. Arus ini cukup untuk menyalakan LED sedang. Arus ini dapat terjadi karena AVR telah memiliki internal pull up resistor di dalamnya untuk setiap pinnya. Port I/O sebagai input: Untuk menjadikan port I/O menjadi port output DDR diset low atau ‘0’. Ketikkan kode DDRA.0 = 0; //porta.0 menjadi port input Untuk mengambil data dari port input kita gunakan perintah PINA . Akses byte atau per bit dari port input sama dengan penjelasan pada DDR dan port output diatas. Contoh dari penggunaan perintah PINA :
  • 11. if (PINA.0 == 1) { PORTA.2 = 1; } // jika pin A0 = 1, maka port A2 diberi logic high Port input dapat di pullup dengan menambahkan perintah PORT setelah DDR seperti pada contoh dibawah ini: DDRA.0 = 0; PORTA.0 = 1; //membuat porta.0 sebagai input dan di pullup Contoh program kecil: #include <mega8535.h> void main() { DDRA.0 = 1; PORTA.0 = 1; DDRB = 0b00110011; PORTB.3 = 1; }
  • 12. INTERRUPT / INTERUPSI Interrupt/Interupsi ialah suatu kondisi dimana CPU (Central Processing Unit) mikrokontroler berhenti dari rutinitas yang sedang dikerjakan dan mengerjakan rutinitas lain yang ditunjuk oleh interupsi tersebut. Ketika rutinitas yang ditunjuk interupsi telah selesai dieksekusi, maka CPU akan mulai mengekseskusi rutinitas awal sebelum adanya interupsi yang terhenti dari tempat terakhir. Pada AVR ATmega8535 terdapat 21 buah interrupt yang ditunjukkan pada tabel dibawah ini: Pada bagian ini jenis interrupt yang akan dibahas ialah external interrupt. ATmega8535 memiliki tiga buah eksternal interrupt yaitu INT0, INT1, dan INT2. Ketiga interrupt ini yaitu INT0 s.d INT2 akan tertrigger walaupun portnya dikonfigurasi sebagai output. Fitur ini memungkinkan interrupt yang dikondisikan oleh software. Semua interrupt akan tertrigger jika terdapat perubahan rising edge atau falling edge. Mode any change tidak dimiliki INT2, sedangkan INT0 dan INT1 memilikinya. Mode any change memungkinkan interrupt terpanggil baik ketika rising dan falling edge. Register-register yang harus di setting untuk mengaktifkan eksternal interupsi ialah GICR (General Interrupt Control Register), GIFR (General Interrupt Flag Register), MCUCR (MCU Control Register), dan MCUCSR (MCU Control and Status Register). GICR (General Interrupt Control Register) • Bit 7 – INT1: External Interrupt Request 1 Enable Untuk meng-enable kan External Interrupt 1 • Bit 6 – INT0: External Interrupt Request 0 Enable Untuk meng-enable kan External Interrupt 0 • Bit 5 – INT2: External Interrupt Request 2 Enable Untuk meng-enable kan External Interrupt 2 GIFR (General Interrupt Flag Register)
  • 13. • Bit 7 – INTF1: External Interrupt Flag 1 Ketika terjadi eksternal interrupt pada INT1, maka Flag INTF1 diset 1. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF1 diset 0. • Bit 6 – INTF0: External Interrupt Flag 0 Ketika terjadi eksternal interrupt pada INT0, maka Flag INTF0 diset 1. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF0 diset 0. • Bit 5 – INTF2: External Interrupt Flag 2 Ketika terjadi eksternal interrupt pada INT2, maka Flag INTF2 diset 1. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF2 diset 0. MCUCR (MCU Control Register) • Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0 Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 1. pilihan sensitifitas dapat dilihat pada tabel dibawah: • Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0 Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 0. pilihan sensitifitas dapat dilihat pada tabel dibawah: MCUCSR (MCU Control and Status Register) • Bit 6 – ISC2: Interrupt Sense Control 2 Jika ISC2 ditulis 0 maka falling edge pada INT2 akan mengaktifasi interupsi. Jika ISC2 ditulis 1, maka rising edge pada INT2 akan mengaktifasi interupsi. Contoh program yang menggunakan ketiga eksternal interrupt diatas: #include <mega32.h> // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { PORTA.0 = 1; } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { PORTA.1 = 1;
  • 14. } // External Interrupt 2 service routine interrupt [EXT_INT2] void ext_int2_isr(void) { PORTA.2 = 1; } void main() { DDRD.2 = 0; //pind.2 INT0 (input) DDRD.3 = 0; //pind.3 INT1 (input) DDRB.2 = 0; //pinb.2 INT2 (input) DDRA.0 = 1; //output DDRA.1 = 1; //output DDRA.2 = 1; //output // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: On // INT1 Mode: Rising Edge // INT2: On // INT2 Mode: Rising Edge GICR |=0xE0; // GICR |=0b11100000 MCUCR =0x0F; // MCUCR =0b00001111 MCUCSR=0x40; // MCUCSR=0b01000000 GIFR =0xE0; // GIFR =0b11100000 #asm("sei") //global enable interrupts (SREG) While(1) {}; }
  • 15. TIMER / COUNTER Timer/Counter pada mikrokontroler AVR dapat digunakan untuk melakukan pencacahan waktu seperti pada jam digital maupun untuk menghasilkan sinyal PWM (Pulse Width Modulation) yakni sinyal kotak dengan frekuensi dan duty cycle yang nilainya bisa diatur. Atmega8535 memiliki tiga unit Timer/Counter yaitu Timer/Counter 0 (8 bit), Timer/Counter 1 (16 bit), dan Timer/Counter 2 (8 bit). 1. TIMER/COUNTER 0 Fitur-fitur yang dimiliki: • Satu buah unit Compare Counter (Unit ini akan meng-count dan meng-compare) • Clear timer pada saat compare match (Auto reload) • Phase Correct PWM yang bebas glitch • Frequency generator • External event counter • Prescaler clock hingga 10 bit • Source interrupt overflow dan compare match (TOV0 dan OCF0) Definisi timer: Timer/Counter adalah sebuah unit yang dapat menghitung (Counter) dan melakukan timing dengan menggunakan frekuensi kristal sebagai sumber clock counternya internal atau sumber eksternal melalui pin T0. Berikut blok diagram Timer/Counter 0: Register Timer/Counter (TCNT0) dan Output Compare Register (OCR0) adalah register 8 bit. Sinyal permintaan interrupt dapat dilihat pada TIFR (Timer Interrupt Flag Register). Semua interrupt secara individual terlindungi oleh Timer Interrupt Mask Register (TIMSK). TIMSK dan TIFR tidak diperlihatkan pada gambar diatas karena penggunaannya di-share dengan unit timer yang lain. Timer/Counter dapat diberi sumber clock secara internal dan dapat diatur frekuensinya dengan prescaler bit (bit pembagi) atau diberi sumber clock eksternal melalui pin T0. Blok Clock Select Logic akan menentukan sumber clock mana yang digunakan untuk menambah atau mengurangi nilai yang terdapat pada register timernya. Timer/Counter akan tidak aktif ketika tidak ada sumber clock yang dipilih. Nilai yang ada pada Output Compare Register (OCR) akan di bandingkan dengan nilai yang ada pada Timer/Counter setiap saat. Hasil dari proses pembandingan ini dapat digunakan waveform generation untuk menghasilkan PWM (Pulse Width Modulation) atau output yang memiliki frekuensi yang berubah pada pin Output Compare (OC0). Kejadian pembandingan output yang sesuai nilainya antara OCR dan nilai pada Timer/Counter akan mengeset nilai pada Output Compare Flag (OCF0) yang dapat digunakan untuk menghasilkan permintaan output compare interrupt. Definisi Beberapa definisi mengenai batasan nilai pada Timer/Counter0:
  • 16. BOTTOM MAX TOP Counter akan mencapai BOTTOM ketika bernilai 0x00 Counter akan mencapai MAX ketika bernilai 0xFF (dalam decimal 255) Counter akan mencapai TOP ketika bernilai sama dengan nilai tertinggi dalam urutan penghitungan. Nilai TOP ini dapat ditetapkan dari nilai fix seperti 0xFF (MAX) atau nilai yang terdapat pada register OCR0. Penetapan nilai TOP ini bergantung pada mode operasi yang sedang dijalankan Unit Counter Bagian utama dari Timer/Counter 8-bit ialah unit counter yang dapat diprogram secara bi-directional. Gambar dibawah ini memperlihatkan blok diagram dari unit counter dan lingkungannya. Deskripsi sinyal: Count Increment (menambah) atau decrement (mengurangi) TCNT0 dengan nilai 1 Direction Untuk memilih antara menambah atau mengurangi Clear Clear TCNT0 (mengeset semua nilai menjadi 0) TOP Memberi sinyal bahwa TCNT0 telah mencapai nilai maksimum BOTTOM Memberi sinyal bahwa TCNT0 telah mencapai nilai minimum (nol) Unit Output Compare Komparator 8 bit secara kontinu membandingkan nilai TCNT0 dengan nilai register Output Compare (OCR0). Ketika TCNT0 sama dengan OCR0, maka komparator akan memberi sinyal bahwa terjadi kesamaan. Kesamaan ini akan mengeset Output Compare Flag (OCF0) pada saat clock cycle timer selanjutnya. Jika OCIE0 = 1 dan Global Interrupt Flag di SREG di set, maka Output Compare Flag akan menghasilkan interupsi output compare. Flag OCF0 akan secara otomatis di clear kan ketika interupsi dieksekusi. Gambar dibawah ini memperlihatkan blok diagram unit Output Compare. Mode Operasi Mode operasi ialah kelakuan dari Timer/Counter dan pin Output Compare. Mode ini dibedakan melalui kombinasi dari bit mode Waveform Generation (WGM01:0) dan bit mode Compare Output (COM01:0). Mode Compare Output tidak akan mempengaruhi alur penghitungan, sedangkan mode Waveform Generation mempengaruhinya. Bit-bit COM01:0 mengatur apakan output PWM yang dihasilkan dibalik atau tidak (inverted atau non-inverted PWM).
  • 17. Untuk mode yang non-PWM maka bit-bit COM01:0 akan mengontrol output akan di set, di clear, atau di balik (toggle) saat terjadi compare match. Mode-mode yang terdapat antara lain: • Mode Normal Mode operasi yang paling simpel ialah mode normal (WGM01:0 = 0). Pada mode ini arah penghitungan selalu naik (incrementing), dan tidak terdapat clear terhadap counter yang dilaksanakan. Counter akan mengalami overrun ketika telah mencapai nilai maksimumnya yaitu 8 bit (TOP = 0xFF) dan direstart dari bawah (0x00). Pada operasi normal, Flag Overflow Timer/Counter (TOV0) akan di set pada saat clock cycle timer yang sama ketika TCNT0 menjadi nol. Flag TOV0 ini jika digabungkan dengan dengan interupsi timer overflow yang akan secara otomatis mengclearkan flag TOV0, maka resolusi timer akan dapat ditingkatkan melalui software. • Mode Clear Timer on Compare (CTC) match Pada mode CTC ini (WGM01:0 = 2), register OCR0 digunakan untuk memanipulasi resolusi counter. Pada mode ini counter akan di clear menjadi nol ketika nilai counter (TCNT0) mengalami nilai yang sama dengan OCR0. OCR0 mendefinisikan nilai TOP dari counter dan juga resolusi dari counter tersebut. Mode ini memberikan kontrol yang lebih besar pada frekuensi output compare match. Hal ini pula mempermudah operasi penghitungan event eksternal. Diagram timing untuk mode CTC ditunjukkan pada gambar. Nilai counter (TCNT0) naik terus hingga terjadi compare match antara TCNT0 dan OCR0, lalu counter (TCNT0) di clear kan (di nol kan). Interupsi dapat dibangkitkan setiap kali nilai counter mencapai TOP dengan menggunakan flag OCF0. Jika interupsi diaktifkan, maka interrupt handler routine (rutinitas yang akan dieksekusi ketika terjadi interupsi) dapat digunakan untuk mengupdate nilai TOP. Bagaimanapun, mengubah nilai TOP dengan nilai yang dekat dengan nilai BOTTOM ketika counter sedang berjalan dengan nilai prescaler yang rendah atau nol harus dilakukan dengan ekstra hati-hati karena mode CTC tidak memiliki fitur double buffering. Jika nilai yang dimasukkan ke dalam OCR0 lebih rendah daripada nilai saat itu yang terdapat pada TCNT0, maka counter akan kehilangan event compare match. Counter akan menghitung hingga nilai maksimum (0xFF) lalu mulai kembali dari 0x00 sebelum event compare match terjadi. Untuk menghasilkan output yang berupa gelombang pada mode CTC, output OC0 dapat diset untuk mentoggle logic level output tersebut setiap terjadi event compare match dengan mensetting mode Compare Output menjadi mode toggle (COM01:0 = 1). Nilai OC0 tidak akan muncul pada port pin hingga data direction untuk pin di set menjadi output. Baca kembali bagian Basic Input Output diatas pada seksi Port I/O sebagai output. Frekuensi dari gelombang yang dibangkitkan akan memiliki frekuensi maksimum f = f /2 ketika OCR0 OC0 clk_I/O diset bernilai nol (0x00). Frekuensi dari gelombang didefinisikan melalui persamaan sebagai berikut: Variabel N merepresentasikan faktor nilai prescaler (1, 8, 64, 256, atau 1024) Sama dengan mode operasi normal, flag TOV0 akan di set pada saat clock cycle timer yang sama ketika peralihan dari MAX ke 0x00.
  • 18. • Mode Fast PWM Mode fast Pulse Width Modulation atau mode fast PWM (WGM01:0 = 3) memberikan opsi untuk membangkitkan gelombang PWM yang berfrekuensi tinggi. Operasi fast PWM ini berbeda dengan dengan opsi PWM lain yang ditandai dengan operasi kemiringan tunggalnya (single slope operation). Counter akan menghitung mulai dari BOTTOM hingga MAX lalu restart kembali dari BOTTOM. Pada mode non-inverting Compare Output, Output Compare (OC0) akan di clear kan (0) ketika terjadi event compare match antara TCNT0 dan OCR0, dan di set (1) pada nilai BOTTOM. Pada mode inverting Compare Output, output di set ketika terjadi event compare match dan di clear kan pada BOTTOM. Karena operasinya yang single slope, maka frekuensi operasinya fast PWM dapat mencapai dua kali lebih tinggi dari frekuensi operasi mode phase correct PWM yang menggunakan operasi dual slope. Frekuensi yang tinggi ini membuat mode fast PWM cocok digunakan untuk aplikasi power regulation, rectification, dan aplikasi DAC (Digital to Analog Converter). Frekuensi yang tinggi membolehkan penggunaan komponen fisik eksternal seperti kapasitor dan induktor yang kecil yang dapat mengurangi biaya total sistem. Pada mode fast PWM, counter akan menghitung secara naik (incremented) hingga nilai counter mencapai nilai MAX. Counter kemudian di clear kan pada saat clock cycle timer selanjutnya. Diagram timing untuk mode fast PWM ditunjukkan pada gambar. Nilai TCNT0 pada diagram ditunjukkan dengan setengah segitiga histogram untuk mengilustrasikan operasi single slope. Garis panah horizontal kecil yang menandai kemiringan TCNT0 merepresentasikan event compare match antara TCNT0 dan OCR0. Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai nilai MAX. Jika interupsi diaktifkan, maka interrupt handler routine dapat digunakan untuk mengupdate nilai compare. Pada mode fast PWM, unit compare dapat digunakan untuk membangkitkan gelombang PWM pada pin OC0. Mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan non-inverted PWM dan inverted PWM dapat dihasilkan dengan mengeset bit-bit tersebut menjadi 3. Nilai OC0 yang aktual akan dapat didapat pada port pin jika data direction pada port pin di set sebagai ouput. Gelombang PWM dibangkitkan dengan mengeset (atau mengclearkan) register OC0 pada saat terjadi compare match antara TCNT0 dan OCR0, dan mengclearkan (atau mengeset) register OC0 pada clock cycle timer saat counter di clearkan (perubahan ketika MAX menuju BOTTOM). Frekuensi PWM dari output dapat dihitung melalui persamaan berikut ini: Variabel N merepresentasikan nilai faktor prescaler (1, 8, 64, 256, 1024). • Mode Phase Correct PWM Mode phase correct PWM (WGM01:0 = 1) memberikan opsi untuk membangkitkan gelombang phase correct PWM yang memiliki resolusi tinggi. Mode phase correct PWM ini berdasarkan pada operasi dual slope (dua kemiringan yaitu kemiringan naik dan turun). Counter akan menghitung secara berulang-ulang dari BOTTOM menuju MAX lalu dari MAX menuju BOTTOM. Pada mode non-inverting Compare Output, Output Compare (OC0) akan di clear kan ketika terjadi event compare match antara TCNT0 dan OCR0 ketika penghitungan naik (upcounting), dan di set ketika terjadi event compare match pada saat penghitungan mundur (downcounting). Pada mode inverting Output Compare, operasinya di invert atau dibalik. Operasi dual slope memiliki frekuensi maksimum yang lebih rendah daripada operasi single slope. Bagaimanapun, karena fitur kesimetrisan dari mode PWM dual slope ini menjadikannya cocok untuk aplikasi kontrol motor. Resolusi PWM untuk mode phase correct PWM di fix kan menjadi delapan bit. Pada mode phase correct PWM counter akan melakukan penghitungan naik hingga mencapai nilai MAX. Ketika telah mencapai nilai MAX maka
  • 19. arah penghitungan dibalik yaitu mundur atau berkurang. Nilai TCNT0 akan sama dengan nilai MAX dalam waktu satu clock cycle timer. Diagram timing untuk mode phase correct PWM ini diperlihatkan pada gambar. Nilai TCNT0 pada diagram menunjukkan bentuk histogram segitiga penuh untuk mengilustrasikan operasi dual slope. Diagram ini memberikan ilustrasi output inverting dan non inverting. Garis panah horizon yang menandai kemiringan TCNT0 merepresentasikan event compare match antara TCNT0 dan OCR0. Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai BOTTOM. Flag interupsi dapat digunakan untuk membangkitkan interupsi setiap kali counter mencapai nilai BOTTOM. Pada mode phase correct PWM, unit compare dapat digunakan untuk membangkitkan gelombang PWM pada pin OC0. Dengan mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan PWM non-inverting. Output PWM inverting dapat dihasilkan dengan mengeset bit-bit COM01:0 menjadi 3. Nilai aktual OC0 akan terlihat pada port pin jika data direction untuk port pin diset menjadi output. Gelombang PWM dibangkitkan dengan mengclearkan (atau mengeset) register OC0 pada saat compare match antara TCNT0 dan OCR0 ketika counter menghitung naik (increment), dan mengeset (atau mengclearkan) register OC0 pada saat compare match antara TCNT0 dan OCR0 ketika counter melakukan penghitungan mundur (decrement). Frekuensi output PWM ketika menggunakan phase correct PWM dapat dihitung melalui persamaan: Variabel N merepresentasikan nilai faktor prescaler (1, 8, 64, 256, atau 1024) Nilai ekstrim untuk register OCR0 merepresentasikan kasus spesial ketika membangkitkan output gelombang PWM pada mode phase correct PWM. Jika OCR0 di set sama dengan BOTTOM, maka output akan secara kontinyu bernilai low atau 0 dan jika OCR0 diset sama dengan MAX maka output akan secara kontinyu bernilai high atau 1. untuk PWM inverted nilainya akan memiliki logika yang berkebalikan. Pada permulaan perioda 2 pada gambar OCn memiliki transisi dari high menuju low walaupun tidak terdapat compare match. Poin penting dari kejadian ini adalah untuk menjamin kesimetrisan di sekitar BOTTOM. Terdapat dua kasus yang yang dapat menghasilkan transisi walaupun pada keadaan aslinya tidak terdapat compare match: � Nilai OCR0A berubah dari nilai MAX seperti pada gambar. Ketika nilai OCR0A ialah MAX maka nilai pin OCn akan sama dengan hasil compare match ketika down counting. Untu memastikan kesimetrian disekitas BOTTOM maka nilai OCn ketika MAX berkorespondensi dengan hasil compare match ketika up counting. � Timer mulai menghitung pada nilai yang lebih besar dari OCR0A, dan untuk alasan itu akan mengalami kehilangan event compare match dan juga perubahan pada OCn yang seharusnya terjadi ketika up counting.
  • 20. Deskripsi register timer/counter 8 bit Timer/Counter Control Register (TCCR0) • Bit 7 – FOC0 : Force Output Compare Bit FOC0 hanya aktif ketika bit WGM00 menspesifikasikan mode non-PWM. Bagaimanapun, untuk memastikan kompatibilitas dengan peralatan masa depan, bit ini harus diset nol ketika TCCR0 ditulis ketika beroperasi pada mode PWM. • Bit 6, 3 – WGM01:0 : Waveform Generation Mode Bit ini mengontrol urutan penghitungan dari counter, sumber bagi nilai counter maksimum (TOP), dan tipe apa dari Waveform Generation yang akan digunakan. Mode operasi yang disupport oleh unit Timer/Counter ialah: mode Normal, mode Clear Timer on Compare Match (CTC), dan dua tipe mode PWM. • Bit 5, 4 – COM01:0 : Compare Match Output Mode Bit ini mengontrol kelakuan pin Output Compare (OC0). Jika satu atau lebih bit pada COM01:0 di set, maka output OC0 akan mengesampingkan fungsionalitas normal port dari pin I/O yang terhubung padanya. Bagaimanapun, harus dicatat bahwa bit Data Direction Register (DDR) yang berhubungan dengan pin OC0 harus di set dalam rangka untuk mengaktifkan driver output. Ketika OC0 terhubung pada pin, fungsi dari bit-bit COM01:0 bergantung kepada settingan bit WGM01:0. Tabel memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode Normal atau mode CTC (non-PWM). Tabel 40 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode fast PWM.
  • 21. Tabel 41 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode phase correct PWM. • Bit 2:0 - CS02:0 : Clock Select Tiga buah bit Clock Select akan memilih sumber clock yang akan dipakai oleh Timer/Counter. Jika mode pin eksternal digunakan untuk Timer/Counter0, transisi pada pin T0 akan memberi clock pada counter walaupun pin tersebut dikonfigurasi sebagai pin output. Fitur ini memberikan kesempatan untuk mengontrol clock secara software. Timer/Counter Register - TCNT0 Register Timer/Counter memberikan akses langsung, baik untuk operasi baca dan tulis ke unit counter 8-bit Timer/Counter0. Memodifikasi counter (TCNT0) ketika counter sedang berjalan, akan menampilkan resiko kehilangan compare match antara register TCNT0 dan OCR0. Output Compare Register - OCR0 Output Compare Register memiliki 8 bit nilai yang secara kontinyu dibandingkan dengan nilai counter (TCNT0). Sebuah match atau kesamaan dapat digunakan untuk menghasilkan interupsi output compare, atau untuk membangkitkan output berupa gelombang pada pin OC0. Timer/Counter Interrupt Mask Register - TIMSK • Bit 1 - OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable
  • 22. Ketika bit OCIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi compare match Timer/Counter0 diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika compare match pada Timer/Counter0 terjadi atau dengan kata lain bit OCF0 diset di Timer/Counter Interrupt Flag Register - TIFR. • Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable Ketika bit TOIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi overflow Timer/Counter0 diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika overflow pada Timer/Counter0 terjadi atau dengan kata lain bit TOV0 diset di Timer/Counter Interrupt Flag Register - TIFR. Timer/Counter Interrupt Flag Register – TIFR • Bit 1 - OCF0: Output Compare Flag 0 Bit OCF0 akan di set (1) ketika terjadi compare match antara Timer/Counter0 dan data pada OCR0 - Output Compare Register. OCF0 akan di clearkan oleh hardware ketika mengeksekusi interrupt handling vektor yang berkaitan. • Bit 0 - TOV0: Timer/Counter0 Overflow Flag Bit TOV akan di set (1) ketika terjadi overflow pada Timer/Counter0. TOV akan di clear kan oleh hardware ketika mengeksekusi interrupt handling vektor yang berkaitan. 2. TIMER/COUNTER1 (16-BIT) Unit Timer/Counter 16-bit mengijinkan timing eksekusi program yang akurat (event management), pembangkitan gelombang, dan mengukur timing sinyal. Fitur utama unit ini adalah: • Desain 16 bit yang sesungguhnya • Dua unit independen Output Compare • Double buffered Output Compare Register • Satu buah unit Input Capture • Clear Timer ketika terjadi Compare Match (Auto Reload) • Phase Correct PWM yang bebas glitch • Periode PWM yang variabel • Generator Frekuensi • External Event Counter • Empat buah sumber Interupsi independen (TOV1, OCF1A, OCF1B, dan ICF1) Register Register Timer/Counter (TCNT1), Output Compare Register (OCR1A/B), dan Input Capture Register (ICR1) ialah register 16-bit. Untuk melakukan penulisan 16-bit, high byte harus dituliskan terlebih dahulu sebelum low byte. Untuk melakukan pembacaan 16-bit, pembacaan low byte dilakukan terlebih dahulu sebelum pembacaan high byte. Definisi BOTTOM MAX TOP Unit Counter Counter akan mencapai BOTTOM ketika bernilai 0x0000. Counter akan mencapai MAXimum ketika bernilai 0xFFFF (desimal 65535). Counter akan mencapai TOP ketika mencapai nilai tertinggi dalam alur penghitungan. Nilai TOP dapat dimasukkan ke dalam salah satu nilai fix: 0x00FF, 0x01FF, atau 0x03FF atau pada nilai yang tersimpan pada register OCR1A atau ICR1. Pemasukan nilai TOP ini bergantung pada mode operasi yang dijalankan. Bagian utama dari Timer/Counter 16-bit ialah sebuah unit counter 16-bit yang dapat diprogram secara bidirectional. Gambar memperlihatkan blok diagram counter dan sekelilingnya.
  • 23. Deskripsi sinyal (sinyal internal): Count Direction Clear TOP BOTTOM Increment atau decrement TCNT dengan nilai 1. Pilih antara increment dan decrement Clear TCNT1 (mengeset semua bit menjadi nol) Memberi sinyal bahwa TCNT1 telah mencapai nilai maksimum Memberi sinyal bahwa TCNT1 telah mencapai nilai minimum (nol) Counter 16-bit dipetakan ke dalam dua buah lokasi I/O memori 8-bit: Counter High (TCNT1H) mengandung delapan bit paling atas dari counter, dan Counter Low (TCNT1L) mengandung delapan bit yang bawah. Register TCNT1H hanya dapat diakses secara indirect oleh CPU. Ketika CPU mengakses lokasi I/O TCNT1H, CPU akan mengakses high byte register temporary (TEMP). Register temporary ini diupdate dengan nilai TCNT1H ketika TCNT1L dibaca, dan TCNT1H diupdate dengan nilai pada register temporary ketika TCNT1L ditulis. Bergantung pada mode operasi yang digunakan, counter akan di clear kan, di increment, atau di decrement setiap clock timer. Sumber clock timer ini dapat dibangkitkan dari sumber internal atau eksternal, yang dipilih melalui bit Clock Select (CS12:0). Ketika tidak ada sumber clock yang dipilih (CS12:0 = 0) maka timer akan berhenti. Alur penghitungan ditentukan dengan mengeset bit-bit Waveform Generation Mode (WGM13:0) yang berlokasi di Timer/Counter Control Register A dan B (TCCR1A dan TCCR1B). Mode Operasi Mode operasi ialah kelakuan dari Timer/Counter dan pin output compare yang didefinisikan melalui kombinasi bitbit yang ada pada Waveform Generation mode (WGM13:0) dan bit-bit pada Compare Output mode (COM1x1:0). Bit-bit mode Compare Output tidak mempengaruhi alur penghitungan, sedangkan bit-bit mode Waveform Generation mempengaruhi. Bit-bit COM1x1:0 mengontrol apakah output PWM yang dibangkitkan akan di invert atau tidak (inverted atau non-inverted PWM). Untuk mode non-PWM, bit-bit COM1x1:0 mengontrol apakah output akan di set, di clear atau di toggle ketika terjadi compare match. • Mode Normal Mode operasi yang paling simpel ialah mode Normal (WGM13:0 = 0). Pada mode ini arah penghitungan selalu naik atau up counting (incrementing), dan tidak ada clear counter yang dilakukan. Counter akan secara simple mengalami overrun atau overflow ketika telah mencapai nilai maksimum 16-bit.
  • 24. KOMUNIKASI MIKROKONTROLER ATMEGA32 DAN PC DENGAN METODE USART Pada bagian ini akan dibahas sedikit mengenai salah satu fitur mikrokontroler AVR yakni ATMega32 untuk berkomunikasi dengan komputer melalui port serial / DB9 dengan 9 buah pin yang dapat dijumpai di belakang CPU komputer desktop. Untuk menyesuaikan level tegangan dari mikrokontroler ke port serial diperlukan IC MAX232 seperti terlihat pada gambar di bawah Pada IC MAX232, pin nomor 11 (TXD) dihubungkan ke pin 14 (RXD) dari ATMega32. Sedangkan pin nomor 12 pada IC MAX232 (RXD) dihubungkan ke pin 15 (TXD) dari ATMega32. Berikut adalah source code yang dipergunakan untuk melakukan komunikasi secara serial: #include <mega32.h> #include <stdio.h> #include <lcd.h> #include <delay.h> //************************ #asm for LCD routine ***************************** #asm .equ __lcd_port=0x15 ;PORTC .equ __lcd_wait_state=0x0a #endasm //************************ #define for USART routine ***************************** #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) //************************** Global Variable Declaration *************************** char Str[16]; char slave_data='0'; //variabel u/ memastikan slave telah selesai melakukan tugasnya //************************** USART Routine *************************** // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow
  • 25. bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) //untuk melakukan aksi setelah menerima data masuk { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; //bagian ini mengambil data kiriman dan menampilkannya ke lcd slave_data = data; lcd_gotoxy(0,1); sprintf(Str,"%s",slave_data); lcd_puts(Str); //delay_ms(400); } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used#endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index]; if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
  • 26. { tx_buffer[tx_wr_index]=c; if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; ++tx_counter; } else UDR=c; #asm("sei") } #pragma used#endif void main() { lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); sprintf(Str,"Agfa keren bgt!!"); lcd_puts(Str); delay_ms(1000); //perintah printf dibawah ini digunakan untuk mengirim data melalui serial printf("1"); while(slave_data != 'x' ) {}; }
  • 27. ANALOG TO DIGITAL CONVERTER (ADC) Pada mikrokontroler AVR terdapat fitur ADC yang dapat digunakan untuk melakukan pembacaan tegangan analog ke dalam bentuk digital sehingga ADC banyak digunakan dalam perancangan alat ukur digital. Secara umum, proses inisialisasi ADC meliputi proses penentuan clock, tegangan referensi, format output data, dan mode pembacaan. Register ADMUX Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer Selection Register), ADCSRA (ADC Control and Status Register), dan SFIOR (Special Function IO Register). ADMUX merupakan register 8 bit yang berfungsi menentukan tegangan referensi ADC, format data output, dan saluran ADC yang digunakan. Untuk memilih channel ADC yang digunakan (single ended atau diferensial), dilakukan dengan mengatur nilai MUX4 :0. Misalnya channel ADC0 sebagai input ADC, maka MUX4 :0 diberi nilai 00000B. Informasi lebih lengkap dapat dilihat pada datasheet mikrokontroler yang dipakai. Konfigurasi ADC Tegangan referensi ADC dapat ditentukan antara lain dari pin AREF, pin AVCC atau menggunakan tegangan referensi internal mikrokontroler sebesar 2.56V. Agar fitur ADC mikrokontroler dapat digunakan maka ADEN (ADC Enable, dalam I/O register ADCSRA) harus diberi nilai 1. Setelah konversi selesai (ADIF high), hasil konversi dapat diperoleh pada register hasil (ADCL, ADCH).Untuk konversi single ended, hasilnya ialah : Di mana VIN ialah tegangan pada input yang dipilih dan VREF merupakan tegangan referensi. Jika hasil ADC =000H, maka menunjukkan tegangan input sebesar 0V, jika hasil ADC=3FFH menunjukkan tegangan input sebesar tegangan referensi dikurangi 1 LSB. Sebagai contoh, jika diberikan VIN sebesar 0.2V dengan VREF 5V, maka hasil konversi ADC ialah 41. Jika menggunakan differensial channel, hasilnya ialah 40.96, yang bila digenapkan bisa sekitar 39,40,41 karena ketelitian ADC ATmega 16 sebesar +- 2LSB. Jika yang digunakan saluran diferensial, maka hasilnya ialah : Di mana VPOS ialah tegangan pada input pin positif, VNEG ialah tegangan input pada pin negatif, GAIN ialah faktor penguatan dan VREF ialah tegangan referensi yang digunakan. Kita dapat mengkonfigurasi fasilitas ADC pada CodeVision AVR sebagai berikut :
  • 28. Melakukan setting penggunaan ADC dengan CodeWizardAVR Dengan mencentang ADC Enabled akan mengaktifkan on-chip ADC. Dengan mencentang Use 8 bits, maka hanya 8 bit terpenting yang digunakan. Hasil konversi 10 bit dapat dibaca pada ADC Data Registers ADCH dan ADCL. Misalnya, jika hasil konversi ADC bernilai 54(36H), dalam 10 bit biner ditulis dengan 00 0011 0110B. Jika dalam format right adjusted (ADLAR=0), maka I/O register ADCH berisi 0000 0000B(00H) dan I/O register ADCL berisi 0011 0110B (36H). Penerapan ADC untuk pengukuran suhu Salah satu aplikasi ADC pada mikrokontroler AVR (di sini digunakan ATMega16) adalah untuk melakukan pengukuran suhu. Dalam hal ini, transduser / pengubah suhu ke dalam bentuk tegangan yang digunakan adalah IC LM35. Menerima data ADC Langkah-langkah: 1. Siapkan Smart AVR ATmega 16 ver. 2.0, dan hubungkan dengan kabel AVR ISP Programmer ke PC. Hubungkan juga kabel serial dari mikrokontroler ke PC. Hubungan keluaran sensor suhu LM35 di PA.0, dengan susunan sensor sebagai berikut: Sensor suhu LM35 2. Buat program yang otomatis digenerate di bawah ini, dengan terlebih dahulu mengkonfigurasi ADC menggunakan CodeWizardAVR.
  • 29. Konfigurasi ADC dan Serial Berikut adalah source code pengukuran suhu menggunakan ADC untuk ATMega16 (Nama file ADC.c) // Percobaan 7.1, percobaan terima data ADC dari sensor LM35 // LED terhubung di Port B #include <mega16.h> #include <stdio.h> #include <delay.h> #define ADC_VREF_TYPE 0x60 flash unsigned char string1[]={"data adc: %d; "}; // Baca 8 bit terpenting unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Mulai konversi ADC ADCSRA|=0x40; // Tunggu konversi ADC selesai while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } void main(void) {
  • 30. // Inisialisasi Port B PORTB=0xFF; DDRB=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 31,250 kHz // ADC Voltage Reference: AVCC pin
  • 31. // ADC Auto Trigger Source: Free Running // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA7; SFIOR&=0x1F; while (1) { //Panggil fungsi baca adc di sini }; } 3. Lakukan kompilasi dan jalankan. Sambil memanaskan LM35, lihat perubahan nyala LED di port B atau di Hyperterminal.