Bot Manual

Embed Size (px)

Citation preview

Pemrograman ATmega32Muchlis Polin 14 Oktober 2010

Daftar Isi1 Pengenalan Mikrokontroler ATmega32 1.1 Mikrokontroler . . . . . . . . . . . . . . . . . . . . . . 1.2 Atmel AVR . . . . . . . . . . . . . . . . . . . . . . . . 1.3 ATmega32 . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Rangkaian minimal ATmega32 . . . . . . . . . . . . . 1.5 Downloader ATmega32 . . . . . . . . . . . . . . . . . 1.5.1 STK200 . . . . . . . . . . . . . . . . . . . . . 1.5.2 USBasp . . . . . . . . . . . . . . . . . . . . . 1.5.2.1 Rangkaian USBasp . . . . . . . . . . 1.5.2.2 File-le pendukung USBasp . . . . . 1.5.2.3 Pengisian rmware/program USBasp 1.5.3 AVR-Doper . . . . . . . . . . . . . . . . . . . 1.6 Fuse bits . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 High Byte . . . . . . . . . . . . . . . . . . . . 1.6.2 Low byte . . . . . . . . . . . . . . . . . . . . . 1.6.3 Pemrograman fuse bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 8 9 11 11 12 12 13 14 15 15 17 17 18 20 22 22 22 23 23 23 24 24 26 27 27 27 27 28 28 28 28 28 28 29 29 30 30 30 31 31

2 Bahasa C untuk AVR 2.1 Optimasi kode . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Macam-macam integer . . . . . . . . . . . . . . . . . . 2.1.2 Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Manipulasi port I/O . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Port I/O ATmega32 . . . . . . . . . . . . . . . . . . . . 2.2.2 Operasi bitwise . . . . . . . . . . . . . . . . . . . . . . 2.2.2.1 Operasi bitwise . . . . . . . . . . . . . . . . . 2.2.2.2 Operasi bit-shift . . . . . . . . . . . . . . . . 2.2.3 Manipulasi bit . . . . . . . . . . . . . . . . . . . . . . . 2.2.3.1 Set bit . . . . . . . . . . . . . . . . . . . . . . 2.2.3.2 Clear bit . . . . . . . . . . . . . . . . . . . . . 2.2.3.3 Toggle bit . . . . . . . . . . . . . . . . . . . . 2.2.3.4 Pengecekan bit . . . . . . . . . . . . . . . . . 2.2.4 Header . . . . . . . . . . . . . . 2.2.4.1 _BV(bit) . . . . . . . . . . . . . . . . . . . 2.2.4.2 bit_is_set(sfr, bit) . . . . . . . . . . 2.2.4.3 bit_is_clear(sfr, bit) . . . . . . . . 2.2.4.4 loop_until_bit_is_clear(sfr, bit) 2.2.4.5 loop_until_bit_is_set(sfr, bit) . 2.2.5 Contoh program manipulasi port I/O . . . . . . . . . . . 3 WinAVR 3.1 Pengenalan WinAVR . . . . . 3.2 Instalasi WinAVR . . . . . . . 3.3 Pemrograman dengan WinAVR 3.3.1 Buat Project baru . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3.2

3.3.3 3.3.4

Edit Makele . . . . . . . . . . . . . . . 3.3.2.1 Memasukkan setting AVR-Doper 3.3.2.2 Mengubah nama le main . . . 3.3.2.3 Menambah source code . . . . . Kompilasi Program . . . . . . . . . . . . Download program ke mikrokontroler . . .

. . . pada . . . . . . . . . . . .

. . . . . Makele . . . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

32 33 33 33 33 34 35 35 35 36 37 38 39 39 41 41 42 43 43 44 45 47 48 49 50 51 52 53 54 55 55 57 57 58 59 60 60 62 62 63 63 63 64 65 68 70 73 73 75 75 76 76

4 Penggunaan tur-tur ATmega32 4.1 Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Register SREG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Menggunakan interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Contoh sederhana penggunaan interrupt . . . . . . . . . . . . . . . . . . 4.1.4 Catch-all interrupt handler . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Timer/Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Pengenalan timer pada ATmega32 . . . . . . . . . . . . . . . . . . . . . 4.2.2 Timer/Counter0 (8-bit) . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2.1 Register TCCR0 (Timer/Counter Control Register) . . . . . . . 4.2.2.2 Normal mode . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2.3 Clear Timer on Compare Match (CTC) mode . . . . . . . . . . 4.2.2.4 Fast PWM mode . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2.5 Phase Correct PWM mode . . . . . . . . . . . . . . . . . . . . 4.2.2.6 Interrupt Timer/Counter0 . . . . . . . . . . . . . . . . . . . . 4.3 USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Register-register USART . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1.1 UCSRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1.2 UCSRB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1.3 UCSRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1.4 UBRRH & UBRRL . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2 Kongurasi USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2.1 Pengaturan baud rate . . . . . . . . . . . . . . . . . . . . . . . 4.3.2.2 Baud rate error . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2.3 Pengaturan register kontrol USART (UCSRA, UCSRB & UCSRC) 4.4 ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Register-register ADC ATmega32 . . . . . . . . . . . . . . . . . . . . . . 4.4.1.1 ADMUX ADC Multiplexer Selection Register . . . . . . . . . 4.4.1.2 ADCSRA ADC Control and Status Register A . . . . . . . . 4.4.1.3 ADCH & ADCL . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.2 Menggunakan ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Pembacaan Sensor 5.1 Sensor Ultrasonik . . . . . . . . . . . . . . 5.1.1 Parallax PING))) . . . . . . . . . . 5.1.1.1 Spesikasi . . . . . . . . . 5.1.1.2 Koneksi ke mikrokontroler 5.1.2 Devantech SRF05 . . . . . . . . . . 5.1.3 Algoritma sensor ultrasonik . . . . . 5.2 Sensor UV TRON . . . . . . . . . . . . . . 5.3 Sensor Pyroelectric IR-EYE 442-3 . . . . . 6 Pengontrolan Motor DC 6.1 H-Bridge . . . . . . . . . . . . . . . 6.2 Pulse Width Modulation (PWM) . . 6.2.1 Apa itu PWM? . . . . . . . 6.2.2 Membangkitkan sinyal PWM Timer/Counter1 . . . . . . . 6.2.2.1 Sumber clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . menggunakan . . . . . . . . . . . . . . . . 2

. . . . . . . . . . . . . . . . . . . . . mode Phase . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . Correct PWM . . . . . . . . . . . . . . . . . .

6.2.2.2 6.2.2.3 6.2.2.4 6.2.2.5 Bibliogra

Mode Phase Correct PWM . . . . . . . Pengaturan Frekuensi PWM pada mode Pengaturan Mode Compare Output . . Contoh program . . . . . . . . . . . .

. . . . . . . . Phase Correct . . . . . . . . . . . . . . . .

. . . . PWM . . . . . . . .

. . . .

77 78 78 79 82

3

Daftar Gambar1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3 2.4 2.5 2.6 3.1 3.2 3.3 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 Kongurasi pin ATmega32 ([Atm09]) . . . Rangkaian minimal ATmega32 . . . . . . Simplied AVR ISP Programmer . . . . . Rangkaian lengkap USBasp . . . . . . . . Cara menghubungkan kristal[Atm09, h26] Register PORTA[Atm09, h64] Register DDRA [Atm09, h64] Register PINA[Atm09, h64] . Operasi bitwise AND . . . . Operasi bitwise OR . . . . . Contoh left bit shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 11 12 13 19 24 24 24 26 26 27

Icon installer WinAVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Item-item yang WinAVR pada Start Menu . . . . . . . . . . . . . . . . . . . . . 31 Variabel AVRDUDE_PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Rangkaian interrupt INT0 . . . . . . . . . . . . Blok diagram timer/counter 8-bit ([Atm09]) . . Register TCCR0 [Atm09, h80] . . . . . . . . Timing diagram mode CTC . . . . . . . . . . . Timing diagram mode Fast PWM[Atm09, h75] Timing diagram mode Phase Correct PWM . . Diagram blok USART[Atm09, h140] . . . . . . Register UCSRA[Atm09, h160] . . . . . . . . . Register UCSRB[Atm09, h161] . . . . . . . . . Register UCSRC[Atm09, h162] . . . . . . . . . Register UBRRH dan UBRRL [Atm09, h164] . . Saran penyajian pin AVCC [Atm09, h210] . . . Register ADMUX[Atm09, h214] . . . . . . . . Representasi ADCH & ADCL jika ADLAR = 0 . Representasi ADCH & ADCL jika ADLAR = 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 39 41 43 44 45 48 49 50 51 52 57 58 60 60 63 63 64 64 65 65 68 68 69 70 70 70 71

Parallax PING)))[pin] . . . . . . . . . . . . . . . . . . . Koneksi sensor ping ke mikrokontroler[Par05, h2] . . . . Diagram timing sensor PING))) [Par05, h2] . . . . . . . Devantech SRF05[srf] . . . . . . . . . . . . . . . . . . . Koneksi sensor SRF05 [Dev, h2] . . . . . . . . . . . . . Diagram timing sensor SRF05 [Dev, h3] . . . . . . . . . Sensor UV TRON dan drivernya[HAM97] . . . . . . . . Sensitivitas UV TRON [HAM97, h1] . . . . . . . . . . . Diagram blok sensor UV TRON[HAM97, h4] . . . . . . Sensor Pyroelectric IR-EYE 442-3[Acr01] . . . . . . . . . Diagram blok sensor pyroelectric[ELT02] . . . . . . . . . Fungsi pin-pin pada sensor pyroelectric [ELT02] . . . . . Grak output sensor pyroelectric saat mendeteksi panasi 4

6.1 6.2 6.3

1/2 dari L298 [STM00, h6] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Contoh sinyal PWM dengan duty cycle 10%, 50% dan 90% [Bar01] . . . . . . . 76 Pemilihan clock Timer1 [Atm09, h110] . . . . . . . . . . . . . . . . . . . . . . . 76

5

Daftar Tabel1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 2.2 2.3 2.4 2.5 2.6 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.17 4.18 6.1 6.2 Koneksi antara USBasp dan Mikrokontroler target Fuse High Byte[Atm09, h257] . . . . . . . . . . . Fuse Low Byte[Atm09, h258] . . . . . . . . . . . Waktu start-up untuk osilator RC Internal[Atm09, Mode operasi osilator kristal[Atm09, h26] . . . . Pilihan waktu start-up untuk osilator kristal . . . Contoh HFUSE . . . . . . . . . . . . . . . . . . Contoh HFUSE . . . . . . . . . . . . . . . . . . Macam-macam tipe integer . . . . . Tabel kebenaran operasi bitwise AND Tabel kebenaran operasi bitwise OR . Tabel kebenaran operasi bitwise XOR Tabel kebenaran operasi bitwise NOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . h30] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 17 18 19 19 20 20 21 22 25 25 25 25 36 40 41 41 42 42 42 51 51 51 52 52 53 54 58 58 59

Interrupt 0 sense control . . . . . . . . . . . . . . . . . . . . . . . . . . Perbandingan Timer/Counter0, Timer/Counter1 dan Timer/Counter2 . . Kombinasi bit WGM01:0 [Atm09] . . . . . . . . . . . . . . . . . . . . Pengaturan bit COM01:0 untuk mode non-PWM[Atm09, h81] . . . . . . Pengaturan bit COM01:0 untuk mode fast PWM[Atm09, h81] . . . . . . Pengaturan bit COM01:0 untuk mode Phase Correct PWM[Atm09, h81] Deskripsi bit clock select . . . . . . . . . . . . . . . . . . . . . . . . . . Pengaturan bit UMSEL[Atm09, h162] . . . . . . . . . . . . . . . . . . . Pengaturan bit-bit UPM[Atm09, h163] . . . . . . . . . . . . . . . . . . . Pengaturan bit USBS[Atm09, h163] . . . . . . . . . . . . . . . . . . . . Pengaturan bit-bit UCSZ[Atm09, h163] . . . . . . . . . . . . . . . . . . . Pengaturan bit UCPOL [Atm09, h164] . . . . . . . . . . . . . . . . . . . Parameter koneksi serial Microsoft Mouse . . . . . . . . . . . . . . . . . Rumus untuk menghitung nilai register baud rate [Atm09, h143] . . . . . Pilihan tegangan referensi ADC . . . . . . . . . . . . . . . . . . . . . . . Pemilihan channel input dan penguatan[Atm09, h215] . . . . . . . . . . . Pengaturan prescaler ADC[Atm09, h217] . . . . . . . . . . . . . . . . . .

Tabel kebenaran L298 [STM00, h6] . . . . . . . . . . . . . . . . . . . . . . . . 74 Mode Compare Output untuk Phase Correct dan Phase and Frequency Correct PWM [Atm09, h108] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

6

Daftar Algoritma5.1 Pengukuran jarak menggunakan sensor ultrasonik . . . . . . . . . . . . . . . . . 66

7

Bab 1

Pengenalan Mikrokontroler ATmega321.1 MikrokontrolerMenurut [Wik10e] Mikrokontroler (sering disingkat MCU atau C) adalah komputer mini yang terletak dalam sebuah IC yang tersusun dari CPU, jam, timer, port I/O dan memori. Seperti komputer pada umumnya, mikrokontroler memiliki media penyimpanan program (ash memory 1 ) dan data (EEPROM). Bila dianalogikan secara bebas maka harddisk pada PC bisa disamakan (fungsinya) dengan ash memory pada mikrokontroler, sedangkan USB Flashdisk bisa disamakan dengan EEPROM, seperti pada PC mikrokontroler juga memiliki RAM meskipun ukurannya jauh lebih kecil. Jika PC menerima input dari dunia luar melalui beberapa macam alat, misalnya mouse, keyboard, gamepad dsb, maka mikrokontroler menerima input dari sejumlah pin Input/Output (I/O) yang ada pada chip mikrokontroler itu sendiri. Input yang diterima oleh pin I/O bisa berupa data digital atau analog (jika mikrokontroler tsb mempunyai ADC). Seperti namanya, pin I/O tidak hanya digunakan oleh mikrokontroler untuk menerima data namun juga dimanfaatkan untuk mengeluarkan data. Biasanya sebuah pin bisa diubah-ubah fungsinya sesuai dengan kebutuhan programmer.

1.2

Atmel AVR

AVR adalah mikrokontroler 8-bit chip tunggal dengan arsitektur Harvard termodikasi yang diciptakan oleh Atmel pada tahun 1996 [Wik10a]. Arsitektur Harvard menggunakan bus terpisah untuk program dan data sehingga keduanya bisa diakses secara simultan[dsp, h84]. Arsitektur ini dipilih untuk memaksimalkan performa dan paralelisme. Ketika sebuah instruksi sedang dieksekusi, instruksi selanjutnya diambil dari memori program, dengan demikian setiap intruksi bisa dijalankan dalam satu siklus clock. Pada AVR program disimpan dalam memori ash yang bisa diprogram ulang[Atm09, h8].1 Mikrokontroler zaman dulu tidak menggunakan ash memory untuk menyimpan data, tapi PROM, EPROM atau EEPROM.

8

1.3

ATmega32

ATmega32 terdiri dari dua seri, yaitu ATmega32 dan ATmega32L, perbedaannya terletak pada tegangan catu yang dibutuhkan dan kecepatan maksimum mikrokontroler. Berikut ini adalah tur-tur dari ATmega32(L) [Atm09]2 : Kecepatan : ATmega32: 0-16 MHz ATmega32L: 0-8 MHz Catu daya: ATmega32: 4.5 - 5.5 V ATmega32L: 2.7 - 5.5 V Memori: Flash memory: 32 KB (Daya tahan: 10.000 kali penulisan) EEPROM: 1024 Byte (Daya tahan: 100.000 kali penulisan) SRAM Internal: 2 KB Lama penyimpanan data: 20 tahun pada suhu 85C 100 tahun pada suhu 25C Fitur-tur peripheral: 2 buah timer/counter 8-bit Sebuah timer/counter 16-bit 4 buah channel PWM 8 buah channel ADC 10-bit Interface Two-wire Serial Interface Interface USART (serial) Interface SPI Master/Slave Watchdog timer yang bisa diprogram Komparator Analog2 Datasheet

ATmega32: http://www.atmel.com/atmel/acrobat/doc2503.pdf

9

(XCK/T0) PB0 (T1) PB1 (INT2/AIN0) PB2 (OC0/AIN1) PB3 (SS) PB4 (MOSI) PB5 (MISO) PB6 (SCK) PB7 RESET VCC GND XTAL2 XTAL1 (RXD) PD0 (TXD) PD1 (INT0) PD2 (INT1) PD3 (OC1B) PD4 (OC1A) PD5 (ICP1) PD6

PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND AVCC PC7 (TOSC2) PC6 (TOSC1) PC5 (TDI) PC4 (TDO) PC3 (TMS) PC2 (TCK) PC1 (SDA) PC0 (SCL) PD7 (OC2)

Gambar 1.1: Kongurasi pin ATmega32 ([Atm09]) ATmega32 mempunyai 32 pin I/O yang terorganisir dalam 4 port, yaitu PORTA (PA0-PA7), PORTB (PB0-PB7), PORTC (PC0-PC7) dan PORTD (PD0-PD7). Setiap port mempunyai 8 pin I/O. Jadi yang dimaksud dengan port adalah sekumpulan pin I/O yang tergabung menjadi satu kesatuan. Selain sebagai I/O tiap pin mempunyai fungsi sampingan, pada Gambar 1.1 hal ini ditandai dengan tanda kurung. Misalnya pin PA0, pin ini berfungsi juga sebagai salah satu input dari ADC yaitu ADC0.Contoh lain adalah PD0 yang akan berubah fungsi menjadi input port serial/USART jika tur komunikasi USART diaktifkan.

10

1.4

Rangkaian minimal ATmega32

Gambar 1.2: Rangkaian minimal ATmega32 Kapasitor 100nF yang berada diantara VCC dan GND digunakan untuk menstabilkan rangkaian, letakkan kapasitor sedekat mungkin dengan pin mikrokontroler. Setiap rangkaian digital akan menyebabkan timbulnya noise pada power supply, kapasitor ini berfungsi untuk meredam noise tersebut. Menurut datasheet ATmega32, pin AVCC harus dihubungkan dengan power supply meskipun ADC tidak digunakan. Jika ADC digunakan maka anda wajib menaruh lter berupa induktor/kumparan dan kapasitor antara pin AVCC dan power supply. Ada empat pin yang dibutuhkan untuk mengisi/mendownload program kedalam ATmega32: RESET, SCK (PB7), MISO (PB6) dan MOSI (PB5). Anda bisa menggunakan PB5, PB6 dan PB7 seperti port-port lain, namun pastikan bahwa tidak ada komponen lain yang terhubung saat melakukan download agar proses pengisian program tidak terganggu.

1.5

Downloader ATmega32

Downloader atau programmer adalah alat yang digunakan untuk mengisi program kedalam mikrokontroler. Ada banyak tipe programmer untuk ATmega32, namun yang akan saya bahas hanyalah STK200 dan AVR-Doper.

11

1.5.1

STK200

Parameter avrdude: Tipe programmer: stk200 Port: lpt1

Gambar 1.3: Simplied AVR ISP Programmer Ini adalah downloader sederhana yang bisa anda buat sendiri. Anda hanya membutuhkan empat buah resistor 330 ohm, serta konektor parallel port untuk dihubungkan ke komputer. Kebanyakan software untuk memprogram ATmega32 bisa digunakan dengan downloader sederhana ini. Downloader ini membutuhkan parallel port yang sekarang sudah mulai hilang pada komputerkomputer generasi terbaru, terutama pada laptop. Untuk mengakalinya anda bisa mencoba menggunakan konverter USB-to-Parallel. Saya belum pernah menggunakan konverter jenis ini pada downloader jadi tidak tahu apakah cara ini bisa digunakan atau tidak.

1.5.2

USBasp

Parameter avrdude: Tipe programmer: usbasp Port: Tidak diperlukan

12

1.5.2.1

Rangkaian USBasp

Gambar 1.4: Rangkaian lengkap USBasp USBasp menggunakan mikrokontroler ATmega8 (atau bisa diganti ATmega48) sebagai otak rangkaian. Downloader ini menggunakan port USB sehingga anda bisa memakainya pada komputer yang tidak memiliki parallel port. Kelemahan dari downloader ini adalah tidak semua software mendukung USBasp. Pada saat penulisan buku ini, satu-satunya software yang mendukung USBasp adalah avrdude, software downloader bawaan dari WinAVR. Konektor ke mikrokontroler pada Gambar 1.4 dengan label X2 adalah konektor 10-pin yang merupakan konektor standar ISP (In-System Programming) mikrokontroler AVR. Konektor ini dilengkapi dengan jalur koneksi serial yang digunakan untuk kepentingan debugging, meskipun konektornya sudah ada tapi rmware dari USBasp belum mendukung komunikasi serial. Koneksi ini tidak dibutuhkan pada saat pemrograman sehingga anda hanya membutuhkan lima koneksi dari USBasp ke mikrokontroler target: Ground, MISO, MOSI, SCK dan RESET. Lebih lengkapnya bisa dilihat pada Tabel 1.1.

13

Dari ATmega48/ATmega8 SS (PB2/pin 16) MOSI (PB3/pin 17) MISO (PB4/pin 18) SCK (PB5/pin 19) Ground (pin 8)

Dari Konektor 10-pin pin 5 pin 1 pin 9 pin 7 pin 8 & 10

Ke Mikrokontroler RESET (ATmega32: pin 9) MOSI (ATmega32: PB5/pin6) MISO (ATmega32: PB6/pin7) SCK (ATmega32: PB7/pin 8) Ground (ATmega32: pin 11 & 31)

Tabel 1.1: Koneksi antara USBasp dan Mikrokontroler target 1.5.2.2 File-le pendukung USBasp

Seluruh le yang anda butuhkan untuk membuat USBasp bisa anda download pada situsnya: http://www.fischl.de/usbasp/ File yang saya download adalah le dengan nama usbasp.2007-10-23.tar.gz. Format ini ada dalam format kompresi gzip (digunakan di Linux), anda bisa mengekstraknya menggunakan software 7-Zip (Website: http://www.7zip.org (gratis)). Isi dari le ini adalah: Direktori bin Didalam direktori ini ada dua direktori lagi, yaitu Direktori firmware Berisi rmware yang harus dimasukkan kedalam mikrokontroler pada USBasp, gunakan le usbasp.atmega8.2007-10-23.hex jika anda memakai ATmega8 dan gunakan usbasp.atmega48.2007-10-23.hex jika anda memakai ATmega48. Direktori win-driver Berisi driver yang harus diinstall pada komputer yang digunakan untuk memprogram mikrokontroler. Klik kanan pada le usbasp.inf lalu pilih Install. Direktori circuit File USBasp.s#1 Saya tidak tahu le apa ini, mungkin backup dari le USBasp.sch. USBasp.sch Ini adalah gambar rangkaian USBasp, anda bisa membukanya dengan software CAD EAGLE (Website: http://www.cadsoft.de/freeware.htm). USBasp_schematics.pdf Ini adalah versi pdf dari le USBasp.sch. Direktori firmware Direktori usbdrv Berisi le-le source code dari driver USB yang ada pada direktori bin/firmware Source code dari rmware USBasp yang harus dimasukkan kedalam ATmega8/ATmega48. File Changelog.txt File Readme.txt

14

1.5.2.3

Pengisian rmware/program USBasp

Karena USBasp menggunakan mikrokontroler sebagai inti dari rangkaian maka kita harus memasukkan program kedalamnya terlebih dahulu3 . Tentu saja anda membutuhkan downloader lain untuk memasukkan rmware kedalam USBasp. Jika anda tidak memiliki downloader/programmer, solusi paling mudah adalah meminjam punya teman anda :D. Jika tidak ada, anda bisa membuat STK200 (lihat bagian 1.5.1).Perhatian!, pastikan bahwa: Jumper pada JP2, Self programming, telah terpasang

Komputer anda telah terinstall WinAVR (lihat Bab 3):

Edit le Makefile yang ada pada direktori firmware, ganti baris-baris ini sesuai dengan mikrokontroler yang anda gunakan: TARGET=... Isi dengan atmega8 atau atmega48, tergantung mikrokontroler yang anda gunakan HFUSE=... Isi dengan 0xc9 jika anda menggunakan atmega8, 0xdd jika menggunakan atmega48 LFUSE=... Isi dengan 0xef jika anda menggunakan atmega8, 0xff jika menggunakan atmega48 ISP=... Sesuaikan dengan programmer/downloader yang anda gunakan. PORT=... Sesuaikan dengan port dimana downloader terpasang. Buka command prompt windows: Start menu > Run > ketik cmd > tekan enter Masuk kedalam direktori usbasp.2007-10-23 Setelah itu masuk kedalam direktori firmware jalankan perintah-perintah ini: make fuses make flash Selesai!

1.5.3

AVR-Doper

Parameter avrdude: Tipe programmer: stk500v2 Port: avrdoper Setelah dicoba, ternyata USBasp yang saya buat memiliki kecepatan transfer yang terasa lambat, lebih lambat dari STK200. Saya pikir mungkin ada sesuatu yang salah dengan rangkaian yang saya buat. Setelah mencari-cari saya tidak bisa menemukan penyebab permasalahannya sehingga saya mencari downloader lain, dan akhirnya saya menemukan AVR-Doper pada website ini:3 Programmer

yang harus diprogram terlebih dahulu

15

http://www.obdev.at Pada website tersebut disebutkan bahwa rmware AVR-Doper kompatibel dengan USBasp, ini berarti saya tidak perlu membuat programmer baru :-). Kelebihan AVR-Doper dibandingkan dengan USBasp adalah AVR-Doper tidak membutuhkan driver khusus. AVR-Doper menggunakan mode HID Human Interface Device, mode yang digunakan oleh mouse dan keyboard USB, driver HID biasanya sudah terinstall pada mayoritas sistem operasi yang ada saat ini. Kekurangannya, seperti USBasp, AVR-Doper hanya bisa digunakan bersama AVRDUDE versi 5.3 dan selanjutnya. Setelah rmware AVR-Doper saya pasang proses download menjadi lebih cepat dibandingkan waktu masih menggunakan rmware aslinya (USBasp).Perhatian!, pastikan bahwa: Jumper pada JP2, Self programming, telah terpasang

Komputer anda telah terinstall WinAVR (lihat Bab 3):

Untuk memasukkan rmware AVR-Doper kedalam USBasp lakukan langkah-langkah berikut Download dan ekstrak le AVR-Doper.2008-11-27.zip atau yang lebih baru. Masuk kedalam direktori AVR-Doper.2008-11-27\firmware lalu edit le Makefile dengan WordPad, jangan menggunakan Notepad. Edit baris-baris berikut: DEVICE= Isi sesuai mikrokontroler yang anda gunakan, atmega8 atau atmega48. F_CPU=12000000 Jangan diganti. FUSE_L= 0x9f untuk ATmega8 dan 0xdf untuk ATmega48 FUSE_H= 0xc9 untuk ATmega8 dan 0xdd untuk ATmega48 PORT= Ganti sesuai port programmer yang anda pakai. PROGRAMMER= Ganti dengan tipe programmer yang anda pakai. Masih dalam direktori firmware, ganti nama le usbasp-mega8-12mhz.hex menjadi main.hex Buka command prompt lalu masuk ke direktori AVR-Doper.2008-11-27\firmware Jalankan perintah-perintah berikut secara berurutan: make fuse make flash Selesai!

16

1.6

Fuse bits

Fuse bits digunakan untuk mengatur tur-tur dasar ATmega32 seperti sumber clock, osilator, start up time, brown out detector, dsb. ATmega32 diedarkan oleh produsennya dengan frekuensi 1 MHz, seandainya Anda ingin menjalankannya pada frekuensi maksimum, 16 MHz, maka Anda harus memasang kristal 16 MHz pada pin XTAL1 dan XTAL2 serta memprogram fuse bits CKOPT dan CKSEL. Jika anda lupa melakukannya maka mikrokontroler akan tetap berjalan pada frekuensi 1 MHz, meskipun kristal sudah terpasang dengan baik dan benar :-). Fuse bits dibagi menjadi dua yaitu High Byte (HFUSE) dan Low Byte (LFUSE). Perhatian! Sebuah fuse dikatakan terprogram jika nilainya 0, dan tidak terprogram jika nilainya 1. Jadi jangan sampai terbalik.

1.6.1

High ByteNo. bit 7 6 5 4 3 2 1 0 Penjelasan Enable OCD Enable JTAG Enable pemrograman dan download data melalui SPI Pengaturan osilator Memori EEPROM tidak ikut dihapus saat chip dihapus Pemilihan ukuran Boot Size Pemilihan ukuran Boot Size Pemilihan reset vector Nilai default 1 (tidak terprogram, OCD di-disable) 0 (terprogram, JTAG di-enable) 0 (terprogram, pemrog. SPI di-enable) 1 (tidak terprogram) 1 (tidak terprogram, EEPROM ikut terhapus) 0 (terprogram)e 0 (terprogram) 1 (tidak terprogram)

Fuse High Byte OCDENa JTAGENb SPIENc CKOPTd EESAVE BOOTSZ1 BOOTSZ0 BOOTRST

a Jangan pernah meluncurkan produk dengan fuse OCDEN terprogram apapun pengaturan pada Lock Bits dan fuse JTAGEN. Fuse OCDEN yang terprogram mengakibatkan sebagian sistem clock berjalan pada semua mode sleep. Ini bisa saja menambah pemakaian daya. b Jika interface JTAG tidak dihubungkan, sebaiknya fuse JTAGEN di-disable. Ini untuk menghindari arus statis pada pin TDO dari interface JTAG. c Fuse SPIEN tidak bisa diakses dalam mode pemrograman SPI Serial d Fungsi fuse CKOPT bergantung pada pengaturan bit-bit CKSEL. Lihat Clock Sources pada halaman 25 di datasheet. e Nilai default dari BOOTSZ1..0 menghasilkan Boot Size maksimum. Lihat Tabel 99 pada hal. 255 di datasheet.

Tabel 1.2: Fuse High Byte[Atm09, h257] OCDEN Ini digunakan untuk mengaktifkan On-Chip Debug system, biarkan fuse ini tidak terprogram. JTAGEN Jika anda tidak menggunakan interface JTAG maka sebaiknya fungsi ini dinonaktifkan dengan mengubah JTAGEN menjadi tidak terprogram (1). Interface JTAG pada ATmega32 secara default diaktifkan. SPIEN Biarkan fuse ini terprogram, karena umumnya downloader melakukan pemrograman lewat SPI. Jika anda menggunakan SPI untuk memasukkan program anda tidak akan bisa mengganti fuse ini. CKOPT 17

Singkatnya, jika anda menggunakan kristal dengan frekuensi diatas 8 MHz, maka set agar CKOPT terprogram (0). Untuk frekuensi 8 MHz kebawah set CKOPT tidak terprogram. EESAVE Sesuaikan fuse ini dengan kebutuhan anda. Jika karena suatu alasan tertentu anda menginginkan agar EEPROM tidak dihapus saat chip dihapus (contohnya saat anda memasukkan program kedalam mikrokontroler) maka anda bisa memprogram fuse ini (0). BOOTSZ1..0 Kedua fuse ini digunakan untuk mengatur ukuran Boot Size dimana boot loader disimpan. Saya belum pernah menggunakan boot loader jadi tidak bisa berkomentar soal pengaturan fuse ini. BOOTRST Fuse ini digunakan untuk memilih reset vector, jika tidak terprogram (default) maka setelah reset mikrokontroler akan menjalankan program seperti biasa. Jika terprogram maka yang dijalankan setelah reset adalah boot loader.

1.6.2

Low byteNo. bit 7 6 5 4 3 2 1 0 Penjelasan Brown-out Detector trigger level Brown-out Detector enable Pilih waktu startup Pilih waktu startup Pilih sumber clock Pilih sumber clock Pilih sumber clock Pilih sumber clock Tabel 1.3: Fuse Low Byte[Atm09, h258] Nilai default 1 (tidak terprogram) 1 (tidak terprogram, BOD non-aktif) 1 (tidak terprogram) 0 (terprogram) 0 (terprogram) 0 (terprogram) 0 (terprogram) 1 (tidak terprogram)

Fuse Low Byte BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0

BODLEVEL Jika terprogram maka level pemicu tegangan brown out di-set 4.0 V, jika tidak level tegangan brown out di-set 2.7 V. BODEN BOD (Brown Out Detector) digunakan untuk melakukan reset secara otomatis jika tegangan catu mikrokontroler turun lebih rendah dari yang telah ditentukan pada fuse BODLEVEL. BOD sebaiknya tidak digunakan jika tidak dibutuhkan karena akan menambah konsumsi daya. SUT1..0 Kedua bit ini digunakan untuk memilih waktu start-up sebelum mikrokontroler diaktifkan, ini untuk memastikan bahwa catu daya dan osilator sudah stabil saat mikrokontroler mulai berjalan. Secara default ATmega32 diedarkan dengan setting start-up paling lama (65 ms). Tabel 1.4 menunjukkan pengaturan SUT1..0 untuk osilator RC internal. Pengaturan SUT1..0 untuk kristal disajikan pada Tabel 1.6.

18

SUT1..0Waktu start-up dari power-down dan power save 00 6 CK 01 6 CK 10 6 CK 11

Delay tambahan setelah reset (Vcc = 5.0V ) 4.1 ms 65 ms Reserved

Digunakan untuk

BOD aktif Fast rising power Slowly rising power

Tabel 1.4: Waktu start-up untuk osilator RC Internal[Atm09, h30] CKSEL3..0 Keempat fuse ini digunakan untuk memilih sumber dan kecepatan clock. Pada buku ini saya hanya akan membahas penggunaan kristal. Penggunaan sumber clock lainnya bisa anda baca pada datasheet, Bab System Clock and Clock Options, halaman 24. Pada Gambar 1.5 ditunjukkan bagaimana menghubungkan kristal dengan ATmega32.

Gambar 1.5: Cara menghubungkan kristal[Atm09, h26] Fuse CKSEL3..1 bersama dengan CKOPT digunakan untuk memilih frekuensi osilator kristal. CKOPT CKSEL3..1 Rentang frekuensi (MHz) Nilai kapasitor (C1 & C2) yang disarankan 12 - 22 12 - 22 12 - 22

1 1 1 0a Jangan

101a 110 111 101, 110, 111

0.4 - 0.9 0.9 - 3.0 3.0 - 8.0 > 1.0

digunakan untuk kristal, khusus untuk resonator keramik.

Tabel 1.5: Mode operasi osilator kristal[Atm09, h26] Fuse CKSEL0 bersama dengan SUT1..0 digunakan untuk memilih waktu start-up, seperti pada Tabel 1.6.

19

CKSEL0

SUT1..0

0 0 0 0 1 1 1 1

00 01 10 11 00 01 10 11

Waktu start-up dari power down & power save 258 CK 258 CK 1K CK 1K CK 1K CK 16K CK 16K CK 16K CK

Delay tambahan setelah reset 4.1 ms 65 ms 4.1 ms 65 ms 4.1 ms 65 ms

Digunakan untuk

Resonator keramik, fast rising power Resonator keramik, slowly rising power Resonator keramik, BOD aktif Resonator keramik, fast rising power Resonator keramik, slowly rising power Osilator kristal, BOD aktif Osilator kristal, fast rising power Osilator kristal, slowly rising power

Tabel 1.6: Pilihan waktu start-up untuk osilator kristal

1.6.3

Pemrograman fuse bits

Ada banyak cara untuk memprogram fuse bits, namun yang saya bahas hanyalah pemrograman fuse dengan avrdude.

Perhitungan fuse bitsSebagai contoh, anggap saja kita menginginkan kongurasi sepert ini: Waktu start up paling lama: CKSEL0 = 1, SUT1 = 1, SUT0 = 1 Kecepatan 16 MHz, menggunakan kristal: CKOPT = 0, CKSEL3 = 1, CKSEL2 = 1, CKSEL1 = 1 JTAG tidak digunakan: JTAGEN = 1 Fuse bits lain dibiarkan pada pengaturan default. Sehingga: High byte (HFUSE): Fuse OCDEN JTAGEN SPIEN CKOPT EESAVE BOOTSZ1 BOOTSZ0 BOOTRST No. bit 7 6 5 4 3 2 1 0 Kongurasi 1 (default) 0 0 (default) 0 1 (default) 0 (default) 0 (default) 1 (default)

Tabel 1.7: Contoh HFUSE Jadi HFUSE = 10001001, jika dikonversi ke heksadesimal, HFUSE = 0x89.

20

Low byte (LFUSE): Fuse BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0 No. bit 7 6 5 4 3 2 1 0 Kongurasi 1 (default) 1 (default) 1 (default) 1 1 1 1 1 (default)

Tabel 1.8: Contoh HFUSE Jadi LFUSE = 11111111, dalam heksadesimal HFUSE = 0xFF. Tips! Ada banyak kalkulator fuse bits yang bisa anda temukan di internet, gunakan kata kunci fuse bits calculator pada search engine favorit anda.

Pemrograman fuse bits dengan avrdudePastikan bahwa WinAVR telah terinstall (lihat Bab 3). Perintah untuk memprogram fuse bits dengan avrdude adalah sebagai berikut: avrdude -c PROGRAMMER -P PORT -p m32 -U hfuse:w:HFUSE:m -U lfuse:w:LFUSE:m Dimana: PROGRAMMER: Lihat bagian 1.5 PORT: Lihat bagian 1.5 HFUSE: isi dengan HFUSE yang telah Anda hitung (heksadesimal) LFUSE: isi dengan LFUSE yang telah Anda hitung (heksadesimal)

!Perhatian! Berhati-hatilah dalam memprogram fuse bits, kesalahan kecil bisa menyebabkan mikrokontroler anda tidak bisa digunakan lagi: Misalnya saya pernah secara tidak sengaja mengatur agar ATmega32 menggunakan clock eksternal (CKSEL3..0 = 0000).. hasilnya? mikrokontroler tidak bisa dikenali oleh downloader :-)a Jadi selalu pastikan bahwa pengaturan fuse bits sudah benar sebelum anda memprogramnya.a Jika hal ini terjadi, jangan putus asa, ada beberapa situs internet yang membahas cara mengatasi hal ini, gunakan search engine favorit Anda :-).

21

Bab 2

Bahasa C untuk AVRPada bagian ini akan dijelaskan beberapa materi tur-tur dari Bahasa C yang sering digunakan dalam pemrograman AVR. Anda diharapkan sudah mengerti dasar-dasar Bahasa C seperti deklarasi fungsi, variabel, dsb. Ada banyak tutorial Bahasa C yang bisa anda ikuti di internet, bertanyalah pada om google, dia pasti dengan senang hati membantu anda :-)

2.12.1.1

Optimasi kodeMacam-macam integer

Memori pada mikrokontroler AVR jumlahnya kecil dibandingkan dengan yang ada pada PC sehingga kita harus lebih berhemat saat membuat program pada mikrokontroler/robot. Program robot biasanya banyak menggunakan variabel numerik berupa integer, float ataupun double karena banyaknya perhitungan yang harus dilakukan. Salah satu cara untuk menghemat memori adalah dengan memilih menggunakan variabel (terutama integer) dengan ukuran yang sesuai dengan kebutuhan. Informasi tentang berbagai macam ukuran variabel integer bisa anda lihat pada dokumentasi header stdint.h yang terdapat pada manual avr-libc Start Menu WinAVR avr-libc Manual. Pada tabel 2.2 disajikan ukuran dari berbagai tipe integer. Deklarasiint8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_ta8

Ukurana8-bit 8-bit 16-bit 16-bit 32-bit 32-bit 64-bit 64-bit

Nilai minimum-126 0 -32.766 0 -2.147.483.646 0 -9.223.372.036.854.775.806 0

Nilai maksimum127 255 32.767 65535 2.147.483.647 4.294.967.295 9.223.372.036.854.775.807 18.446.744.073.709.551.615

bit = 1 byte 2 byte = 16 bit = 1 word

Tabel 2.2: Macam-macam tipe integer Integer yang diawali dengan huruf umisalnya uint8_t, uint16_tdisebut dengan unsigned integer. Integer yang tidak diawali huruf u disebut dengan signed integer. Unsigned integer artinya integer tersebut tidak mungkin menyimpan nilai negatif dan signed integer artinya integer tersebut bisa digunakan untuk menyimpan nilai positif dan negatif. Kita bisa menentukan jenis variabel yang akan digunakan dengan memperkirakan nilai maksimum dan minimum yang akan ditampung variabel. Sebagai contoh, misalnya didalam arena robot ada 4 buah ruangan dan kita ingin menyimpan berapa ruangan yang telah dimasuki robot 22

kedalam variabel nomorRuangan. Variabel nomorRuangan tidak mungkin bernilai kurang dari 0, sehingga kita bisa menggunakan unsigned integer (uint*_t). Kemudian karena nilai variabel nomorRuangan kemungkinan besar tidak akan lebih dari 255 maka sebaiknya kita menggunakan integer 8-bit. Dari sini kita bisa menentukan bahwa tipe integer yang akan cocok untuk variable nomorRuangan adalah uint8_t. Contoh kasus lainnya, pada Botro terpasang wheel encoder untuk menghitung putaran roda kiri dan kanan. Jumlah total putaran roda tersimpan dalam variabel jarak_kiri_tot dan jarak_kanan_tot. Jika roda berputar kedepan (sehingga robot bergerak maju) maka variabel akan ditambah sesuai dengan jumlah putaran. Sebaliknya jika roda berputar kebelakang maka variabel akan dikurangi, sehingga ada kemungkinan variabel akan bernilai negatif, oleh karena itu tipe yang cocok adalah signed integer.Satu putaran roda akan menyebabkan variabel bertambah atau berkurang sebanyak sekitar 90 120, tergantung encoder yang digunakan, sehingga menggunakan integer 8-bit adalah ide yang buruk. Pada prakteknya integer 16-bit pun masih mengalami overow karena tidak muat, akhirnya dengan agak berat hati saya memilih menggunakan int32_t.

2.1.2

Konstanta

Jika anda ingin menyimpan konstanta variabel yang tidak akan berubah selama program berjalan maka jangan lupa menggunakan keyword const untuk variabel tersebut:1 const uint8_t nomor_rahasia = 123;

Keyword const akan mempermudah optimasi kode yang dilakukan oleh compiler sehingga program anda bisa lebih esien. Cara lainnya adalah dengan menggunakan #define:1 #define NOMOR_RAHASIA 123 ... 3 ... if( tebakan != NOMOR_RAHASIA ) 5 printf("Tebakan anda salah, coba lagi!\n"); else 7 printf("Selamat, jawaban anda benar!");

Setiap kali compiler menjumpai NOMOR_RAHASIA maka akan diganti dengan angka 123. Jangan menaruh konstanta yang digunakan berulang langsung pada kode, cara seperti ini tidak lazim digunakan karena nantinya program akan sulit dibaca dan anda akan kesulitan jika suatu saat harus merubah konstanta tersebut karena anda harus mencari dan mengubahnya satupersatu.

2.22.2.1

Manipulasi port I/OPort I/O ATmega32

Seperti yang telah dijelaskan pada bagian 1.3 ATmega32 mempunyai 4 buah port I/O: PORTA, PORTB, PORTC dan PORTD. Keempat port ini bisa diakses/dimanipulasi melalui register dengan nama yang sama, jadi PORTA diakses dari register PORTA, PORTB diakses dari register PORTB dan seterusnya. Selain register PORT (PORTA-PORTD), terdapat juga dua jenis register lain, yaitu DDR Data Direction Register -- (DDRA-DDRD) dan PIN (PINA-PIND). Ketiga jenis register ini memiliki fungsi yang berbeda-beda: PORT Register PORT digunakan untuk mengubah nilai port I/O.

23

Bit Read/Write Initial Value

7PORTA7

6PORTA6

5PORTA5

4PORTA4

3PORTA3

2PORTA2

1PORTA1

0PORTA0 PORTA

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

Gambar 2.1: Register PORTA[Atm09, h64] Pada Gambar 2.1 ditunjukkan susunan dari register PORTA. Read/Write menunjukkan status baca/tulis setiap bit register. Pada register PORTA, setiap bit bisa dibaca dan ditulisi. Initial Value menyatakan nilai awal yang diberikan pada PORTA setelah terjadi reset. Dari gambar kita bisa melihat bahwa keadaan default PORTA adalah logika nol (0 Volt). Pada penulisan program penulisan bit bisa disingkat, misalnya PORTA7 ditulis PA7, PORTB0 menjadi PB0, dst. Untuk mengubah output tiap pin kita harus mengubah bit yang mewakili pin tersebut tanpa mengganggu bit-bit lain, misalnya untuk mengubah PA7 dari 0 menjadi 1, kita harus mengubah bit 7 dari register PORTA, dst. Dalam Bahasa C hal ini bisa dilakukan dengan operasi bitwise (dibahas pada bagian 2.2.2). DDR Register DDR digunakan untuk mengubah fungsi pin I/O dari port yang ditentukan. Sebuah pin bisa difungsikan sebagai input atau output dengan cara mengatur setiap bit dari register DDR yang berkaitan.Bit Read/Write Initial Value 7 DDA7 R/W 0 6 DDA6 R/W 0 5 DDA5 R/W 0 4 DDA4 R/W 0 3 DDA3 R/W 0 2 DDA2 R/W 0 1 DDA1 R/W 0 0 DDA0 R/W 0 DDRA

Gambar 2.2: Register DDRA [Atm09, h64] Dari Gambar 2.2 bisa dilihat bahwa setelah reset semua bit pada DDRA diset 0, sehingga PORTA berfungsi sebagai input. Ini tidak hanya berlaku untuk PORTA tapi juga untuk semua PORT. Fungsi tiap pin bisa diubah independen terhadap pin-pin lain, misalnya untuk mengubah PA5 menjadi output, maka kita perlu mengubah bit DDA5 menjadi 1. Jika kemudian DDA5 dirubah lagi menjadi nol, maka PA5 akan berubah kembali menjadi input. PIN Register PIN digunakan untuk membaca nilai port I/O.Bit Read/Write Initial Value 7 PINA7 R N/A 6 PINA6 R N/A 5 PINA5 R N/A 4 PINA4 R N/A 3 PINA3 R N/A 2 PINA2 R N/A 1 PINA1 R N/A 0 PINA0 R N/A PINA

Gambar 2.3: Register PINA[Atm09, h64]

2.2.22.2.2.1

Operasi bitwiseOperasi bitwise

AND: & OR: | XOR: ^ 24

NOT/bit flip:

~

Jika digolongkan berdasarkan jumlah argumen/operand maka operator AND, OR, dan XOR tergolong kedalam operator binary, artinya operator tersebut membutuhkan dua buah argumen. Sedangkan operator NOT digolongkan kedalam operator unary karena hanya membutuhkan satu argumen. Berikut ini adalah tabel-tabel kebenaran dari tiap operasi bitwise: Bit 1 0 0 1 1 Bit 2 0 1 0 1 Hasil 0 0 0 1

Tabel 2.3: Tabel kebenaran operasi bitwise AND Bit 1 0 0 1 1 Bit 2 0 1 0 1 Hasil 0 1 1 1

Tabel 2.4: Tabel kebenaran operasi bitwise OR Bit 1 0 0 1 1 Bit 2 0 1 0 1 Hasil 0 1 1 0

Tabel 2.5: Tabel kebenaran operasi bitwise XOR Bit 1 0 1 Hasil 1 0

Tabel 2.6: Tabel kebenaran operasi bitwise NOT Perbedaan operasi logika biasa dengan operasi logika boolean Operasi bitwise berbeda dengan operasi logika boolean karena digunakan untuk mengubah bit-bit dari variabel/register secara langsung. Untuk lebih jelasnya perhatikan program dibawah ini:1 #include 3 int main() { 5 char a = 45; // char b = 68; // 7 printf("a && b = %i\n", a && b); // 9 printf("a & b = %i\n\n", a & b); // 11 13

0010 1101 0100 0100 AND Bitwise AND

printf("a || b = %i\n", a || b); // OR printf("a | b = %i\n", a | b); // Bitwise OR

25

15 }

getchar(); return 0;

Jika program dijalankan maka outputnya adalah:a && b = 1 2 a & b = 4 4 a || b = 1 a | b = 109

Seperti yang kita lihat, output dari operasi logika boolean berbeda dengan operasi logika bitwise. Pada operasi logika AND dan OR yang dievaluasi adalah nilai dari a dan b secara keseluruhan, jika lebih besar dari 0 maka dianggap TRUE dan jika kurang dari atau sama dengan nol maka dianggap FALSE, sehingga: a > 0, maka a = TRUE b > 0, maka b = TRUE a && b hasilnya TRUE, demikian juga a || b, hasilnya TRUE Pada operasi bitwise AND, operasi logika dilakukan pada setiap bit dari kedua angka, bit pertama dari variabel a dioperasikan dengan bit pertama dari variabel b dan seterusnya untuk semua bit yang terdapat pada kedua variabel:

Gambar 2.4: Operasi bitwise AND Demikian juga dengan bitwise OR:

Gambar 2.5: Operasi bitwise OR 2.2.2.2 Operasi bit-shift

Operasi bit-shift digunakan untuk menggeser seluruh bit dari variabel atau register kearah kiri atau kanan sesuai dengan keinginan kita. Operasi ini diperlukan agar kita bisa memanipulasi bit satu persatu, tanpa mengganggu bit-bit lainnya, sehingga kita bisa mengubah salah satu port I/O ATmega32 tanpa mengubah port I/O lainnya, contohnya kita bisa mengeset pin PA0 menjadi 0 tanpa mengubah nilai pin lain yang tergabung dalam PORTA. Left bit shift Dalam Bahasa C, operasi ini dilambangkan dengan tanda