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.

Untuk melihat code yang akan dihasilkan klik pada menu File dan pilih Program Preview. .CodeVisionAVR akan menanyakan apakah anda akan menggunakan fasilitas CodeWizardAVR. 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. Fasilitas ini sangatlah berguna jika anda tidak ingin bersusah payah melakukan settingan dengan mengetik codecode tertentu yang banyak dan kompleks. Mode pembangkitan eksternal interrupt terdiri dari rising edge atau falling edge atau any change. Intinya terdapat tab-tab yang tinggal klik dan anda akan langsung disajikan contoh kodenya.

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: . Sebaliknya jika pada pertanyaan apakah akan digunakan CodeWizard anda menjawab tidak (NO).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.

Proses coding menggunakan bahasa C belum dapat dimulai setelah mengkonfigurasi project yang dibuat. Pilih ATmega8535 dan speed yang sesuai dengan frekuensi crystal yang akan digunakan lalu klik OK. Pada tab C Compiler akan ditemukan tab lagi didalamnya. Untuk membuat file *.File code yang memiliki ekstensi *. file masih dalam bentuk untitled.c dan belum disave. Tab yang sering digunakan ialah tab Code Generation. Untuk mengetahuinya dapat dilihat pada sisi kiri dimana file untitled. Save dulu file untitled. Pada tab ini anda akan menentukan mikrokontroler apa dan kecepatan (speed dalam MHz) yang nantinya akan digunakan. .c pada folder yang sama dengan file project dan beri nama yang sama. Ingat. Hal ini meyatakan pula bahwa file untitled. Selanjutnya akan tampil window utama dengan tampilan dibawah ini.c yang telah disave ke dalam project klik menu Project dan pilih Configure.c belum masuk dalam project.c klik pada menu File dan pilih source dan klik OK. Untuk memasukkan file *.c terletak pada Other Files.c yang akan dibuat nantinya disave pada suatu tempat dan di masukkan ke dalam project dengan mengklik Add pada tab File seperti diatas.

Anda akan dihadapkan kembali pada window seperti pada Configure Project diatas. Klik OK.coff yang dapat disimulasikan pada AVR studio Setelah proses compiling berhasil maka akan muncul window: . Jika file *. Klik Add dan akan tampil window yang menayakan file *. Kini anda siap melakukan coding dalam bahasa C di CodeVisionAVR.c terdapat pada tree project. Tombol tersebut selain melakukan compiling akan mengenerate beberapa file termasuk *.c telah dimasukkan ke dalam project maka statusnya dapat dilihat pada bagian kiri window utama dimana file *.hex yang akan diburn ke mikrokontroler dan file *. Melakukan proses compiling terhadap sourcecode yang sudah jadi Klik pada tombol yang ditunjukkan pada gambar dibawah.c mana yang akan dimasukkan kedalam project.

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. Jika terdapat error pada code yang kita buat. sisa space EEPROM dan FLASH. Untuk membuka window ini klik pada tombol seperti di bawah ini: Window Chip Programmer akan muncul dengan tampilan: . tinggal klik pada tab navigator bagian Errors. maka klik OK dan anda akan kembali pada window utama dengan tampilan seperti dibawah ini: Untuk mengetahui letak kesalahan pada code anda. ukuran program. File *. Atau anda dapat mengklik pada tab Messages untuk mengetahui letak kesalahan pada code. speed.hex ini telah siap untuk diburn ke dalam mikrokontroler dengan menggunakan tool yang telah tersedia pada CodeVisionAVR yaitu CodeVisionAVR Chip Programmer. Pada contoh diatas dapat dilihat sintaks #include <mega32. jumlah error dari code dan sebagainya.Window ini berisi informasi-informasi penting mengenai jenis mikrokontroller.

Karena jika harus membeli maka harga programming dongle itu sangatlah mahal. Pada window utama klik pada menu Settings dan pilih Programmer. Tampilan untuk dongle STK500 yang menggunakan port serial (COM): Setelah selesai klik OK dan lanjutkan pada window Chip Programming. Tampilan window Programmer Settings: Tipe dongle yang dipakai diatas ialah STK200 yang menggunakan port printer (LPT). . anda harus melakukan setup terhadap programming dongle yang akan digunakan. Dengan settingan default anda sudah dapat memprogram chip langsung. Kolom Delay Multiplier berisi pengali yang akan memperlambat proses programming terhadap chip.Sebelum mulai memprogram chip. Kelemahannya ialah proses programming yang lebih lama jika dibandingkan dengan dongle STK500. Pada window Chip Programming terdapat banyak settingan programming yang dapat dipilih. Penulis sering memakai dongle ini karena simple. Dongle yang dipakai baik STK200 atau STK500 ialah dongle dengan sirkuit pengganti.

contoh kodenya: DDRA = 0x01. y bisa terdiri angka 0. //porta.. //porta.7 diberi logic high atau PORTA = 0b10101010. Arus ini dapat terjadi karena AVR telah memiliki internal pull up resistor di dalamnya untuk setiap pinnya. //menjadikan porta. Port yang sama dapat dialihkan fungsinya menjadi port input dengan mengatur DDR (Data Direction Register) dari tiap-tiap port. //sama dengan diatas namun dengan bilangan bit. Penyettingan hanya terhadap satu pin saja dari satu port dapat menggunakan kode: PORTA. Penyettingan ini dilakukan dengan akses per byte pada satu port dengan delapan pin sekaligus.. //kedua perintah diatas membuat port selain //porta.D (port).0 menjadi port input Untuk melakukan penyettingan terhadap satu pin saja maka dapat dilakukan dengan DDRx.0 diberi logic high ‘1’ Jika ingin memberikan logic high pada lebih dari satu port ketikkan kode: PORTA = 0xAA.0 = 0.1.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.0 menjadi port output (hex) DDRA = 0b00000001.B.0 = 1. Port I/O sebagai input: Untuk menjadikan port I/O menjadi port output DDR diset low atau ‘0’. Arus ini cukup untuk menyalakan LED sedang.1.7 (8 bit). Port I/O akan diset menjadi port output. Akses byte atau per bit dari port input sama dengan penjelasan pada DDR dan port output diatas. //porta.0 menjadi port output Memberikan keluaran high pada PA0 dilakukan dengan mengetikan kode: PORTA = 1.2 memiliki logic high Port output pada ATmega8535 dapat memberikan arus source sebesar 20 mA. Misal kita ingin menjadikan PA0 menjadi port output. //menjadikan porta. Ketikkan kode DDRA. x bisa berarti A.C. 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.y = 1.0 menjadi port input Untuk mengambil data dari port input kita gunakan perintah PINA . Contoh dari penggunaan perintah PINA : . //porta.2 = 1.. Contoh kodenya: DDRA.3..5.

0 = 0.h> void main() { DDRA.3 = 1.0 = 1. } // jika pin A0 = 1. PORTA. //membuat porta. PORTB.0 == 1) { PORTA.0 sebagai input dan di pullup Contoh program kecil: #include <mega8535. PORTA.0 = 1.if (PINA.2 = 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 = 1. DDRB = 0b00110011.

Mode any change memungkinkan interrupt terpanggil baik ketika rising dan falling edge. maka CPU akan mulai mengekseskusi rutinitas awal sebelum adanya interupsi yang terhenti dari tempat terakhir. ATmega8535 memiliki tiga buah eksternal interrupt yaitu INT0. Fitur ini memungkinkan interrupt yang dikondisikan oleh software. GIFR (General Interrupt Flag Register). Register-register yang harus di setting untuk mengaktifkan eksternal interupsi ialah GICR (General Interrupt Control Register). Ketiga interrupt ini yaitu INT0 s. Pada AVR ATmega8535 terdapat 21 buah interrupt yang ditunjukkan pada tabel dibawah ini: Pada bagian ini jenis interrupt yang akan dibahas ialah external interrupt. 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) . Ketika rutinitas yang ditunjuk interupsi telah selesai dieksekusi. Mode any change tidak dimiliki INT2.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. sedangkan INT0 dan INT1 memilikinya. dan INT2. Semua interrupt akan tertrigger jika terdapat perubahan rising edge atau falling edge. INT1. MCUCR (MCU Control Register). dan MCUCSR (MCU Control and Status Register).d INT2 akan tertrigger walaupun portnya dikonfigurasi sebagai output.

pilihan sensitifitas dapat dilihat pada tabel dibawah: • Bit 1. 2 – ISC11. . ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0 Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 1. • Bit 5 – INTF2: External Interrupt Flag 2 Ketika terjadi eksternal interrupt pada INT2. ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0 Bit ini mengatur sensitifitas yang akan dimiliki oleh port eksternal interrupt 0. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF2 diset 0. } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { PORTA. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF1 diset 0.1 = 1. MCUCR (MCU Control Register) • Bit 3. maka Flag INTF1 diset 1. maka rising edge pada INT2 akan mengaktifasi interupsi. maka Flag INTF2 diset 1. Jika ISC2 ditulis 1. maka Flag INTF0 diset 1.0 = 1. Contoh program yang menggunakan ketiga eksternal interrupt diatas: #include <mega32.• Bit 7 – INTF1: External Interrupt Flag 1 Ketika terjadi eksternal interrupt pada INT1. Setelah routine eksternal interrupt selesai di eksekusi maka Flag INTF0 diset 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.h> // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { PORTA. 0 – ISC01. • Bit 6 – INTF0: External Interrupt Flag 0 Ketika terjadi eksternal interrupt pada INT0.

3 = 0.2 = 1.2 INT0 (input) DDRD.3 INT1 (input) DDRB. // MCUCR =0b00001111 MCUCSR=0x40. //output DDRA.} // External Interrupt 2 service routine interrupt [EXT_INT2] void ext_int2_isr(void) { PORTA. // GIFR =0b11100000 #asm("sei") //global enable interrupts (SREG) While(1) {}. // MCUCSR=0b01000000 GIFR =0xE0.2 = 0. // GICR |=0b11100000 MCUCR =0x0F. //output DDRA.2 = 0. //pinb.2 = 1.2 INT2 (input) DDRA.0 = 1. //pind. //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. } .1 = 1. } void main() { DDRD. //pind.

1. Timer/Counter 1 (16 bit). 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. Sinyal permintaan interrupt dapat dilihat pada TIFR (Timer Interrupt Flag Register). Nilai yang ada pada Output Compare Register (OCR) akan di bandingkan dengan nilai yang ada pada Timer/Counter setiap saat. Atmega8535 memiliki tiga unit Timer/Counter yaitu Timer/Counter 0 (8 bit). TIMSK dan TIFR tidak diperlihatkan pada gambar diatas karena penggunaannya di-share dengan unit timer yang lain. Definisi Beberapa definisi mengenai batasan nilai pada Timer/Counter0: .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. 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. Berikut blok diagram Timer/Counter 0: Register Timer/Counter (TCNT0) dan Output Compare Register (OCR0) adalah register 8 bit. Semua interrupt secara individual terlindungi oleh Timer Interrupt Mask Register (TIMSK). dan Timer/Counter 2 (8 bit). Timer/Counter akan tidak aktif ketika tidak ada sumber clock yang dipilih. 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. 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). Blok Clock Select Logic akan menentukan sumber clock mana yang digunakan untuk menambah atau mengurangi nilai yang terdapat pada register timernya.

. Ketika TCNT0 sama dengan OCR0. maka komparator akan memberi sinyal bahwa terjadi kesamaan. Bit-bit COM01:0 mengatur apakan output PWM yang dihasilkan dibalik atau tidak (inverted atau non-inverted PWM). 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). Mode ini dibedakan melalui kombinasi dari bit mode Waveform Generation (WGM01:0) dan bit mode Compare Output (COM01:0). maka Output Compare Flag akan menghasilkan interupsi output compare. Mode Compare Output tidak akan mempengaruhi alur penghitungan. Nilai TOP ini dapat ditetapkan dari nilai fix seperti 0xFF (MAX) atau nilai yang terdapat pada register OCR0. Mode Operasi Mode operasi ialah kelakuan dari Timer/Counter dan pin Output Compare. Jika OCIE0 = 1 dan Global Interrupt Flag di SREG di set. Gambar dibawah ini memperlihatkan blok diagram unit Output Compare. 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. sedangkan mode Waveform Generation mempengaruhinya. Flag OCF0 akan secara otomatis di clear kan ketika interupsi dieksekusi. Gambar dibawah ini memperlihatkan blok diagram dari unit counter dan lingkungannya.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. Kesamaan ini akan mengeset Output Compare Flag (OCF0) pada saat clock cycle timer selanjutnya.

lalu counter (TCNT0) di clear kan (di nol kan). 8. Baca kembali bagian Basic Input Output diatas pada seksi Port I/O sebagai output. OCR0 mendefinisikan nilai TOP dari counter dan juga resolusi dari counter tersebut. Interupsi dapat dibangkitkan setiap kali nilai counter mencapai TOP dengan menggunakan flag OCF0. di clear. 256. flag TOV0 akan di set pada saat clock cycle timer yang sama ketika peralihan dari MAX ke 0x00. 64. dan tidak terdapat clear terhadap counter yang dilaksanakan. Mode ini memberikan kontrol yang lebih besar pada frekuensi output compare match. Pada mode ini counter akan di clear menjadi nol ketika nilai counter (TCNT0) mengalami nilai yang sama dengan OCR0. Diagram timing untuk mode CTC ditunjukkan pada gambar. Flag Overflow Timer/Counter (TOV0) akan di set pada saat clock cycle timer yang sama ketika TCNT0 menjadi nol. Frekuensi dari gelombang yang dibangkitkan akan memiliki frekuensi maksimum f = f /2 ketika OCR0 diset bernilai nol (0x00). . Pada mode ini arah penghitungan selalu naik (incrementing). Nilai OC0 tidak akan muncul pada port pin hingga data direction untuk pin di set menjadi output. 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. Nilai counter (TCNT0) naik terus hingga terjadi compare match antara TCNT0 dan OCR0. register OCR0 digunakan untuk memanipulasi resolusi counter. Jika nilai yang dimasukkan ke dalam OCR0 lebih rendah daripada nilai saat itu yang terdapat pada TCNT0.Untuk mode yang non-PWM maka bit-bit COM01:0 akan mengontrol output akan di set. 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). Hal ini pula mempermudah operasi penghitungan event eksternal. atau 1024) Sama dengan mode operasi normal. Flag TOV0 ini jika digabungkan dengan dengan interupsi timer overflow yang akan secara otomatis mengclearkan flag TOV0. Counter akan menghitung hingga nilai maksimum (0xFF) lalu mulai kembali dari 0x00 sebelum event compare match terjadi. maka resolusi timer akan dapat ditingkatkan melalui software. Pada operasi normal. Jika interupsi diaktifkan. atau di balik (toggle) saat terjadi compare match. Frekuensi dari gelombang didefinisikan melalui persamaan sebagai berikut: OC0 clk_I/O Variabel N merepresentasikan faktor nilai prescaler (1. maka interrupt handler routine (rutinitas yang akan dieksekusi ketika terjadi interupsi) dapat digunakan untuk mengupdate nilai TOP. Counter akan mengalami overrun ketika telah mencapai nilai maksimumnya yaitu 8 bit (TOP = 0xFF) dan direstart dari bawah (0x00). maka counter akan kehilangan event compare match. Untuk menghasilkan output yang berupa gelombang pada mode CTC. Bagaimanapun. Mode-mode yang terdapat antara lain: • Mode Normal Mode operasi yang paling simpel ialah mode normal (WGM01:0 = 0). • Mode Clear Timer on Compare (CTC) match Pada mode CTC ini (WGM01:0 = 2).

Ketika telah mencapai nilai MAX maka . 1024). Mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan non-inverted PWM dan inverted PWM dapat dihasilkan dengan mengeset bit-bit tersebut menjadi 3. Counter akan menghitung secara berulang-ulang dari BOTTOM menuju MAX lalu dari MAX menuju BOTTOM.• Mode Fast PWM Mode fast Pulse Width Modulation atau mode fast PWM (WGM01:0 = 3) memberikan opsi untuk membangkitkan gelombang PWM yang berfrekuensi tinggi. counter akan menghitung secara naik (incremented) hingga nilai counter mencapai nilai MAX. Diagram timing untuk mode fast PWM ditunjukkan pada gambar. Output Compare (OC0) akan di clear kan ketika terjadi event compare match antara TCNT0 dan OCR0 ketika penghitungan naik (upcounting). Pada mode fast PWM. Frekuensi yang tinggi membolehkan penggunaan komponen fisik eksternal seperti kapasitor dan induktor yang kecil yang dapat mengurangi biaya total sistem. unit compare dapat digunakan untuk membangkitkan gelombang PWM pada pin OC0. Pada mode non-inverting Compare Output. dan mengclearkan (atau mengeset) register OC0 pada clock cycle timer saat counter di clearkan (perubahan ketika MAX menuju BOTTOM). maka interrupt handler routine dapat digunakan untuk mengupdate nilai compare. Operasi fast PWM ini berbeda dengan dengan opsi PWM lain yang ditandai dengan operasi kemiringan tunggalnya (single slope operation). Resolusi PWM untuk mode phase correct PWM di fix kan menjadi delapan bit. Frekuensi yang tinggi ini membuat mode fast PWM cocok digunakan untuk aplikasi power regulation. Pada mode fast PWM. Operasi dual slope memiliki frekuensi maksimum yang lebih rendah daripada operasi single slope. dan di set (1) pada nilai BOTTOM. Pada mode non-inverting Compare Output. karena fitur kesimetrisan dari mode PWM dual slope ini menjadikannya cocok untuk aplikasi kontrol motor. Gelombang PWM dibangkitkan dengan mengeset (atau mengclearkan) register OC0 pada saat terjadi compare match antara TCNT0 dan OCR0. Bagaimanapun. 8. Garis panah horizontal kecil yang menandai kemiringan TCNT0 merepresentasikan event compare match antara TCNT0 dan OCR0. output di set ketika terjadi event compare match dan di clear kan pada BOTTOM. dan di set ketika terjadi event compare match pada saat penghitungan mundur (downcounting). Jika interupsi diaktifkan. dan aplikasi DAC (Digital to Analog Converter). Counter kemudian di clear kan pada saat clock cycle timer selanjutnya. Pada mode phase correct PWM counter akan melakukan penghitungan naik hingga mencapai nilai MAX. Counter akan menghitung mulai dari BOTTOM hingga MAX lalu restart kembali dari BOTTOM. maka frekuensi operasinya fast PWM dapat mencapai dua kali lebih tinggi dari frekuensi operasi mode phase correct PWM yang menggunakan operasi dual slope. Pada mode inverting Output Compare. Frekuensi PWM dari output dapat dihitung melalui persamaan berikut ini: Variabel N merepresentasikan nilai faktor prescaler (1. Output Compare (OC0) akan di clear kan (0) ketika terjadi event compare match antara TCNT0 dan OCR0. 256. Mode phase correct PWM ini berdasarkan pada operasi dual slope (dua kemiringan yaitu kemiringan naik dan turun). 64. Nilai TCNT0 pada diagram ditunjukkan dengan setengah segitiga histogram untuk mengilustrasikan operasi single slope. Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai nilai MAX. Nilai OC0 yang aktual akan dapat didapat pada port pin jika data direction pada port pin di set sebagai ouput. • Mode Phase Correct PWM Mode phase correct PWM (WGM01:0 = 1) memberikan opsi untuk membangkitkan gelombang phase correct PWM yang memiliki resolusi tinggi. Karena operasinya yang single slope. rectification. Pada mode inverting Compare Output. operasinya di invert atau dibalik.

Diagram ini memberikan ilustrasi output inverting dan non inverting. Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai BOTTOM.arah penghitungan dibalik yaitu mundur atau berkurang. Garis panah horizon yang menandai kemiringan TCNT0 merepresentasikan event compare match antara TCNT0 dan OCR0. Diagram timing untuk mode phase correct PWM ini diperlihatkan pada gambar. untuk PWM inverted nilainya akan memiliki logika yang berkebalikan. Nilai aktual OC0 akan terlihat pada port pin jika data direction untuk port pin diset menjadi output. Ketika nilai OCR0A ialah MAX maka nilai pin OCn akan sama dengan hasil compare match ketika down counting. . unit compare dapat digunakan untuk membangkitkan gelombang PWM pada pin OC0. 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. Flag interupsi dapat digunakan untuk membangkitkan interupsi setiap kali counter mencapai nilai BOTTOM. dan mengeset (atau mengclearkan) register OC0 pada saat compare match antara TCNT0 dan OCR0 ketika counter melakukan penghitungan mundur (decrement). 8. Untu memastikan kesimetrian disekitas BOTTOM maka nilai OCn ketika MAX berkorespondensi dengan hasil compare match ketika up counting. Dengan mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan PWM non-inverting. Nilai TCNT0 pada diagram menunjukkan bentuk histogram segitiga penuh untuk mengilustrasikan operasi dual slope. dan untuk alasan itu akan mengalami kehilangan event compare match dan juga perubahan pada OCn yang seharusnya terjadi ketika up counting. Frekuensi output PWM ketika menggunakan phase correct PWM dapat dihitung melalui persamaan: Variabel N merepresentasikan nilai faktor prescaler (1. 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. Gelombang PWM dibangkitkan dengan mengclearkan (atau mengeset) register OC0 pada saat compare match antara TCNT0 dan OCR0 ketika counter menghitung naik (increment). Poin penting dari kejadian ini adalah untuk menjamin kesimetrisan di sekitar BOTTOM. Jika OCR0 di set sama dengan BOTTOM. atau 1024) Nilai ekstrim untuk register OCR0 merepresentasikan kasus spesial ketika membangkitkan output gelombang PWM pada mode phase correct PWM. Pada mode phase correct PWM. Nilai TCNT0 akan sama dengan nilai MAX dalam waktu satu clock cycle timer. Pada permulaan perioda 2 pada gambar OCn memiliki transisi dari high menuju low walaupun tidak terdapat compare match. Timer mulai menghitung pada nilai yang lebih besar dari OCR0A. 64. Output PWM inverting dapat dihasilkan dengan mengeset bit-bit COM01:0 menjadi 3. 256.

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. untuk memastikan kompatibilitas dengan peralatan masa depan. Tabel 40 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode fast PWM. Bagaimanapun. • Bit 6. harus dicatat bahwa bit Data Direction Register (DDR) yang berhubungan dengan pin OC0 harus di set dalam rangka untuk mengaktifkan driver output. sumber bagi nilai counter maksimum (TOP). 4 – COM01:0 : Compare Match Output Mode Bit ini mengontrol kelakuan pin Output Compare (OC0). Mode operasi yang disupport oleh unit Timer/Counter ialah: mode Normal. Ketika OC0 terhubung pada pin. Jika satu atau lebih bit pada COM01:0 di set. dan tipe apa dari Waveform Generation yang akan digunakan. Tabel memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode Normal atau mode CTC (non-PWM). fungsi dari bit-bit COM01:0 bergantung kepada settingan bit WGM01:0. 3 – WGM01:0 : Waveform Generation Mode Bit ini mengontrol urutan penghitungan dari counter. dan dua tipe mode PWM. bit ini harus diset nol ketika TCCR0 ditulis ketika beroperasi pada mode PWM. mode Clear Timer on Compare Match (CTC). . maka output OC0 akan mengesampingkan fungsionalitas normal port dari pin I/O yang terhubung padanya. Bagaimanapun. • Bit 5.

Timer/Counter Register .CS02:0 : Clock Select Tiga buah bit Clock Select akan memilih sumber clock yang akan dipakai oleh Timer/Counter. Memodifikasi counter (TCNT0) ketika counter sedang berjalan. atau untuk membangkitkan output berupa gelombang pada pin OC0.OCR0 Output Compare Register memiliki 8 bit nilai yang secara kontinyu dibandingkan dengan nilai counter (TCNT0). baik untuk operasi baca dan tulis ke unit counter 8-bit Timer/Counter0. • Bit 2:0 .TIMSK • Bit 1 .OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable . Output Compare Register .TCNT0 Register Timer/Counter memberikan akses langsung.Tabel 41 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode phase correct PWM. akan menampilkan resiko kehilangan compare match antara register TCNT0 dan OCR0. Sebuah match atau kesamaan dapat digunakan untuk menghasilkan interupsi output compare. Fitur ini memberikan kesempatan untuk mengontrol clock secara software. transisi pada pin T0 akan memberi clock pada counter walaupun pin tersebut dikonfigurasi sebagai pin output. Jika mode pin eksternal digunakan untuk Timer/Counter0. Timer/Counter Interrupt Mask Register .

Counter akan mencapai MAXimum ketika bernilai 0xFFFF (desimal 65535). OCF0 akan di clearkan oleh hardware ketika mengeksekusi interrupt handling vektor yang berkaitan.TIFR. Definisi BOTTOM MAX TOP Counter akan mencapai BOTTOM ketika bernilai 0x0000. pembangkitan gelombang.Ketika bit OCIE0 di tulis 1.TIFR. dan bit-I pada Status Register di set (1). . Counter akan mencapai TOP ketika mencapai nilai tertinggi dalam alur penghitungan. TOV akan di clear kan oleh hardware ketika mengeksekusi interrupt handling vektor yang berkaitan.TOIE0: Timer/Counter0 Overflow Interrupt Enable Ketika bit TOIE0 di tulis 1. maka interupsi overflow Timer/Counter0 diaktifkan. high byte harus dituliskan terlebih dahulu sebelum low byte. TIMER/COUNTER1 (16-BIT) Unit Timer/Counter 16-bit mengijinkan timing eksekusi program yang akurat (event management).Output Compare Register. Pemasukan nilai TOP ini bergantung pada mode operasi yang dijalankan.OCF0: Output Compare Flag 0 Bit OCF0 akan di set (1) ketika terjadi compare match antara Timer/Counter0 dan data pada OCR0 . 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 . OCF1B. pembacaan low byte dilakukan terlebih dahulu sebelum pembacaan high byte. dan mengukur timing sinyal. Output Compare Register (OCR1A/B). 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. dan bit-I pada Status Register di set (1). atau 0x03FF atau pada nilai yang tersimpan pada register OCR1A atau ICR1. Timer/Counter Interrupt Flag Register – TIFR • Bit 1 . dan Input Capture Register (ICR1) ialah register 16-bit. 2. Unit Counter Bagian utama dari Timer/Counter 16-bit ialah sebuah unit counter 16-bit yang dapat diprogram secara bidirectional. dan ICF1) Register Register Timer/Counter (TCNT1). Nilai TOP dapat dimasukkan ke dalam salah satu nilai fix: 0x00FF. • Bit 0 . maka interupsi compare match Timer/Counter0 diaktifkan. OCF1A. Untuk melakukan pembacaan 16-bit. • Bit 0 . Untuk melakukan penulisan 16-bit. 0x01FF. Gambar memperlihatkan blok diagram counter dan sekelilingnya.TOV0: Timer/Counter0 Overflow Flag Bit TOV akan di set (1) ketika terjadi overflow pada Timer/Counter0. Interupsi yang bersangkutan akan dieksekusi jika overflow pada Timer/Counter0 terjadi atau dengan kata lain bit TOV0 diset di Timer/Counter Interrupt Flag Register .

dan Counter Low (TCNT1L) mengandung delapan bit yang bawah. Register TCNT1H hanya dapat diakses secara indirect oleh CPU. 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). di clear atau di toggle ketika terjadi compare match. sedangkan bit-bit mode Waveform Generation mempengaruhi. Bergantung pada mode operasi yang digunakan. Ketika CPU mengakses lokasi I/O TCNT1H. Register temporary ini diupdate dengan nilai TCNT1H ketika TCNT1L dibaca. Counter akan secara simple mengalami overrun atau overflow ketika telah mencapai nilai maksimum 16-bit.Deskripsi sinyal (sinyal internal): Count Direction Clear TOP BOTTOM Increment atau decrement TCNT dengan nilai 1. Sumber clock timer ini dapat dibangkitkan dari sumber internal atau eksternal. CPU akan mengakses high byte register temporary (TEMP). dan tidak ada clear counter yang dilakukan. • Mode Normal Mode operasi yang paling simpel ialah mode Normal (WGM13:0 = 0). Bit-bit mode Compare Output tidak mempengaruhi alur penghitungan. counter akan di clear kan. bit-bit COM1x1:0 mengontrol apakah output akan di set. Untuk mode non-PWM. . yang dipilih melalui bit Clock Select (CS12:0). dan TCNT1H diupdate dengan nilai pada register temporary ketika TCNT1L ditulis. Bit-bit COM1x1:0 mengontrol apakah output PWM yang dibangkitkan akan di invert atau tidak (inverted atau non-inverted PWM). 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). atau di decrement setiap clock timer. di increment. 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. Ketika tidak ada sumber clock yang dipilih (CS12:0 = 0) maka timer akan berhenti. Pada mode ini arah penghitungan selalu naik atau up counting (incrementing).

rx_counter. //variabel u/ memastikan slave telah selesai melakukan tugasnya //************************** USART Routine *************************** // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]. Untuk menyesuaikan level tegangan dari mikrokontroler ke port serial diperlukan IC MAX232 seperti terlihat pada gambar di bawah Pada IC MAX232. Berikut adalah source code yang dipergunakan untuk melakukan komunikasi secara serial: #include <mega32.equ __lcd_port=0x15 . Sedangkan pin nomor 12 pada IC MAX232 (RXD) dihubungkan ke pin 15 (TXD) dari ATMega32.rx_counter.PORTC . char slave_data='0'.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.rx_rd_index.h> //************************ #asm for LCD routine ***************************** #asm .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]. #else unsigned int rx_wr_index. pin nomor 11 (TXD) dihubungkan ke pin 14 (RXD) dari ATMega32.h> #include <lcd. #endif // This flag is set on USART Receiver buffer overflow . #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index.rx_rd_index.h> #include <stdio.h> #include <delay.

bit rx_buffer_overflow.tx_rd_index. if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0. }. status=UCSRA.tx_rd_index. UDR=tx_buffer[tx_rd_index]. lcd_puts(Str).tx_counter. #asm("cli") --rx_counter. data=rx_buffer[rx_rd_index].data. } #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). // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) //untuk melakukan aksi setelah menerima data masuk { char status. sprintf(Str. } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data. #asm("sei") return data. #else unsigned int tx_wr_index. #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index. lcd_gotoxy(0. #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) . //delay_ms(400). #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter. //bagian ini mengambil data kiriman dan menampilkannya ke lcd slave_data = data."%s". if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0. while (rx_counter==0). if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data. rx_buffer_overflow=1. if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0.slave_data). data=UDR. }. } #pragma used#endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]. if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0.tx_counter. }.1).

{ tx_buffer[tx_wr_index]=c. lcd_gotoxy(0. ++tx_counter. if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0. //perintah printf dibawah ini digunakan untuk mengirim data melalui serial printf("1")."Agfa keren bgt!!"). sprintf(Str. lcd_puts(Str). lcd_clear(). delay_ms(1000).0). #asm("sei") } #pragma used#endif void main() { lcd_init(16). while(slave_data != 'x' ) {}. } . } else UDR=c.

proses inisialisasi ADC meliputi proses penentuan clock. maka menunjukkan tegangan input sebesar 0V. Agar fitur ADC mikrokontroler dapat digunakan maka ADEN (ADC Enable.Untuk konversi single ended. ADMUX merupakan register 8 bit yang berfungsi menentukan tegangan referensi ADC. maka hasilnya ialah : Di mana VPOS ialah tegangan pada input pin positif. format output data. tegangan referensi. maka MUX4 :0 diberi nilai 00000B.2V dengan VREF 5V.40. jika diberikan VIN sebesar 0. yang bila digenapkan bisa sekitar 39. format data output. Register ADMUX Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer Selection Register).56V. maka hasil konversi ADC ialah 41. pin AVCC atau menggunakan tegangan referensi internal mikrokontroler sebesar 2. hasil konversi dapat diperoleh pada register hasil (ADCL. VNEG ialah tegangan input pada pin negatif.96. Kita dapat mengkonfigurasi fasilitas ADC pada CodeVision AVR sebagai berikut : . hasilnya ialah : Di mana VIN ialah tegangan pada input yang dipilih dan VREF merupakan tegangan referensi. Konfigurasi ADC Tegangan referensi ADC dapat ditentukan antara lain dari pin AREF. Sebagai contoh. jika hasil ADC=3FFH menunjukkan tegangan input sebesar tegangan referensi dikurangi 1 LSB.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. dan saluran ADC yang digunakan. hasilnya ialah 40. dan mode pembacaan.2LSB. dalam I/O register ADCSRA) harus diberi nilai 1. ADCSRA (ADC Control and Status Register). Jika menggunakan differensial channel. Misalnya channel ADC0 sebagai input ADC. Jika hasil ADC =000H. Untuk memilih channel ADC yang digunakan (single ended atau diferensial).41 karena ketelitian ADC ATmega 16 sebesar +. Secara umum. GAIN ialah faktor penguatan dan VREF ialah tegangan referensi yang digunakan. dan SFIOR (Special Function IO Register). dilakukan dengan mengatur nilai MUX4 :0. ADCH). Setelah konversi selesai (ADIF high). Jika yang digunakan saluran diferensial. Informasi lebih lengkap dapat dilihat pada datasheet mikrokontroler yang dipakai.

maka hanya 8 bit terpenting yang digunakan. Dengan mencentang Use 8 bits. Misalnya. Siapkan Smart AVR ATmega 16 ver. Hubungkan juga kabel serial dari mikrokontroler ke PC. Sensor suhu LM35 2. transduser / pengubah suhu ke dalam bentuk tegangan yang digunakan adalah IC LM35. Buat program yang otomatis digenerate di bawah ini. dan hubungkan dengan susunan sensor sebagai berikut: dengan kabel AVR ISP Programmer ke PC. jika hasil konversi ADC bernilai 54(36H). dalam 10 bit biner ditulis dengan 00 0011 0110B. Menerima data ADC Langkah-langkah: 1. dengan terlebih dahulu mengkonfigurasi ADC menggunakan CodeWizardAVR. Hubungan keluaran sensor suhu LM35 di PA.0. Dalam hal ini.Melakukan setting penggunaan ADC dengan CodeWizardAVR Dengan mencentang ADC Enabled akan mengaktifkan on-chip ADC.0. Penerapan ADC untuk pengukuran suhu Salah satu aplikasi ADC pada mikrokontroler AVR (di sini digunakan ATMega16) adalah untuk melakukan pengukuran suhu. Hasil konversi 10 bit dapat dibaca pada ADC Data Registers ADCH dan ADCL. 2. . maka I/O register ADCH berisi 0000 0000B(00H) dan I/O register ADCL berisi 0011 0110B (36H). Jika dalam format right adjusted (ADLAR=0).

h> #define ADC_VREF_TYPE 0x60 flash unsigned char string1[]={"data // Baca 8 bit terpenting unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff). // Mulai konversi ADC ADCSRA|=0x40.c) // Percobaan 7.1. "}. // Delay needed for the stabilization of the ADC input voltage delay_us(10). return ADCH. // Tunggu konversi ADC selesai while ((ADCSRA & 0x10)==0). percobaan terima data ADC dari sensor LM35 // LED terhubung di Port B #include <mega16. . ADCSRA|=0x10.h> #include <stdio. } void main(void) { adc: %d.h> #include <delay.Konfigurasi ADC dan Serial Berikut adalah source code pengukuran suhu menggunakan ADC untuk ATMega16 (Nama file ADC.

UCSRB=0x18. TCNT0=0x00.250 kHz // ADC Voltage Reference: AVCC pin . UBRRH=0x00.// Inisialisasi Port B PORTB=0xFF. DDRB=0xFF. No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00. // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00. UCSRC=0x86. // ADC initialization // ADC Clock frequency: 31. // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80. SFIOR=0x00. UBRRL=0x19. OCR0=0x00. // USART initialization // Communication Parameters: 8 Data. // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00. 1 Stop.

// ADC Auto Trigger Source: Free Running // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff. baca adc di sini . } 3. Sambil memanaskan LM35. SFIOR&=0x1F. ADCSRA=0xA7. lihat perubahan nyala LED di port B atau di Hyperterminal. while (1) { //Panggil fungsi }. Lakukan kompilasi dan jalankan.

Sign up to vote on this title
UsefulNot useful