Anda di halaman 1dari 37

C merupakan bahasa yang sangat kaya dan powerful.

Berbeda dengan kemampuan bahasa tingkat tinggi, C memanfaatkan penggunaan pointer dan pengalamatan tidak langsung yang umumnya hanya terdapat pada bahasa assembly. Dalam bahasa C, programmer dapat mengetahui lebih banyak tentang meori yang digunakan. Dengan bahasa C, programmer dapat secara langsung menuliskan data ke suatu register untuk mengatur kerja sebuah peripheral. Fitur seperti bahasa assembly inilah yang membuat banyak programmer mikrokontroler memilih bahasa C.

TABLE OF CONTENTS
I. PENGETAHUAN DASAR AVR 1.1. 1.2. 1.3. 1.4. TIGA PILIHAN AVR MEMILIH AVR YANG TEPAT HARDWARE UNTUK PEMROGRAMAN AVR PARALLEL PORT PROGRAMMER 5 5 5 5 6 7 7 7 7 7 7 7 7 8 8 8 8 8 9 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 Page 2

II. PENGENALAN BAHASA BASIC 2.1. KOMENTAR 2.2. LITERALS 2.2.1. INTEGER LITERALS 2.2.2. FLOATING POINT LITERALS 2.2.3. CHARACTER LITERALS 2.2.4. STRING LITERALS 2.3. VARIABEL 2.3.1. VARIABEL DAN AVR 2.4. KONSTANTA 2.5. LABELS 2.6. SIMBOL 2.7. FUNGSI Memanggil Fungsi 2.8. PROSEDUR Memanggil Prosedur 2.9. TIPE 2.9.1. TIPE SEDERHANA 2.9.2. ARRAY/LARIK 2.9.3. STRING 2.10. OPERATORS 2.10.1. OPERATOR ARITMATIK 2.10.2. UNARY ARITHMETIC OPERATORS 2.10.3. OPERATOR RELASI 2.10.4. OPERATOR BITWISE 2.10.5. OPERATOR BOOLEAN 2.11. STATEMENTS 2.11.1. PERNYATAAN PENUGASAN 2.11.3. SELECT CASE STATEMENT 2.11.4. FOR STATEMENTS 2.11.5. WHILE STATEMENT 2.11.6. DO STATEMENT 2.11.7. GOTO STATEMENT Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

2.11.8. GOSUB STATEMENT 2.11.9. ASM STATEMENT III. MIKROBASIC AVR 3.1. 3.2. 3.3. 3.4. FITUR : IDE (INTEGRATED DEVELOPMENT ENVIRONMENT) PROJECTS NEW PROJECT

13 13 14 14 15 15 15 16 16 16 18 18 18 19 20 22 23 23 24 25 25 26 28 29 30 31 31 31 Page 3

IV. ARSITEKTUR AVR 4.1. THE ARITHMETIC LOGIC UNIT (ALU) 4.2. SRAM V. HARDWARE 5.1. DESKRIPSI HARDWARE ATMEGA8/8535/16/32 5.1.1. ATMEGA 8 5.1.2. ATMEGA 8535/16/32 5.2. PERBANDINGAN PIN/PORT ATMEGA8/16/32/8535 VI. I/O PORTS PROGRAM 1. INPUT/OUTPUT PROGRAM 2. PENDETEKSIAN TOMBOL VII. 8 BIT TIMER-COUNTER0 PROGRAM 3. TIMER OVERFLOW PROGRAM 4. TIMER OVERFLOW-EXTERNAL CLOCK VIII. 8 BIT TIMER-COUNTER2 PROGRAM 5. PHASE CORRECT PWM PROGRAM 6. SWITCH CONTROLLED PHASE CORRECT PWM IX. ANALOG TO DIGITAL CONVERTER (ADC) 9.1. REGISTERS 9.1.1. ADMUX 9.1.2. ADCSR Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

9.1.3. ADCL DAN ADCH PROGRAM 7. ADC ON LEDS PROGRAM 8. ADC AUTO READ INTERRUPT X. UART (UNIVERSAL ASYNCHRONOUS RECEIVER-TRANSMITTER) 10.1. UART REGISTERS 10.1.1. UDR 10.1.2. UBRR 10.1.3. UCR 10.1.4. USR RXC: TXC: UDRE: FE: OR: 10.2. BAUD RATE GENERATOR PROGRAM 9. UART TRANSMIT-RECEIVE PROGRAM 10. UART & ADC

32 32 32 32 34 34 34 34 35 35 35 35 35 35 35 36 37

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 4

I.

PENGETAHUAN DASAR AVR

Keluarga mikrokontroler AVR memiliki arsitektur modern, dengan berbagai fitur yang menyertainya. Sekarang kita akan coba menggali lebih dalam mengenai mikrokontroler dari jenis ini beserta teknik pemrogramannya. 1.1. Tiga Pilihan AVR Mikrokontroler AVR terbagi atas tiga kelompok : 1. Tiny AVR 2. AVR (Classic AVR) 3. Mega AVR Perbedaan antara masing-masing kelompok tersebut teletak pada fitur-fitur yang menyertainya. TinyAVR umumnya merupakan divais dengan jumlah pin yang sedikit atau dengan fitur yang sangat terbatas dibandingkan dengan MegaAVR. Semua divais AVR memiliki set instruksi dan organisasi memori yang sama, sehingga migrasi atau melakukan perpindahan sistem dari jenis AVR ke jenis lain menjadi sangat mudah. Beberapa AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC, UART, dan lain sebagainya. Jika kita ambil TinyAVR dan MegaAVR lalu kita buang semua fitur yang menyertainya, maka yang tersisa adalah Core AVR. Core ini memiliki karakteristik yang sama untuk semua divais AVR. 1.2. Memilih AVR yang tepat Pada prinsipnya, TinyAVR, AVR (Classic AVR), dan MegaAVR tidak mencerminkan perbedaan performa, malinkan hanya pada kompleksitas : MegaAVR = memiliki banyak fitur, ukuran relatif besar, TinyAVR = sedikit fitur, ukuran relatif kecil, Classic AVR berada di antara kedua jeis tersebut, dan perbadaannya semakin samar. 1.3. Hardware untuk Pemrograman AVR Mempelajari pemrograman mikrokontroler membutuhkan perangkat keras tambahan untuk dapat melakukan pengujian program. Untuk dapat memrogram AVR memori dibutuhkan sebuah ISP (In-System Programmer) yang memungkinkan sebuah AVR deprogram tanpa harus melepaskannya dari system/rangkaian kerjanya. Interface ISP memiliki tiga jalur utama : SCK : Sinyal clock yang menggeser bit-bit yang akan ditransfer dari dan/atau ke AVR. MOSI : Sinyal data yang berisikan bit-bit yang akan diisikan ke AVR. MISO : Sinyal data yang berisikan bit-bit hasil pembacaan dari AVR. Ketiga sinyal informasi tersebut terhubung secara internal hanya jika kondisi logika pin RESET (RST) = 0. Gambar berikut menunjukkan dua macam konektor standar untuk ISP, yaitu ISP6 dan ISP10. Hal yang cukup penting untuk diperhatikan adalah supply tegangan pada saat programming hendaknya berbeda dengan supply tegangan sistem kerjanya.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 5

1.4. Parallel Port Programmer Gambar berikut menunjukkan skema dan contoh sebuah ISP. Konektor 25pin terhubung ke port parallel pada PC, dan konektor ISP 10 pin terhubung ke rangkaian kerja AVR. Proses pemrograman dibantu dengan sebuah software programmer pada PC, software ini lah yang melakukan algoritma pengiriman/pembacaan data ke AVR.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 6

II.
2.1. Komentar

PENGENALAN BAHASA BASIC

Komentar merupakan kalimat ang digunakan untuk menandai program. Komentar hanya diperuntukan bagi programmer. Komentar ditandai dengan tanda petik tunggal, semua kata/kalimat setelah tanda petik tunggal akan dianggap komentar oleh compiler dan tidka akan dicompile. 2.2. Literals Literal merepresentasikan nilai tetap atau nilai suatu karakter. 2.2.1. Integer Literals Literal bertipe integer dapat direpresentasikan dalam bentuk bilangan desimal, heksadesimal, atau biner. Dalam notasi desimal, bilangan desimal merupakan serangkaian angka tanpa tanda koma, spasi, atau titik. Dilengkapi dengan amalan tanda + atau yang sifatnya opsional. Awalan $ atau 0x menandakan jenis literal dalam notasi heksadesimal (contoh 0x0A, atau $0A), awalan % menandakan jenis literal dalam notasi biner (contoh %0101). 2.2.2. Floating Point Literals Nilai floating point tersusun atas : a. b. c. d. Bilangan integer desimal Nilai desimal (koma) Nilai pembagian Tanda e atau E yang menandakan eksponen.

Contoh : 0. ' = 0.0 -1.23 ' = -1.23 23.45e6 ' = 23.45 * 10^6 2e-5 ' = 2.0 * 10^-5 3E+10 ' = 3.0 * 10^10 .09E34 ' = 0.09 * 10^34 2.2.3. Character Literals Literal dengan tipe karakter adalah satu buah karakter dari kode ASCII yang diapit dengan tanda petik, contoh : A. 2.2.4. String Literals String merupakan literal yang berupa serangkaian karakter kode ASCII (hingga 255 karakter) dan diapit dengan tanda petik, contoh : Halloo 2.3. Variabel variable merupakan objek yang nilainya dapat berubah ketika program berjalan. Setiap variabel dideklarasikan dengan nama unik, nama ini digunakan untuk mengakses lokasi memori yang digunakan oleh variabel tersebut. Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 7

Setiap variabel harus dideklarasikan sebelum dapatt digunakan. Variabel dideklarasikan pada bagian deklarasi. Variabel global dapat diakses dari semua subrutin dideklarasikan dibawah baris pernyataan include diatas label main. Sintaks deklarasi variabel adalah : dim identifier_list as type disini, identifier_list adalah daftar variabel yang akan dideklarasikan (dipisahkan dengan tanda koma) yang semuanya memiliki tipe seperti dinyatakan pada type. 2.3.1. Variabel dan AVR Setiap variabel yang telah dideklarasikan, menggunakan RAM sebagai tempat penyimpanannya. Tipe data dari suatu variabel menentukan tidak hanya rentang nilai variabelnya tapi juga banyaknya lokasi memori yang digunakan. 2.4. Konstanta Konstanta adalah data yang nilainya tidak dapat diubah ketika program berjalan. Menggunakan konstanta dalam program tidak akan menggunakan lokasi RAM AVR. Konstanta dideklarasikan dengan baris berikut : const constant_name [as type] = value setiap konstanta dideklarasikan dengan menggunakan nama konstanta yang unik, tradisinya adalah menuliskan nama konstanta menggunakan huruf kapital. Konstanta membutuhkan suatu nilai yang sesuai dengan tipe yang dideklarasikan . 2.5. Labels Label bertindak sebagai target/tujuan dari pernyataan goto dan gosub. Label ditandai dengan menambahkan danta titik dua (:) seperti berikut : label_identifier : statement 2.6. Simbol Simbol dalam BASIC memungkinkan kita muntuk membuat sebuah MACRO yang sederhana tanpa parameter. Simbol dapat menggantikan satu baris program. Simbol harus dideklarasikan pada awal progam setalah nama program dan baris include. Simbol dideklarasika sebagai berikut : symbol alias = code Alias merupakan sebuah identifier/nama yang akan digunakan di dalam program nantinya. Code merupakan satu baris program (dapat berupa literal, pemanggilan fungsi, dll). 2.7. Fungsi Fungsi dideklarasikan seperti berikut : sub function function_name(parameter_list) as return_type [ local declarations ] function body end sub Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 8

function_nama = nama fungsi, return_type adalah tipe data nilai balik, didalam kurung, parameter_list adalah parameter-paramter yang akan dipergunakan dalam fungsi, local_declaration adalah deklarasi local untuk variabel yang akan dipergunakan dalam fungsi dan sifatnya opsional. Memanggil Fungsi Sebuah fungsi dipanggil menggunakan nama fungsinya, dengan argument berupa parameter yang disusun sesuai dengan pada deklarasi. Nilai balik dari fungsi akan disimpan dalam sebuah objek sementara yang dibuat dari baris return. 2.8. Prosedur Prosedur dideklarasikan seperti berikut : sub procedure procedure_name(parameter_list) [ local declarations ] procedure body end sub secara umum pendeklarasiannya sama dengan fungsi, hanya saja dalam prosedur tidak akan dibuat objek sementara untuk menyimpan nilai balik. Memanggil Prosedur Sebuah prosedur dipanggil menggunakan nama fungsinya, dengan argument berupa parameter yang disusun sesuai dengan pada deklarasi. 2.9. Tipe BASIC merupakan bahasa yang sangat ketat, yang artinya semua variabel dan konstanta harus memiliki tipe yang diketahui pada saat kompilasi. Salah satu kegunaan tipe adalah untuk menentukan alokasi memori yang dibutuhkan untuk menyimpan variabel/konstanta tersebut. 2.9.1. Tipe Sederhana Tipe sederhana merupakan tipe yang tidak dapat dipecah ke bentuk yang lebih kecil, dan tipe ini merupakan model representasi data pada tingkat mesin. Berikut adalah table untuk tipe sederhana ini : Tipe byte char* word short integer longint float 8bit 8bit 16bit 8bit 16bit 32bit 32bit Ukuran Range 0 255 0 255 0 65535 -128 127 -32768 32767 -2147483648 2147483647 1.17549435082 * 10-38 .. 6.80564774407 * 1038

* tipe char dapat dianggap sebagai byte.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 9

2.9.2. Array/Larik Array merepresentasikan kumpulan elemen bertipe sama yang disusun berdasarkan indeks. Karena disusun berdasarkan indeks, maka array dapat menyimpan nilai yang sama lebih dari satu kali. Array dideklarasikan seperti berikut : type[array_length] Setiap elemen array diberikan nomor indeks dari 0 hingga panjang_array(array_length) -1. Setiap elemen array dapat diakses dengan menentukan nama array dan indeks elemen yang ingin diakses. 2.9.3. String String merepresentasikan rangkaian karakter, dan serupa dengan sebuah array atas tipe char, string dideklarasikan sebagai berikut : string[string_length] string_length (panjang string) merupakan jumlah karakter yang ada dalam string tersebut. String disimpan dengan menambahkan karakter null (0x00). 2.10. Operators

Operator merupakan trigger terhadap suatu operasi ketika diaplikasikan terhadap variabel dan objek lain dalam suatu ekspresi/pernyataan. 2.10.1. Operator Aritmatik Operator aritmatik digunakan untuk melakukan komputasi matematis, operator ini memiliki operand dan hasil numerik. Operator + * / div mod Operation addition subtraction multiplication division, floating-point division, rounds down to nearest integer modulus, returns the remainder of integer division (cannot be used with floating points) Operands byte, short, integer, word, longint, float byte, short, integer, word, longint, float byte, short, integer, word, float byte, short, integer, word, float byte, short, integer, word, longint, float byte, short, integer, word, longint Result byte, short, integer, word, longint, float byte, short, integer, word, longint, float integer, word, longint, float byte, short, integer, word, float byte, short, integer, word, longint byte, short, integer, word, longint

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 10

2.10.2. Unary Arithmetic Operators Operator yang bekerja hanya pada satu operand, yaitu operator -, berguna untuk mengubah tanda suatu integer literal menjadi minus. Contoh : b = -a 2.10.3. Operator relasi Digunakan untuk menguji kesamaan atau ketidaksamaan suatu ekspresi. Semua operator relasi memberikan nilai balik berupa TRUE atau FALSE. Operator = <> > < >= <= Operation equal not equal greater than less than greater than or equal less than or equal 2.10.4. Operator Bitwise Digunakan untuk memodifikasi bit-bit individual dari suatu operand numerik. Operator and or Operation bitwise AND; compares pairs of bits and generates a 1 result if both bits are 1, otherwise it returns 0 bitwise (inclusive) OR; compares pairs of bits and generates a 1 result if either or both bits are 1, otherwise it returns 0 bitwise exclusive OR (XOR); compares pairs of bits and generates a 1 result if the bits are complementary, otherwise it returns 0 bitwise complement (unary); inverts each bit bitwise shift left; moves the bits to the left, it discards the far left bit and assigns 0 to the right most bit. bitwise shift right; moves the bits to the right, discards the far right bit and if unsigned assigns 0 to the left most bit, otherwise sign extends

xor

not << >>

2.10.5. Operator Boolean Operator ini melakukan operasi Boolean standar, dan memberikan nilai balik TRUE (logika 1) atau FALSE (logika 0). Operator and or xor not Operation logical AND logical OR logical exclusive OR (XOR) logical negation Page 11

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

2.11.

Statements

Statement/pernyataan merupakan aksi algoritmik, setiap pernyataan harus diakhiri dengan karakter Line Feed (CR/LF). 2.11.1. Pernyataan penugasan Pernyataan ini memiliki bentuk : variable = expression pernyataan ini akan mengevaluasi expression lalu memasukkan hasilnya ke dalam variabel. 2.11.2. If Statement Digunakan untuk melakukan pernyataan bersyarat, memiliki sintaks : if expression then statements [else other statements] end if ketika expressions dievaluasi dan menghasilkan nilai TRUE, maka stetements akan dieksekusi, tetapi jika FALSE maka yang akan dieksekusi adalah other statements. 2.11.3. Select Case Statement Select case digunakan untuk melakukan percabangan berdasarkan kondisi tertentu, pernyataan ini terdiri atas selector dan daftara kemungkinan nilai. select case selector case value_1 statements_1 ... case value_n statements_n [case else default_statements] end select 2.11.4. For Statements Pernyataan ini mengimplementasikan loop/iterasi dan membutuhkan nilai jumlah iterasi. for counter = initial_value to final_value [step step_value] statements next counter

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 12

2.11.5. While Statement Digunakan untuk melakukan iterasi berdasarkan kondisi tertentu. while expression statements wend Pernyataan while akan menguji ekspresi terlebih dahulu baru kemudian melalukan aksi. 2.11.6. Do Statement Pernyataan Do akan melakukan suatu aksi pernyataan hingga suatu kondisi yang dinyatakan dengan ekspresi menjadi benar. do statements loop until expression 2.11.7. Goto Statement Goto digunakan untuk melakukan lompatan ke suatu label tanpa membutuhkan kondisi. goto label_name 2.11.8. Gosub Statement Gosub digunakan untuk melompat ke suatu label tanpa memerlukan kondisi dan kembali ke asal setelah ada perintah return satu baris dibawah baris gosub. gosub label_name ... label_name: ... return 2.11.9. asm Statement Pernyataan ini digunakan untuk menyisipkan baris-baris instruksi dalam bahasa assembly ke dalam bahasa BASIC. asm block of assembly instructions end asm

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 13

III.

MIKROBASIC AVR

MikroBASIC adala sebuah tools software untuk AVR yang kaya fitur, memiliki IDE yang sangat informative, code library yang lengkap sehingga sangat memudahkan bagi merekan yang ingin mempelajari pemrograman AVR menggunakan bahasa BASIC.

3.1. Fitur : Penulisan source code dalam bahasa BASIC menggunakan editor yang terintegrasi (code & parameter assistant, auto correct, template, syntax highlight). Library yang lengkap untuk proses akuisisi data, memory, display, komunikasi, dll. Memonitor struktur program, variabel, fungsi. Melakukan debug untuk mengamati aliran program Informasi detil mengenai penggunaan RAM, ROM, statistik kode program, assembly, dll.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 14

3.2. IDE (Integrated Development Environment)

3.3. Projects mikroBasic mengorganisasikan aplikasi ke dalam bentuk project, yang terdiri atas satu buah project file (*.abp), dan satu atau lebih file sumber (*.abas). file dapat di-compile hanya jika file tersebut merupakan bagian dari project. Project memiliki informasi berikut : Nama project dan deskripsi Divais target Frekuensi Clock Source file (file sumber) 3.4. New Project Untuk membuat project baru, gunakan menu Project > New Project lalu isikan informasi project pada kotak dialog yang muncul. Dengan sendirinya mikroBASIC akan membuatkan satu buah file sumber default untuk project anda.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 15

IV.
4.1. The Arithmetic Logic Unit (ALU)

ARSITEKTUR AVR

ALU -atau yang biasa kita kenal dengan istilah CPU pada sebuah PC- terhubung ke set register, Program Memory, SRAM, dan peripeheral internal, walaupun ada juga peripheral eksternal yang terhubung ke ALU, seprti eksternal SRAM. Sebuah program dapat dibuat dengan efektif hanya jika programmer mengetahui bagaimana peripeheralperipheral ini bekerja dan bagaimana sebuah instruksi dikerjakan oleh ALU. Program yang dibuat akan dikerjakan oleh ALU, mulai dari mengisikan nilai ke register, menuliskan nilai ke Port I/O dan lain sebgaianya.

Program counter adalah koneksi ALU ke program memory, pada dasarnya program counter ini hanya merupakan alamat instruksi yang akan dieksekusi oleh ALU, nilai program counter dapat dimodifikasi oleh perintah-perintah lompatan dan percabangan. Set register yang dimiliki oleh AVR berjumlah 32 buah, yaitu R0 sampai R31. Register terendah, yaitu R0 R15 tidak dapat diakses secara langsung menggunakan operasi immediate. Set Register ini terhubung ke SRAM. Semua register dapat disimpan dalam SRAM dan juga dapat digunakan sebagai pointer (R26R31) untuk menangani pengalamatan tidak langsung, array, dan lain sebagainya. Internal peripheral adalah sebuah blok fungsi seperti UART (Universal Asynchronous Receiver and Transmitter), Timers, SPI (Serial Peripheral Interface), EEPROM, dan banyak lagi. Hal penting yang harus diingat adalah tidak semua jenis AVR memiliki peripheral internal yang sama. 4.2. SRAM SRAM adalah memory bagi AVR. Sementara register digunakan untuk melakukan kalkulasi, SRAM digunakan untuk menyimpan data selama AVR bekerja. Untuk dapat menggunakan SRAM secara efektif, perlu diketahui peta/lokasi pengalamatan memory dalam AVR. Pengalamatan memory AVR terbagi atas tiga bagian utama, File Register (R0 R31), I/O Register, dan internal SRAM.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 16

Diagram tersebut menunjukkan pembagian alamat lokasi memori dalam AVR. Seperti tampak dalam gambar, SRAM menempati alamat memori yang dimulai dari 0x60. Register AVR, dan I/O register menempati lokasi data pada alamat rendah. Hal ini memiliki keuntungan yaitu masing-masing register dapat diakses menggunakan pointer register X, Y, dan Z.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 17

V.
5.1. Deskripsi Hardware ATMega8/8535/16/32

HARDWARE

Chip yang dijelaskan disini semuanya menggunakan kemasa DIP (Dual In-line Package), untuk jenis kemasan yang lain (TQFP, QFN/MLF) tidak jauh berbeda. Nama-nama pin pada masing-masing AVR usahakan untuk lebih sering dikenal, hal ini berguna untuk penggunaan peripeheral internal yang berhubungan dengan fungsi alternatif pin. Fungsi alternatif pin dijelaskan pada masing-masing bab dan akan selalu merujuk pada deskripsi hardware chip seperti dalam gambar berikut : 5.1.1. ATMega 8

Nama Pin VCC GND PORT B (PB7..PB0)

Deskripsi Tegangan Supply Ground Port I/O 8-bit dengan resistor pull-up internal tiap pin. Buffer Port B mempunyai kapasitas menyerap (sink) dan mencatu (source). Khusus PB6 dapat digunakan sebagai input kristal dan input ke rangkaian clock, bergantung pada pengaturan fuse bit untuk memilih sumber clock Khusus PB7 dapat digunakan sebagai input kristal dan input ke rangkaian clock, bergantung pada pengaturan fuse bit untuk memilih sumber clock Jika sumber clock yang dipilih adalah osilator internal, PB7 dan PB6 dapat digunakan sebagai I/O atau jika menggunakan Asynchronous Timer/Counter2 maka PB6 dan PB7 (TOSC2 dan TOSC1) digunakan untuk saluran input counter

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 18

PORT C (PC5..PC0) RESET/PC6

Port I/O 7-bit ([PC6], PC5..PC0) dengan resistor pull-up internal tiap pin. Jika fusebit RSTDISBL di program, PC6 digunakan sebagai Pin I/O. Jika fusebit RSTDISBL di unprogrammed PC6 digunakan sebagai pin RESET (aktif low). Port I/O 8-bit dengan resistor pull-up internal tiap pin. Pin tegangan supply untuk memberikan tegangan pada A/D Converter. AVCC harus dihubungkan ke VCC apabila ADC tidak digunakan. pin tegangan referenci untuk A/D Converter. digunakan sebagai pin input ADC

PORT D (PD7..PD0) AVCC

AREF ADC7..6(TQFP,QFN/MLF)

5.1.2. ATMega 8535/16/32 ATMega8535

ATMega16

ATMega32

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 19

VCC GND PORT A (PA7..PA0) PORT B (PB7..PB0) PORT C (PC7..PD0) PORT D (PC7..PD0)

Supply Tegangan Ground Port I/O 8-bit dengan resistor pull-up internal tiap pin.

5.2. Perbandingan Pin/Port ATMega8/16/32/8535 Tabel di bawah menunjukkan perbandingan masing-masing pin/port, dan huruf tebal menunjukkan perbedaan fungsi alternatif antar-pin. Tabel ini berguna untuk melakukan cross reference antara masingmasing AVR dan mencari kesesuaian fungsi antar pin pada tiap AVR. Untuk memudahkan pemahaman maka kesampingkan dulu fungsi alternatif, sehingga fokus pada tiap Port dalam amsing-masing AVR yaitu Port A, B, C, dan D. Fungsi alternatif untuk ATMega16/32/8535 sama hanya saja 8535 sedikit berbeda pada fungsi Port C. Atmega8 memiliki perbedaan dari yang lain seperti terlihat dalam tabel. ATMega8 PORT A PB0 (ICP1) PB1 (OC1A) PB2 (SS/OC1B) PB3 (MOSI/OC2) PB4 (MISO) PB5 (SCK) PB6 (XTAL1/OSC1) PB7 (XTAL2/OSC2) PC0 (ADC0) PC1 (ADC1) PC2 (ADC2) PC3 (ADC3) PC4 (ADC4/SDA) ATMega16 PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) PB0 (XCK/T0) PB1 (T1) PB2 (INT2/AIN0) PB3 (OC0/AIN1) PB4 (SS) PB5 (MOSI) PB6 (ISO) PB7(SCK) PC0 (SCL) PC1 (SDA) PC2 (TCK) PC3 (TMS) PC4 (TDO) ATMega32 PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) PB0 (XCK/T0) PB1 (T1) PB2 (INT2/AIN0) PB3 (OC0/AIN1) PB4 (SS) PB5 (MOSI) PB6 (ISO) PB7(SCK) PC0 (SCL) PC1 (SDA) PC2 (TCK) PC3 (TMS) PC4 (TDO) ATMega8535 PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) PB0 (XCK/T0) PB1 (T1) PB2 (INT2/AIN0) PB3 (OC0/AIN1) PB4 (SS) PB5 (MOSI) PB6 (ISO) PB7(SCK) PC0 PC1 PC2 PC3 PC4 Page 20

PORT B

PORT C

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

PORT D

PC5 (ADC5/SCL) PC6 (RESET) PD0 (RXD) PD1 (TXD) PD2 (INT0) PD3 (INT1) PD4 (XCK/T0) PD5 (T1) PD6 (AIN0) PD7 (AIN1)

PC5 (TDI) PC6 (TOSC1) PC7 (TOSC2) PD0 (RXD) PD1 (TXD) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP1) PD7 (OC2)

PC5 (TDI) PC6 (TOSC1) PC7 (TOSC2) PD0 (RXD) PD1 (TXD) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP1) PD7 (OC2)

PC5 PC6 (TOSC1) PC7 (TOSC2) PD0 (RXD) PD1 (TXD) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP1) PD7 (OC2)

Keterangan : Huruf tebal menunjukkan perbedaan fungsi alternative pada pin ATMEga8 dengan AVR yang lain, sedangkan shading abu-abu menunjukkan perbedaan antara ATMega8535 dengan ATMega16, dan ATMega32.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 21

VI.

I/O PORTS

I/O Port pada AVR sangat mudah dipahami, masing-masing Port digerakkan/diatur oleh tiga buah register, yaitu Port Register, Data Direction Register, dan Pin Register. Berikut adalah gambar fungsional dari sebuah port :

Seperti yang terlihat dalam gambar, masing-msaing pin dalam sebuah port memiliki pull-up internal, yang dapat diaktifkan melalui pengaturan bit dalam DDR (Data Direction Register). Kebanyakan kesalahan yang dilakukan oleh programmer saat mengakses port IO adalah ketika akan membaca nilai pin dari suatu port, umunya yang dilakukan adalah membaca nilai register Port yang bersangkutan, seharusnya yang dibaca adalah Pin dari Port yang bersangkutan. Karena register Pin terhubung langsung dengan pin secara fisiknya. Seperti yang telah disebutkan sebelumnya, setiap port memiliki tiga buab register : DDRx, PORTx, dan PINx (dimana x adalah huruf port). DDRx memilih arah port (sebagai masukan atau keluaran), jika logika 1 dituliskan ke register DDRx maka port pada bit yang bersangkutan menjadi outout, dan bila dituliskan logika 0 maka akan menjadi input. Jika DDRx diisikan logika 0 dan PORTx diisikan logika 1 maka port dikonfigurasikan sebagai inout dengan mengaktifkan internal pull-up.

DDRx 0 0 0 1 1

PORTx 0 1 1 0 1

PUD I/O (SFIOR) x Input 0 1 x x Input Input Output Output

Pull-Up No Yes No No Yes

Deskripsi Tri-state (High Z) membutuhkan pull-up eksternal Input (akan menjadi source bila diberi logika 0) Tri-state (High Z) membutuhkan pull-up eksternal Output low (sink) Output high (source

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 22

Program 1. Flashing LED sub procedure wait Delay_ms(500) end sub main: DDRD = $FF while true PORTD = $FF wait PORTD = $00 wait wend end.

' PORTD = output ' nyalakan led ' padamkan led

Program 2. Pendeteksian Tombol main: DDRC = $FF ' PORTC output PORTC = $00 while TRUE if Button(PORTB, 0, 100, 1) PORTC = $01 end if if Button(PORTB, 1, 100, 1) PORTC = $02 end if if Button(PORTB, 2, 100, 1) PORTC = $04 end if if Button(PORTB, 3, 100, 1) PORTC = $08 end if wend end.

then

Jika PORTB.0 = 1 selama 100mS PORTC.0 = 1

then

then

then

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 23

VII.

8 BIT TIMER-COUNTER0

Timer merupakan bagian penting dalam sebuah embedded system. Fitur penting yang dimiliki oleh timer adalah peripeheral internal ini bekerja secara independen terhadap program utama. Yang perlu dilakukan adalah melakukan pengaturan awal terhadap timer lalu ia akan bekerja dengan sendirinya, dan program utama dapat mengerjakan hal lain tanpa harus megawasi timer. Atmega8 memiliki dua buah timer/counter 8-bit dan satu buah timer 16-bit. Fitur yang dimiliki oleh timer 8bit adalah : Counter 1 channel Pembangkit frekuensi Counter event eksternal 10-bit clock prescaler

TCNT0 adalah register timer/counter 8-bit. Timer/counter dapat di-clock oleh sumber eksternal melalui pin T0. Timer/counter akan menambahkan isinya hingga maksimum (0xFF) lalu mengulang kembali dari 0x00. Setelah timer mengalami overflow, flag TOV0 berlogika 1 dan jika bit TOIE0 berlogika 1 maka ISR (Interrupt Service Routine) timer/counter0 akan dijalankan. Prescaler merupakan sebuah pembagi frekuensi, ia dapat bernilai 1, 8, 64, 256, 1024.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 24

Prescaler ini dikendalikan dengan mengisikan nilai ke register TCCR0. Berikut adalah contoh program penggunaan timer 0. Program 3. Timer Overflow program timer0_ov sub procedure Timer_Interrupt0 org 0x009 TCNT0=0xD5 'CLI ' disable interupts PORTC = not(PORTC) ' toggle PORTD 'SEI ' enable interupts end sub main: PORTC=0x00 DDRC=0xFF TCCR0=0x05 TCNT0=0xD5 TIMSK=0x01 SREG.7 = 1 ' enable global interrupt 'SEI while true portc=0xff wend end. Program 4. Timer Overflow-External Clock program timer0_ov(ext) sub procedure Timer_Interrupt0 org 0x009 TCNT0=0xD5 'CLI ' disable interupts PORTC = not(PORTC) ' toggle PORTD 'SEI ' enable interupts end sub main: PORTC=0x00 DDRC=0xFF TCCR0=0x07 TCNT0=0xD5 TIMSK=0x01 SREG.7 = 1 'SEI while true portc=0xff wend end.

' enable global interrupt

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 25

VIII. 8 BIT TIMER-COUNTER2


Timer/Counter 2 dalam Atmega8 memiliki fitur yang lebih dibandingkan Timer/Counter0, seperti : Counter satu channel Auto Reload (Clear timer setelah pembandingan) PWM modulator Pembangkit frekuensi Prescaler 10-bit 2 sumber interrupt Dapat menerima sumber clock eksternal Berdasarkan fitur-fitur tersebut, dan bila dibandingkan dengan Timer/Counter0 terlihat bahwa terdapat tiga register lagi selain OCR2, yang digunakan untuk membandingkan register timer/counter dan melakukan aksi bila hasilnya sama. Dengan kemampuan auto reload-nya maka timer akan kembali nol bila hasil pembadingannya sama.

Dari gambar terlihat bahwa OCR2 di-buffer terlebih dahulu ketika berada dalam mode PWM. Buffer ini digunakan untuk melakukan sinkronisasi update nilai OCR2 comapre register terhadap proses penghitungan. Sinkronisasi ini mencegah munculnya sinyal PWM yang tidak simetris. Mode Operasi Timer/Counter2 : Mode Normal dalam mode ini proses counter selalu naik (up counter) dan counter tidak akan diclear. Secara umum mode ini sama dengan mode pada Timer/Counter0.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 26

Clear Timer on Compare Match mode CTC berbeda dengan mode normal, dimana apabila proses pembandingan menyatakan sama antara cilia counter dengan nilai dalam TCNT2, maka nilai counter akan di-clearkan.

Interrupt akan dibangkitkan setiap kali pembandingan menyatakan sama. Mode ini cocok digunakan untuk membangkitkan frekuensi pada pin OC2, dengan frekuensi keluaran ditentukan dari persamaan :

fclk_I/O = frekuensi sumber clock ; N = nilai prescaler (1, 8, 32, 64, 128, 256, or 1024), OCRn nilai register OCR2. Jika OCR2 bernilai 0 maka frekuensi keluaran akan setengah dari frekuensi clock sumber. Mode Fast PWM (WGM21:0=3 dalam TCCR2) adalah ode PWM frekuensi tinggi (slope tunggal).

Gambar menunjukkan sinyal PWM non-inverting dan inverting, pin OC2 akan di-clear pada saat nilai counter sama dengan nilai yang diset dan akan mengulang kembali dari nol. Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 27

Mode Phase correct PWM (WGM21:0=1). Ini merupakan mode PWM slope ganda yang dapat menyesuaikan phasa sinyal keluaran.

Mode ini biasanya digunakan dalam pengendalian motor karena bentuk sinyal yang dihasilkannya simetris. Hal pening yang harus diingat ketika menggunakan mode ini adalah pin OC2 harus diatur sebagai output.

Program 5. Phase correct PWM Program pwm_test dim duty as byte i as byte main: DDRB = 0xFF ASSR=0x00 TCCR2=0x64 TCNT2=0x00 OCR2=0x00 ' set direction register for pwm

while true for i = 0 to 255 duty = duty + 1 OCR2 = duty delay_ms(100) next i wend end. Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 28

Program 6. Switch Controlled Phase correct PWM program pwm_test_ext dim duty as byte i as byte main: DDRB = 0xFF ' set direction register for pwm ASSR=0x00 TCCR2=0x64 TCNT2=0x00 OCR2=0x00 while true if Button(PORTB, 1, 100, 1) then duty = duty + 1 end if if Button(PORTB, 2, 100, 1) then duty = duty + 1 end if OCR2 = duty delay_ms(100) next i wend end.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 29

IX.

ANALOG TO DIGITAL CONVERTER (ADC)

Kebanyakan AVR telah memiliki ADC terintegrasi, sehingga membuat perancangan dan implementasi sebuah embedded system menjadi lebih mudah. Pada Atmega8 terdapat 8 buah masukan ADC dengan resolusi 10bit (kecuali ADC4 dan 5 yang hanya 8-bit). Beberapa fitur ADC yang dimiliki oleh AVR adalah :

2 LSB accuracy dengan tegnagan referensi 5 volt, maka eror yang mungkin mucul dapat mencapai 0.04V. 0.5 LSB non-linearity; Kecepatan konversi 15kSPS (15000 cuplikan per detik. ADC mendapatkan supply tegangan yang terpisah dari sistem AVR lain, supply ini diberikan melalui pin AVCC dan AGND, nilai tegangan AVCC hanya diijinkan berbeda 0.3V dari nilai VCC. Unit ADC juga dapat meiliki sumber tegangan referensi berbeda, yang diberikan melalui pin AREF. Semua masukan ADC dipilih oleh sebuah multiplekser, masing-masing channel dapat dipilih dengan mengatur nilai 4-bit dalam register ADMUX. ADC dapat beroperasi dalam dua mode : Single conversion ADC akan melakukan satu kali konversi lalu berhenti. Free running conversion dalam mode ini, proses konversi dilakukan secara kontinyu. Dalam mode ini, register data ADC harus dibaca terlebih dahulu sebelum nilai hasil konversi baru dapat ditulis.

Dari gambar terlihat bahwa, keluaran ADC disimpan dalam dua register, ADCH dan ADCL, hal ini karena nilai hasil konversi ADC adalah 10-bit, sedangkan register hasil hanya berukuran 8-bit, sehingga dibutuhkan dua register untuk menyimpannya.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 30

Nilai keluaran (hasil konversi ADC) dapat dihitung menggunakan rumus berikut : ADC conversion value = round ((vin/vref)*1023) 9.1. Registers Terdapat empat register yang terkait dengan pengoperasian ADC, yaitu : ADMUX (ADC Mulptiplexer Register), ADCSR (ADC Control & Status Register), ADCL (ADC Low), dan ADCH (ADC High). 9.1.1. ADMUX Bit 7 --Bit 6 --Bit 5 --Bit 4 --Bit 3 --Bit 2 MUX2 Bit 1 MUX1 Bit 0 MUX0

Register ini digunakan untuk memilih channel masukan mana (antara ADC0 ADC7) yang akan diproses oleh ADC. Karena ADC hanya memiliki 8 channel masukan, maka hanya tiga bit terendah pada register ini yang digunakan. MUX2 MUX1 MUX0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 Input terpilih ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 ADC6 ADC7

9.1.2. ADCSR

Bit 7 ADEN

Bit 6 ADSC

Bit 5 ADFR

Bit 4 ADIF

Bit 3 ADIE

Bit 2 Bit 1 Bit 0 ADPS2 ADPS1 ADPS0

ADEN (ADC Enable) bit : ADC akan aktif (enable) bilai bit ini berlogika 1. ADSC (ADC Start Conversion) bit : Dalam mode free running, proses konversi akan dimulai jika bit ini berlogika 1 dan proses konversi berikutnya akan mulai setelah proses pertama selesai, dan seterusnya. Dalam mode single conversion, setiap akan mengonversi maka bit ini harus dibuat berlogika 1, dan akan kembali berlogika 0 setelah konversi selesai. ADFR (ADC Free Running Select) bit : Buatlah bit ini berlogika 1 jika ingin menggunakan mode free rungging. ADIF (ADC Interrupt Flag) bit : bit ini akan berlogika 1 bila proses konversi selesai. Jika bit ADIE berlogika 1 dan interupsi global enable, maka interupsi ADC conversion Complete akan dijalankan.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 31

ADIE (ADC Interrupt Enable) bit : Ketika berlogika 1 dan interupsi global diaktifkan, maka akan mengaktifkan rutin interusi ADC setiap kali proses konversi selesai. ADPS (ADC Prescaler) bits : Bit-bit ADPS digunakan untuk menentukan factor pembagi antara clock AVR dengan clock ADC, berikut adalah nilai factor pembaginya : ADPS2 ADPS1 ADPS0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 Division Factor 2 2 4 8 16 32 64 128

9.1.3. ADCL dan ADCH Kedua register ini menyimpan hasil dari konversi terakhir yang dilakukan ADC, ADCH menyimpan dua bit teratas, dan ADCL menyimpan 8 bit sisanya, proses pembacaan dilakukan dengan membaca ADCL terlebih dahulu baru kemudian membaca ADCH. Berikut adalah contoh program untuk mengakses ADC : Program 7. ADC on LEDs program adc_on_led dim data as word main: while true ' adc input PORTC.0 data=Adc_Read(0) PORTC=data Delay_ms(10) wend end. Program 8. ADC on timer Program adc_on_timer dim data as word sub procedure Timer_Interrupt0 org 0x009 TCNT0=0xD5 'CLI ' disable interupts data=Adc_Read(0)

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 32

PORTC = data 'SEI end sub main: PORTC=0x00 DDRC=0xFF TCCR0=0x05 TCNT0=0xD5 TIMSK=0x01 SREG.7 = 1 'SEI while true portc=0xff wend end.

' enable interupts

' enable global interrupt

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 33

X.

UART (UNIVERSAL ASYNCHRONOUS RECEIVER-TRANSMITTER)

AVR UART merupakan peripheral yang cukup berguna dalam beberapa project embedded system. Peripheral ini dapat digunakan untuk melakukan debug terhadap program, interaksi dengan user, atau hanya mengirimkan data ke PC untuk keperluan data logging. Berikut adalah gambaran blok diagram peripheral ini.

Modul UART dalam AVR dapat diatur untuk mentransmisikan data 8bit atau 9bit, tanpa parity, satu stop bit, dan mampu mendeteksi kondisi overrun dan kesalahan frame. 10.1. UART Registers

10.1.1. UDR UDR adalah buffer dengan arah penerimaan, sehingga data dapat dibaca setelah diterima sepenuhnya sementara data beriktunya sedang diterima. Proses transmisi dimulai ketika data dituliskan ke UDR, proses pembacaan data dilakukan dengan menggeser data dari bagian penerima. 10.1.2. UBRR Uart Baud Rate Register digunakan untuk mengatur clock UART. Dalam beberapa tipe AVR, register ini merupakan register 16-bit sehingga memungkinkan kecepatan UART rendah sementara clock AVR bernilai tinggi. 10.1.3. UCR UART Control Register, mengatur fungsi transmitter dan receiver. Bit 7 RXCIE TXCIE UDRIE Bit 0 RXEN TXEN CHR9 RXB8 TXB8

RXCIE: Receive Complete Interrupt Enable; TXCIE: sama dengan RXCIE tetapi untuk proses pengiriman. Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 34

UDRIE: UART Data Register Empty Interrupt Enable; RXEN: Receiver Enable; TXEN: Transmitter Enable; CHR9: karakter 9 bit, bit ini memungkinkan ukuran data sebesar 9bit. Defaultnya, bit ini berlogika 0 yang berarti mode 8bit. Jika menggunakan mode 9bit, maka bit ke-9 berada pada RXB8 dan TXB8. 10.1.4. USR UART status register menyimpan flag status UART, sepreti interrupt, overflow, framing error, dll : holds status flags such as interrupt flags, overflow and framing error flags: Bit 7 RXC Bit 0 ---

TXC

UDRE

FE

OR

---

---

RXC: Receive Complete; TXC: Transmit Complete; UDRE: UART Data Register Empty; UDRE akan berlogika 1 yang menandakan transmitter siap mengirimkan data. FE: Framing Error; OR: OverRun; flag ini berguna untuk mendeteksi apakah program menangani data yang data dengan cukup cepat. Flag ini berlogika 1 ketika suatu karakter ditransfer dari RX shift register sebelum karakter diterima sebelumnya dibaca. Dan kana berlogika 0 setelah karakter berikutnya dibaca. 10.2. Baud Rate Generator

UART Baud Rate Generator menentukan frekuensi clock yang digunakan untuk mengirim dan menerima data melalui UART. Clock UART ini dapat dibagi dengan sangat tepat, yang menghasilkan transfer data yang sangat baik.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 35

Dari gambar terlihat bahwa, baud rate dibagi 16 sebelum masuk ke TX/RX shift register. Clock ini digunakan oleh data recovery logic untuk mensample data dan mengurangi kesalahan transmisi. Rumus untuk menghitung baudrate yang ditentukan oleh nilai dalam UBRR adalah : BAUD= fck / (16(UBRR+1)) UBRR = fck -1 (16 * baud) .(1) .(2)

Contoh: Jika clock AVR yang digunakan adalah 8MHz, dan kita membutuhkan baud rate 9600, maka dengan menggunakan rumus yang ke-2 diperoleh nilai 51,0833333 untuk UBRR, sehingga untuk mendapatkan baudrate 9600 tersebut kita harus mengisikan nilai 51 ke register UBRR. Baud rate sebenarnya dapat dihitung dengan menggunakan rumus pertama, yaitu 9615, artinya kita mendapatkan error pada baudrate sebesar 0.16%. Nilai ini memang tidak terlalu bermasalah dalam transfer data, tapi tetap kurang sempurna. Sehingga umunya, untuk aplikasi yang menggunakan UART, seorang programmer lebih senang menggunakan kristal sebagai clock AVR dengan nilai yang cukup aneh, seperti 7.3728 MHz atau 11.0592 MHz. nilai kristal tersebut bila kita masukkan ke rumus maka akan menghasilkan nilai yang bulat dan error 0%. Berikut adalah contoh program dalam penggunaan UART : Program 9. UART Transmit-Receive program usart1_test main: USart1_Init(9600) Delay_ms(10) Usart1_Write_Text("mikro-Soft") while true while USart1_Data_Ready=0 Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR Page 36

wend USart1_Write_Char(USart1_Read) wend end. Program 10. UART & ADC program usart1_test dim data as word
dim txt as string[5]

main: USart1_Init(9600) Delay_ms(10) ' wait for module to set Usart1_Write_Text("Hasil Konversi ADC(0) : ) while true data=Adc_Read(0) WordToStr(data, txt) USart1_Write_Text(txt) Usart1_Write_Text(chr(13)+chr(10)) wend end.

Pemrograman Mikrokontroler AVR dengan Bahasa C Codevision AVR

Page 37