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 programmer mikrokontroler memilih bahasa C.
TABLE OF CONTENTS I.
PENGETAHUAN DASAR AVR
5
1.1.
TIGA PILIHAN AVR
5
1.2.
MEMILIH AVR YANG TEPAT
5
1.3.
HARDWARE UNTUK PEMROGRAMAN AVR
5
1.4.
PARALLEL PORT PROGRAMMER
6
PENGENALAN BAHASA BASIC
7
II. 2.1.
KOMENTAR
7
2.2.
LITERALS
7
2.2.1.
INTEGER LITERALS
7
2.2.2. 2.2.3.
FLOATING POINT LITERALS CHARACTER LITERALS
7 7
2.2.4. STRING LITERALS 2.3. VARIABEL
7 7
2.3.1. VARIABEL DAN AVR 2.4. KONSTANTA
8 8
2.5.
LABELS
8
2.6.
SIMBOL
8
2.7.
FUNGSI
8
Memanggil Fungsi 2.8. PROSEDUR
9 9
Memanggil Prosedur 2.9. TIPE
9 9
2.9.1.
TIPE SEDERHANA
9
2.9.2.
ARRAY/LARIK
10
2.9.3. STRING 2.10. OPERATORS
10 10
2.10.1. 2.10.2.
OPERATOR ARITMATIK UNARY ARITHMETIC OPERATORS
10 11
2.10.3.
OPERATOR RELASI
11
2.10.4. OPERATOR BITWISE 2.10.5. OPERATOR BOOLEAN 2.11. STATEMENTS
11 11 12
2.11.1.
PERNYATAAN PENUGASAN
12
2.11.3.
SELECT CASE STATEMENT
12
2.11.4. 2.11.5.
FOR STATEMENTS WHILE STATEMENT
12 13
2.11.6.
DO STATEMENT
13
2.11.7.
GOTO STATEMENT
13
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
Page 2
TABLE OF CONTENTS I.
PENGETAHUAN DASAR AVR
5
1.1.
TIGA PILIHAN AVR
5
1.2.
MEMILIH AVR YANG TEPAT
5
1.3.
HARDWARE UNTUK PEMROGRAMAN AVR
5
1.4.
PARALLEL PORT PROGRAMMER
6
PENGENALAN BAHASA BASIC
7
II. 2.1.
KOMENTAR
7
2.2.
LITERALS
7
2.2.1.
INTEGER LITERALS
7
2.2.2. 2.2.3.
FLOATING POINT LITERALS CHARACTER LITERALS
7 7
2.2.4. STRING LITERALS 2.3. VARIABEL
7 7
2.3.1. VARIABEL DAN AVR 2.4. KONSTANTA
8 8
2.5.
LABELS
8
2.6.
SIMBOL
8
2.7.
FUNGSI
8
Memanggil Fungsi 2.8. PROSEDUR
9 9
Memanggil Prosedur 2.9. TIPE
9 9
2.9.1.
TIPE SEDERHANA
9
2.9.2.
ARRAY/LARIK
10
2.9.3. STRING 2.10. OPERATORS
10 10
2.10.1. 2.10.2.
OPERATOR ARITMATIK UNARY ARITHMETIC OPERATORS
10 11
2.10.3.
OPERATOR RELASI
11
2.10.4. OPERATOR BITWISE 2.10.5. OPERATOR BOOLEAN 2.11. STATEMENTS
11 11 12
2.11.1.
PERNYATAAN PENUGASAN
12
2.11.3.
SELECT CASE STATEMENT
12
2.11.4. 2.11.5.
FOR STATEMENTS WHILE STATEMENT
12 13
2.11.6.
DO STATEMENT
13
2.11.7.
GOTO STATEMENT
13
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
Page 2
2.11.8.
GOSUB STATEMENT
13
2.11.9.
ASM STATEMENT
13
MIKROBASIC AVR
14
III. 3.1.
FITUR :
14
3.2.
IDE (INTEGRATED DEVELOPMENT ENVIRONMENT)
15
3.3.
PROJECTS
15
3.4.
NEW PROJECT
15
IV.
ARSITEKTUR AVR
16
4.1.
THE ARITHMETIC LOGIC UNIT (ALU)
16
4.2.
SRAM
16
V.
HARDWARE
5.1.
DESKRIPSI HARDWARE ATMEGA8/8535/16/32
5.1.1.
ATMEGA 8
18 18
18
5.1.2. ATMEGA 8535/16/32 5.2. PERBANDINGAN PIN/PORT ATMEGA8/16/32/8535
19 20
VI.
22
I/O PORTS
PROGRAM 1. INPUT/OUTPUT
23
PROGRAM 2. PENDETEKSIAN TOMBOL
23
VII.
24
8 BIT TIMER-COUNTER0
PROGRAM 3. TIMER OVERFLOW
25
PROGRAM 4. TIMER OVERFLOW-EXTERNAL CLOCK
25
VIII.
26
8 BIT TIMER-COUNTER2
PROGRAM 5. PHASE CORRECT PWM
28
PROGRAM 6. SWITCH CONTROLLED PHASE CORRECT PWM
29
IX.
30
ANALOG TO DIGITAL CONVERTER (ADC)
9.1.
REGISTERS
31
9.1.1.
ADMUX
31
9.1.2.
ADCSR
31
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
Page 3
9.1.3. ADCL DAN ADCH PROGRAM 7. ADC ON LEDS
32 32
PROGRAM 8. ADC – AUTO READ – INTERRUPT
32
X.
32
UART (UNIVERSAL ASYNCHRONOUS RECEIVER-TRANSMITTER)
10.1.
UART REGISTERS
34
10.1.1. 10.1.2.
UDR UBRR
34 34
10.1.3.
UCR
34
10.1.4. RXC: TXC:
USR
35 35 35
UDRE:
35
FE:
35
OR: 10.2. BAUD RATE GENERATOR PROGRAM 9. UART TRANSMIT-RECEIVE
35 35 36
PROGRAM 10. UART & ADC
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.
PENGENALAN BAHASA BASIC
2.1.Komentar
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. Bilangan integer desimal b. Nilai desimal (koma) c. Nilai pembagian d. 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 di deklarasikan 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
Ukuran 8 –bit 8 –bit 16 –bit 8 –bit 16 –bit 32 –bit 32 –bit
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
Operation
+
addition
-
subtraction
*
multiplication
/
division, floating-point
div
division, rounds down to nearest integer modulus, returns the remainder of integer division (cannot be used with floating points)
mod
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
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
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
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
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
and or
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
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
Page 11
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 i nformasi 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.
ARSITEKTUR AVR
4.1.The Arithmetic Logic Unit (ALU)
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 (R26—R31) 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.
HARDWARE
5.1.Deskripsi Hardware ATMega8/8535/16/32
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
Deskripsi
VCC
Tegangan Supply
GND
Ground
PORT B (PB7..PB0)
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)
Port I/O 7-bit ([PC6], PC5..PC0) dengan resistor pull-up internal tiap pin.
RESET/PC6
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.
PORT D (PD7..PD0) AVCC
Pin tegangan supply untuk memberikan tegangan pada A/D Converter. AVCC harus dihubungkan ke VCC apabila ADC tidak digunakan.
AREF
pin tegangan referenci untuk A/D Converter.
ADC7..6(TQFP,QFN/MLF)
digunakan sebagai pin input ADC
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
PORT B
PORT C
ATMega16
ATMega32
ATMega8535
-
PA0 (ADC0)
PA0 (ADC0)
PA0 (ADC0)
-
PA1 (ADC1)
PA1 (ADC1)
PA1 (ADC1)
-
PA2 (ADC2) PA3 (ADC3)
PA2 (ADC2) PA3 (ADC3)
PA2 (ADC2) PA3 (ADC3)
-
PA4 (ADC4)
PA4 (ADC4)
PA4 (ADC4)
-
PA5 (ADC5)
PA5 (ADC5)
PA5 (ADC5)
-
PA6 (ADC6)
PA6 (ADC6)
PA6 (ADC6)
PA7 (ADC7)
PA7 (ADC7)
PA7 (ADC7)
PB0 (XCK/T0)
PB0 (XCK/T0)
PB0 (XCK/T0)
PB1 (OC1A) PB2 (SS/OC1B) PB3 (MOSI/OC2) PB4 (MISO) PB5 (SCK) PB6 (XTAL1/OSC1) PB7 (XTAL2/OSC2) PC0 (ADC0) PC1 (ADC1)
PB1 (T1)
PB1 (T1)
PB1 (T1)
PB2 (INT2/AIN0)
PB2 (INT2/AIN0)
PB2 (INT2/AIN0)
PB3 (OC0/AIN1)
PB3 (OC0/AIN1)
PB3 (OC0/AIN1)
PB4 (SS)
PB4 (SS)
PB4 (SS)
PB5 (MOSI)
PB5 (MOSI)
PB5 (MOSI)
PB6 (ISO)
PB6 (ISO)
PB6 (ISO)
PB7(SCK) PC0 (SCL)
PB7(SCK) PC0 (SCL)
PB7(SCK) PC0
PC1 (SDA)
PC1 (SDA)
PC1
PC2 (ADC2) PC3 (ADC3) PC4 (ADC4/SDA)
PC2 (TCK)
PC2 (TCK)
PC2
PC3 (TMS)
PC3 (TMS)
PC3
PC4 (TDO)
PC4 (TDO)
PC4
PB0 (ICP1)
Pemrograman Mikrokontroler AVR dengan Bahasa C – Codevision AVR
Page 20
PC5 (ADC5/SCL) PC6 (RESET)
PC5 (TDI)
PC5 (TDI)
PC5
PC6 (TOSC1)
PC6 (TOSC1)
PC6 (TOSC1)
PC7 (TOSC2)
PC7 (TOSC2)
PC7 (TOSC2)
PD0 (RXD)
PD0 (RXD)
PD0 (RXD)
PD0 (RXD)
PD1 (TXD)
PD1 (TXD)
PD1 (TXD)
PD1 (TXD)
PD2 (INT0)
PD2 (INT0)
PD2 (INT0)
PD2 (INT0)
PD3 (INT1) PD4 (XCK/T0) PD5 (T1)
PD3 (INT1) PD4 (OC1B)
PD3 (INT1) PD4 (OC1B)
PD3 (INT1) PD4 (OC1B)
PD5 (OC1A)
PD5 (OC1A)
PD5 (OC1A)
PD6 (AIN0) PD7 (AIN1)
PD6 (ICP1) PD7 (OC2)
PD6 (ICP1) PD7 (OC2)
PD6 (ICP1) PD7 (OC2)
PORT D
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
PORTx
0
0
PUD (SFIOR) x
0
1
0
I/O
Pull-Up
Input
No
Input
Yes
Deskripsi
Tri-state (High Z) membutuhkan pull-up eksternal Input (akan menjadi source bila diberi logika ‘0’)
0
1
1
Input
No
1 1
0 1
x x
Output Output
No Yes
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
Bit 1
Bit 0
---
---
---
---
---
MUX2
MUX1
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
Input terpilih
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 ADC6 ADC7
9.1.2.
Bit 7 ADEN
ADCSR
Bit 6 ADSC
Bit 5 ADFR
Bit 4 ADIF
Bit 3 ADIE
Bit 2 ADPS2
Bit 1 ADPS1
Bit 0 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 dia ktifkan, 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
9.1.3.
Division Factor 2 2 4 8 16 32 64 128
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 ber guna dalam beberapa project embedded system. Peripheral ini dapat digunakan untuk melakukan debug terhadap program, i nteraksi 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 r eceiver. Bit 7 RXCIE
TXCIE
UDRIE
RXEN
TXEN
CHR9
RXB8
Bit 0 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
TXC
UDRE
FE
OR
---
---
Bit 0 ---
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 dat a 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