Tutorial AVR

download Tutorial AVR

of 31

Transcript of Tutorial AVR

  • 8/12/2019 Tutorial AVR

    1/31

    MODUL TRAINING

    MIKROKONTROLER AVR

    BIDANG KEPROFESIANBADAN PENGURUS HME ITB2009/2010

    DIVISI WORKSHOPHME ITB

  • 8/12/2019 Tutorial AVR

    2/31

    PENDAHULUAN

    Mikrokontroller AVR memiliki arsitektur RISC 8 bit, dimana semua instruksi dikemas dalam kode 16-bit (16-bitsword) dan sebagian besar instruksi dieksekusi dalam satu siklus clock, berbeda dengan instruksi MCS51 yangmembutuhkan 12 siklus clock. Hal ini terjadi karena perbedaan arsitektur yang dipakai. AVR menggunakanarsitektur RISC (Reduced Instruction Set Computing) sedangkan MCS51 menggunakan arsitektur CISC (ComplexInstruction 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 darikomputer ke mikrokontroler AVR:

    Nilai C1 = 100nF dan R1 = ?

  • 8/12/2019 Tutorial AVR

    3/31

    CodeVisionAVR C Compiler

    Pendahuluan

    Pada Kontes Robot Cerdas Indonesia (KRCI) bahasa pemrograman yang umum dipakai ialah bahasa C. Bahasa inidipakai 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 hanyamengijinkan sebagian kecil code dari total code yang bisa di burn ke dalam mikrokontroler. Misal kapasitas flashmikrokontroler sebesar 8KB maka total code yang bisa di compile sekitar 1 KB. Sebenarnya terdapat alternatif lainuntuk pemrograman dalam bahasa C dengan menggunakan software WinAVR yang gratis.

    Sebagai permulaan maka penulis akan sedikit mencoba memprogram AVR dengan menggunakan CodeVisionAVRkarena source code-nya telah tersedia. Selain itu penulis telah mendapatkan beberapa sample hasil pengalamandan percobaan dari code sendiri serta code gratis yang disediakan di internet. Semua code yang terlampir disinisebagian 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 hyperterminaldidalamnya. 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 fiturtersebut. Atau jika ingin, sesudah program C di compile oleh CodeVisionAVR maka akan dihasilkan file *.cof yangdapat disimulasikan langsung di AVR studio 4.

    Project Management

    Setiap akan membuat program baru pada CodeVisionAVR, kita akan diarahkan untuk membuat project terlebihdahulu.

    Pada menu File pilih New lalu lalu klik Project dan klik OK.

  • 8/12/2019 Tutorial AVR

    4/31

    CodeVisionAVR akan menanyakan apakah anda akan menggunakan fasilitas CodeWizardAVR.

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

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

    Mode pembangkitan eksternal interrupt terdiri dari rising edge atau falling edge atau any change. Untuk melihatcode yang akan dihasilkan klik pada menu File dan pilih Program Preview.

  • 8/12/2019 Tutorial AVR

    5/31

    Lihat pada code:

    // External Interrupt 0 service routineinterrupt [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 triggereksternal interrupt.Sebaliknya jika pada pertanyaan apakah akan digunakan CodeWizard anda menjawab tidak (NO), maka akanmuncul window Create New Project seperti dibawah ini:

    Ketik nama project yang akan dibuat dan klik save. Anda akan dihadapkan pada window Configure Project seperti:

  • 8/12/2019 Tutorial AVR

    6/31

    File code yang memiliki ekstensi *.c yang akan dibuat nantinya disave pada suatu tempat dan di masukkan kedalam project dengan mengklik Add pada tab File seperti diatas. Pada tab C Compiler akan ditemukan tab lagididalamnya. Tab yang sering digunakan ialah tab Code Generation. Pada tab ini anda akan menentukanmikrokontroler apa dan kecepatan (speed dalam MHz) yang nantinya akan digunakan. Pilih ATmega8535 danspeed yang sesuai dengan frekuensi crystal yang akan digunakan lalu klik OK.

    Proses coding menggunakan bahasa C belum dapat dimulai setelah mengkonfigurasi project yang dibuat. Untukmembuat 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 danbelum disave. Untuk mengetahuinya dapat dilihat pada sisi kiri dimana file untitled.c terletak pada Other Files. Halini meyatakan pula bahwa file untitled.c belum masuk dalam project. Save dulu file untitled.c pada folder yangsama dengan file project dan beri nama yang sama.

    Untuk memasukkan file *.c yang telah disave ke dalam project klik menu Project dan pilih Configure.

  • 8/12/2019 Tutorial AVR

    7/31

    Anda akan dihadapkan kembali pada window seperti pada Configure Project diatas. Klik Add dan akan tampilwindow 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 utamadimana 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 akanmengenerate beberapa file termasuk *.hex yang akan diburn ke mikrokontroler dan file *.coff yang dapatdisimulasikan pada AVR studio

    Setelah proses compiling berhasil maka akan muncul window:

  • 8/12/2019 Tutorial AVR

    8/31

    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, makaklik 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 dapatmengklik pada tab Messages untuk mengetahui letak kesalahan pada code. Pada contoh diatas dapat dilihat

    sintaks #include

  • 8/12/2019 Tutorial AVR

    9/31

    Sebelum mulai memprogram chip, anda harus melakukan setup terhadap programming dongle yang akandigunakan. 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 berisipengali yang akan memperlambat proses programming terhadap chip. Penulis sering memakai dongle ini karenasimple. 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 membelimaka harga programming dongle itu sangatlah mahal. Tampilan untuk dongle STK500 yang menggunakan portserial (COM):

    Setelah selesai klik OK dan lanjutkan pada window Chip Programming. Pada window Chip Programming terdapatbanyak settingan programming yang dapat dipilih. Dengan settingan default anda sudah dapat memprogram chiplangsung.

  • 8/12/2019 Tutorial AVR

    10/31

    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 outputATmega8535. Port I/O akan diset menjadi port output. Port yang sama dapat dialihkan fungsinya menjadi portinput dengan mengatur DDR (Data Direction Register) dari tiap-tiap port. Layout dari tiap-tiap port dariATmega8535 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 dilakukandengan akses per byte pada satu port dengan delapan pin sekaligus. Misal kita ingin menjadikan PA0 menjadi portoutput, 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 portinput

    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 outputMemberikan 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 atauPORTA = 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 pin-nya.

    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 samadengan penjelasan pada DDR dan port output diatas. Contoh dari penggunaan perintah PINA :

  • 8/12/2019 Tutorial AVR

    11/31

    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 void main(){DDRA.0 = 1;PORTA.0 = 1;DDRB = 0b00110011;PORTB.3 = 1;}

  • 8/12/2019 Tutorial AVR

    12/31

    INTERRUPT / INTERUPSI

    Interrupt/Interupsi ialah suatu kondisi dimana CPU (Central Processing Unit) mikrokontroler berhenti dari rutinitasyang sedang dikerjakan dan mengerjakan rutinitas lain yang ditunjuk oleh interupsi tersebut. Ketika rutinitas yangditunjuk interupsi telah selesai dieksekusi, maka CPU akan mulai mengekseskusi rutinitas awal sebelum adanyainterupsi 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 buaheksternal interrupt yaitu INT0, INT1, dan INT2. Ketiga interrupt ini yaitu INT0 s.d INT2 akan tertrigger walaupunportnya dikonfigurasi sebagai output. Fitur ini memungkinkan interrupt yang dikondisikan oleh software. Semuainterrupt akan tertrigger jika terdapat perubahan rising edge atau falling edge. Mode any change tidak dimilikiINT2, sedangkan INT0 dan INT1 memilikinya. Mode any change memungkinkan interrupt terpanggil baik ketikarising dan falling edge.

    Register-register yang harus di setting untuk mengaktifkan eksternal interupsi ialah GICR (General InterruptControl Register), GIFR (General Interrupt Flag Register), MCUCR (MCU Control Register), dan MCUCSR (MCUControl and Status Register).

    GICR (General Interrupt Control Register)

    Bit 7 INT1: External Interrupt Request 1 EnableUntuk 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 EnableUntuk meng-enable kan External Interrupt 2

    GIFR (General Interrupt Flag Register)

  • 8/12/2019 Tutorial AVR

    13/31

    Bit 7 INTF1: External Interrupt Flag 1Ketika terjadi eksternal interrupt pada INT1, maka Flag INTF1 diset 1. Setelah routine eksternal interrupt selesai dieksekusi maka Flag INTF1 diset 0.

    Bit 6 INTF0: External Interrupt Flag 0Ketika terjadi eksternal interrupt pada INT0, maka Flag INTF0 diset 1. Setelah routine eksternal interrupt selesai dieksekusi 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 dieksekusi 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 padatabel dibawah:

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

    MCUCSR (MCU Control and Status Register)

    Bit 6 ISC2: Interrupt Sense Control 2Jika ISC2 ditulis 0 maka falling edge pada INT2 akan mengaktifasi interupsi. Jika ISC2 ditulis 1, maka rising edgepada INT2 akan mengaktifasi interupsi.

    Contoh program yang menggunakan ketiga eksternal interrupt diatas:

    #include // External Interrupt 0 service routineinterrupt [EXT_INT0] void ext_int0_isr(void){PORTA.0 = 1;}// External Interrupt 1 service routineinterrupt [EXT_INT1] void ext_int1_isr(void){PORTA.1 = 1;

  • 8/12/2019 Tutorial AVR

    14/31

    }// External Interrupt 2 service routineinterrupt [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; //outputDDRA.1 = 1; //outputDDRA.2 = 1; //output// External Interrupt(s) initialization

    // INT0: On// INT0 Mode: Rising Edge// INT1: On// INT1 Mode: Rising Edge// INT2: On// INT2 Mode: Rising EdgeGICR |=0xE0; // GICR |=0b11100000MCUCR =0x0F; // MCUCR =0b00001111MCUCSR=0x40; // MCUCSR=0b01000000GIFR =0xE0; // GIFR =0b11100000

    #asm("sei") //global enable interrupts (SREG)While(1){};

    }

  • 8/12/2019 Tutorial AVR

    15/31

    TIMER / COUNTER

    Timer/Counter pada mikrokontroler AVR dapat digunakan untuk melakukan pencacahan waktu seperti pada jamdigital maupun untuk menghasilkan sinyal PWM (Pulse Width Modulation) yakni sinyal kotak dengan frekuensi danduty 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 menggunakanfrekuensi 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 interruptdapat dilihat pada TIFR (Timer Interrupt Flag Register). Semua interrupt secara individual terlindungi oleh TimerInterrupt Mask Register (TIMSK). TIMSK dan TIFR tidak diperlihatkan pada gambar diatas karena penggunaannyadi-share dengan unit timer yang lain.

    Timer/Counter dapat diberi sumber clock secara internal dan dapat diatur frekuensinya dengan prescaler bit (bitpembagi) atau diberi sumber clock eksternal melalui pin T0. Blok Clock Select Logic akan menentukan sumberclock 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 padaTimer/Counter setiap saat. Hasil dari proses pembandingan ini dapat digunakan waveform generation untukmenghasilkan PWM (Pulse Width Modulation) atau output yang memiliki frekuensi yang berubah pada pin OutputCompare (OC0). Kejadian pembandingan output yang sesuai nilainya antara OCR dan nilai pada Timer/Counterakan mengeset nilai pada Output Compare Flag (OCF0) yang dapat digunakan untuk menghasilkan permintaanoutput compare interrupt.

    Definisi

    Beberapa definisi mengenai batasan nilai pada Timer/Counter0:

  • 8/12/2019 Tutorial AVR

    16/31

    BOTTOM Counter akan mencapai BOTTOM ketika bernilai 0x00MAX Counter akan mencapai MAX ketika bernilai 0xFF (dalam decimal 255)TOP 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 yangterdapat pada register OCR0. Penetapan nilai TOP ini bergantung pada mode operasi yang sedangdijalankan

    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 1Direction Untuk memilih antara menambah atau mengurangiClear Clear TCNT0 (mengeset semua nilai menjadi 0)TOP Memberi sinyal bahwa TCNT0 telah mencapai nilai maksimumBOTTOM 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 kombinasidari bit mode Waveform Generation (WGM01:0) dan bit mode Compare Output (COM01:0). Mode Compare Outputtidak akan mempengaruhi alur penghitungan, sedangkan mode Waveform Generation mempengaruhinya. Bit-bitCOM01:0 mengatur apakan output PWM yang dihasilkan dibalik atau tidak (inverted atau non-inverted PWM).

  • 8/12/2019 Tutorial AVR

    17/31

    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 mengalamioverrun 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 samaketika TCNT0 menjadi nol. Flag TOV0 ini jika digabungkan dengan dengan interupsi timer overflow yang akansecara 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. Padamode ini counter akan di clear menjadi nol ketika nilai counter (TCNT0) mengalami nilai yang sama denganOCR0. OCR0 mendefinisikan nilai TOP dari counter dan juga resolusi dari counter tersebut. Mode inimemberikan kontrol yang lebih besar pada frekuensi output compare match. Hal ini pula mempermudahoperasi penghitungan event eksternal. Diagram timing untuk mode CTC ditunjukkan pada gambar. Nilaicounter (TCNT0) naik terus hingga terjadi compare match antara TCNT0 dan OCR0, lalu counter (TCNT0) diclear kan (di nol kan).

    Interupsi dapat dibangkitkan setiap kali nilai counter mencapai TOP dengan menggunakan flag OCF0. Jikainterupsi 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 dekatdengan nilai BOTTOM ketika counter sedang berjalan dengan nilai prescaler yang rendah atau nol harusdilakukan dengan ekstra hati-hati karena mode CTC tidak memiliki fitur double buffering. Jika nilai yangdimasukkan ke dalam OCR0 lebih rendah daripada nilai saat itu yang terdapat pada TCNT0, maka counterakan kehilangan event compare match. Counter akan menghitung hingga nilai maksimum (0xFF) lalu mulaikembali dari 0x00 sebelum event compare match terjadi.

    Untuk menghasilkan output yang berupa gelombang pada mode CTC, output OC0 dapat diset untuk mentogglelogic level output tersebut setiap terjadi event compare match dengan mensetting mode Compare Outputmenjadi mode toggle (COM01:0 = 1). Nilai OC0 tidak akan muncul pada port pin hingga data direction untukpin 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 fOC0 = fclk_I/O/2 ketika OCR0

    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 ketikaperalihan dari MAX ke 0x00.

  • 8/12/2019 Tutorial AVR

    18/31

    Mode Fast PWM

    Mode fast Pulse Width Modulation atau mode fast PWM (WGM01:0 = 3) memberikan opsi untukmembangkitkan gelombang PWM yang berfrekuensi tinggi. Operasi fast PWM ini berbeda dengan dengan opsiPWM lain yang ditandai dengan operasi kemiringan tunggalnya (single slope operation). Counter akanmenghitung mulai dari BOTTOM hingga MAX lalu restart kembali dari BOTTOM. Pada mode non-invertingCompare 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 setketika 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 phasecorrect PWM yang menggunakan operasi dual slope. Frekuensi yang tinggi ini membuat mode fast PWM cocokdigunakan untuk aplikasi power regulation, rectification, dan aplikasi DAC (Digital to Analog Converter).Frekuensi yang tinggi membolehkan penggunaan komponen fisik eksternal seperti kapasitor dan induktor yangkecil yang dapat mengurangi biaya total sistem.

    Pada mode fast PWM, counter akan menghitung secara naik (incremented) hingga nilai counter mencapai nilaiMAX. Counter kemudian di clear kan pada saat clock cycle timer selanjutnya. Diagram timing untuk mode fastPWM ditunjukkan pada gambar. Nilai TCNT0 pada diagram ditunjukkan dengan setengah segitiga histogramuntuk mengilustrasikan operasi single slope. Garis panah horizontal kecil yang menandai kemiringan TCNT0merepresentasikan event compare match antara TCNT0 dan OCR0.

    Flag overflow Timer/Counter (TOV0) akan di set setiap kali counter mencapai nilai MAX. Jika interupsidiaktifkan, 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 dapatdihasilkan dengan mengeset bit-bit tersebut menjadi 3. Nilai OC0 yang aktual akan dapat didapat pada portpin 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, danmengclearkan (atau mengeset) register OC0 pada clock cycle timer saat counter di clearkan (perubahan ketikaMAX 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 correctPWM yang memiliki resolusi tinggi. Mode phase correct PWM ini berdasarkan pada operasi dual slope (duakemiringan yaitu kemiringan naik dan turun). Counter akan menghitung secara berulang-ulang dari BOTTOMmenuju 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 frekuensimaksimum yang lebih rendah daripada operasi single slope. Bagaimanapun, karena fitur kesimetrisan darimode 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 PWMcounter akan melakukan penghitungan naik hingga mencapai nilai MAX. Ketika telah mencapai nilai MAX maka

  • 8/12/2019 Tutorial AVR

    19/31

    arah penghitungan dibalik yaitu mundur atau berkurang. Nilai TCNT0 akan sama dengan nilai MAX dalamwaktu 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 dualslope. Diagram ini memberikan ilustrasi output inverting dan non inverting. Garis panah horizon yangmenandai 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 dapatdigunakan untuk membangkitkan interupsi setiap kali counter mencapai nilai BOTTOM.

    Pada mode phase correct PWM, unit compare dapat digunakan untuk membangkitkan gelombang PWM padapin OC0. Dengan mengeset bit-bit COM01:0 menjadi 2 akan menghasilkan PWM non-inverting. Output PWMinverting dapat dihasilkan dengan mengeset bit-bit COM01:0 menjadi 3. Nilai aktual OC0 akan terlihat padaport pin jika data direction untuk port pin diset menjadi output. Gelombang PWM dibangkitkan denganmengclearkan (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 matchantara TCNT0 dan OCR0 ketika counter melakukan penghitungan mundur (decrement). Frekuensi output PWMketika 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 gelombangPWM pada mode phase correct PWM. Jika OCR0 di set sama dengan BOTTOM, maka output akan secarakontinyu bernilai low atau 0 dan jika OCR0 diset sama dengan MAX maka output akan secara kontinyu bernilaihigh 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 terdapatcompare 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 terdapatcompare match:

    Nilai OCR0A berubah dari nilai MAX seperti pada gambar. Ketika nilai OCR0A ialah MAX maka nilai pin OCnakan sama dengan hasil compare match ketika down counting. Untu memastikan kesimetrian disekitasBOTTOM 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 mengalamikehilangan event compare match dan juga perubahan pada OCn yang seharusnya terjadi ketika upcounting.

  • 8/12/2019 Tutorial AVR

    20/31

    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 memastikankompatibilitas dengan peralatan masa depan, bit ini harus diset nol ketika TCCR0 ditulis ketika beroperasipada 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 apadari 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, makaoutput 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 OC0harus 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. Tabelmemperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode Normal ataumode CTC (non-PWM).

    Tabel 40 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke mode fastPWM.

  • 8/12/2019 Tutorial AVR

    21/31

    Tabel 41 memperlihatkan fungsionalitas dari tiap-tiap bit COM01:0 ketika bit-bit WGM01:0 di set ke modephase 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 padacounter walaupun pin tersebut dikonfigurasi sebagai pin output. Fitur ini memberikan kesempatan untukmengontrol clock secara software.

    Timer/Counter Register - TCNT0

    Register Timer/Counter memberikan akses langsung, baik untuk operasi baca dan tulis ke unit counter 8-bitTimer/Counter0. Memodifikasi counter (TCNT0) ketika counter sedang berjalan, akan menampilkan resikokehilangan 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 untukmembangkitkan output berupa gelombang pada pin OC0.

    Timer/Counter Interrupt Mask Register - TIMSK

    Bit 1 - OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable

  • 8/12/2019 Tutorial AVR

    22/31

    Ketika bit OCIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi compare matchTimer/Counter0 diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika compare match padaTimer/Counter0 terjadi atau dengan kata lain bit OCF0 diset di Timer/Counter Interrupt Flag Register - TIFR.

    Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt EnableKetika bit TOIE0 di tulis 1, dan bit-I pada Status Register di set (1), maka interupsi overflow Timer/Counter0diaktifkan. Interupsi yang bersangkutan akan dieksekusi jika overflow pada Timer/Counter0 terjadi ataudengan kata lain bit TOV0 diset di Timer/Counter Interrupt Flag Register - TIFR.

    Timer/Counter Interrupt Flag Register TIFR

    Bit 1 - OCF0: Output Compare Flag 0Bit OCF0 akan di set (1) ketika terjadi compare match antara Timer/Counter0 dan data pada OCR0 - OutputCompare Register. OCF0 akan di clearkan oleh hardware ketika mengeksekusi interrupt handling vektor yangberkaitan.

    Bit 0 - TOV0: Timer/Counter0 Overflow FlagBit TOV akan di set (1) ketika terjadi overflow pada Timer/Counter0. TOV akan di clear kan oleh hardwareketika mengeksekusi interrupt handling vektor yang berkaitan.

    2. TIMER/COUNTER1 (16-BIT)

    Unit Timer/Counter 16-bit mengijinkan timing eksekusi program yang akurat (event management), pembangkitangelombang, 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 InputCapture 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) ialahregister 16-bit.

    Untuk melakukan penulisan 16-bit, high byte harus dituliskan terlebih dahulu sebelum low byte. Untuk melakukanpembacaan 16-bit, pembacaan low byte dilakukan terlebih dahulu sebelum pembacaan high byte.

    Definisi

    BOTTOM Counter akan mencapai BOTTOM ketika bernilai 0x0000.MAX Counter akan mencapai MAXimum ketika bernilai 0xFFFF (desimal 65535).TOP 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 nilaiyang tersimpan pada register OCR1A atau ICR1. Pemasukan nilai TOP ini bergantung padamode operasi yang dijalankan.

    Unit Counter

    Bagian utama dari Timer/Counter 16-bit ialah sebuah unit counter 16-bit yang dapat diprogram secara bi-

    directional. Gambar memperlihatkan blok diagram counter dan sekelilingnya.

  • 8/12/2019 Tutorial AVR

    23/31

    Deskripsi sinyal (sinyal internal):

    Count Increment atau decrement TCNT dengan nilai 1.Direction Pilih antara increment dan decrementClear Clear TCNT1 (mengeset semua bit menjadi nol)TOP Memberi sinyal bahwa TCNT1 telah mencapai nilai maksimumBOTTOM 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) mengandungdelapan bit paling atas dari counter, dan Counter Low (TCNT1L) mengandung delapan bit yang bawah. RegisterTCNT1H 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 ketikaTCNT1L 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 setiapclock timer. Sumber clock timer ini dapat dibangkitkan dari sumber internal atau eksternal, yang dipilih melalui bitClock 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 diTimer/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 bit-bit 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 WaveformGeneration mempengaruhi. Bit-bit COM1x1:0 mengontrol apakah output PWM yang dibangkitkan akan di invertatau 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 NormalMode operasi yang paling simpel ialah mode Normal (WGM13:0 = 0). Pada mode ini arah penghitungan selalunaik atau up counting (incrementing), dan tidak ada clear counter yang dilakukan. Counter akan secara simplemengalami overrun atau overflow ketika telah mencapai nilai maksimum 16-bit.

  • 8/12/2019 Tutorial AVR

    24/31

    KOMUNIKASI MIKROKONTROLER ATMEGA32 DAN PC DENGAN METODE USART

    Pada bagian ini akan dibahas sedikit mengenai salah satu fitur mikrokontroler AVR yakni ATMega32 untukberkomunikasi 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 MAX232seperti terlihat pada gambar di bawah

    Pada IC MAX232, pin nomor 11 (TXD) dihubungkan ke pin 14 (RXD) dari ATMega32. Sedangkan pin nomor 12pada IC MAX232 (RXD) dihubungkan ke pin 15 (TXD) dari ATMega32.

    Berikut adalah source code yang dipergunakan untuk melakukan komunikasi secara serial:

    #include #include #include #include //************************ #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

  • 8/12/2019 Tutorial AVR

    25/31

    bit rx_buffer_overflow;// USART Receiver interrupt service routineinterrupt [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 lcdslave_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 8char tx_buffer[TX_BUFFER_SIZE];#if TX_BUFFER_SIZE

  • 8/12/2019 Tutorial AVR

    26/31

    {tx_buffer[tx_wr_index]=c;if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;++tx_counter;}elseUDR=c;#asm("sei")

    }#pragma used-#endifvoid 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' ){};}

  • 8/12/2019 Tutorial AVR

    27/31

    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 :

  • 8/12/2019 Tutorial AVR

    28/31

    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 ADCmenggunakan CodeWizardAVR.

  • 8/12/2019 Tutorial AVR

    29/31

    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

    #include

    #include

    #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) {

  • 8/12/2019 Tutorial AVR

    30/31

    // 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

  • 8/12/2019 Tutorial AVR

    31/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 diHyperterminal.