Anda di halaman 1dari 53

Apa Isi Buku ini? Pendahuluan................................................................................................... ...............2 Memperkenalkan AVR Kodebo.....................................................................................3 Keunggulan KODEBO..................................................................................................3 Konfigurasi hardware KODEBO...................................................................................

4 Fitur KODEBO..............................................................................................................6 Sekilas bahasa CAVR....................................................................................................7 Bermain dan Belajar Menggunakan Kodebo...............................................................18 DAFTAR PUSTAKA..................................................................................................44

Memperkenalkan AVR Kodebo

Pendahuluan Sudah lama teknologi digital muncul di bumi. Setelah teknologi digital hadir, menyusul juga teknologi mikroprosesor, mikrokomputer, PLC, DCS, SCADA, dll. Di antara perangkat embedded tersebut masih ada suatu perangkat yang sangat popular. Perangkat ini biasanya digunakan untuk pengatur perangakat elektronika lain. Sangat cocok digunakan untuk pembuatan prototipe suatu alat elektronik karena penggunaannya yang mudah, harganya yang relatif murah, dan bentuknya yang simple dan praktis. Nah, mungkin untuk alasan tersebut hadirlah teknologi mikrokontroler. Mikrokontroler, nama yang mungkin sering kita dengar. Apalagi bagi mereka yang sedang menggeluti bidang elektronika atau pemrograman. Sekarang apa sih mikrokontroler itu? Apa gunanya? Kapan perlu digunakan? Dan bagaimana menggunakannya? Mikrokontroler merupakan perangkat elektronika yang dapat digunakan untuk mengendalikan perangkat elektronika lain dengan cara diprogram. Pemrograman ini dapat dilakukan dengan banyak pemrogaman yang telah mendukungnya. Misalnya, Assembly, Basic, C/C++, Pascal dsb. Mikrokontroler type CISC clan RISC saat ini berkembang pesat. Hal ini didasarkan pada arsitektur processor dan set instruksinya. Tipe AVR (Alfand Vegard's Risc processor) merupakan jenis RISC, yang hampir semua instruksi dikerjakan 1 siklus, sehingga lebih cepat waktu eksekusinya.

Memperkenalkan AVR Kodebo AVR Kodebo merupakan Development board dengan CPU Mikrokontroler ATMega16/32/8535. Development board ini terdiri dari 32 PORT I/O bebas, dengan beberapa perangkat I/O yang langsung terintegrasi dengan PORT Mikrokontroler. Dengan demikian user dapat menggunakan perangkat I/O langsung dengan cara mengatur DIP Switch ke Posisi ON. Kodebo didesain sedemikian rupa menarik dengan komponen berkualitas dan tentunya sesuai kebutuhan para pengguna mikrokontroler. Mereka yang suka robotik, atau yang senang bereksperimen dengan mikrokontroler. Mungkin anda yang sedang riset atau mengerjakan sebuah prototipe sistem otomasi. Untuk beginner yang sedang belajar, atau untuk master yang sedang melakukan pelatihan. Untuk alasan-alasan inilah hadir Kodebo yang sungguh istimewa.

Lalu Apa Keunggulan Kodebo 1. 2. 3. 4. 5. Menggunakan Mikrokontroler jenis RISC (AVR) Mendukung Mikrokontroler Atmega16/32/8535 Terdapat 32 saluran/channel I/O Mempunyai 8 Channel ADC Mendukung Banyak Bahasa Pemrograman

(Assembly/BASCOM/CVAVR/WinAVR) 6. 7. 8. 9. 3 buah timer / counter Osilator internal Flash PEROM 16 Kb EEPROM 512 byte

10. SRAM 512 byte 11. Interupsi Eksternal dan Internal 12. Port USART untuk komunikasi serial 13. Terdapat perangkat I/O terintegrasi seperti, a. b. c. d. e. f. g. push button sebagai input LCD 16x2 karakter 8 LED indikator L298N Driver Motor Relay output TSOP sebagai receiver infrared communication dan sebagainya

Konfigurasi Hardware Kodebo Kodebo dengan ATMega16 sebagai otaknya memiliki konfigurasi pin 40 kaki yang terdiri dari masing-masing pin I/O (32 pin) serta mempunyai fungsi khusus tergantung penggunaannya.

No 1 2 3

Tabel 1. Konfigurasi Pin ATMega16 Nama Fungsi PBO XCK/TO) PB1 (T1) PB2 (INT2/AIN0) Port B0 / Counter 0 / clock eksternal untuk USART (XCK) Port B1 / Counter 1 Port B2 / Input (+) Analog Komparator (AIN0) dan interupsi eksternal2 INT2 Port B3 / Input (-) Analog Komparator (AIN1) dan output PWM0 Port B4 / SPI Slave Select Input (SS)

PB3 (OC0/AIN1)

PB4 (SS)

6 7 8 9 10 11 13Dec 14 15 16 17 18 19 20 21 22 23 24-27 28 29 30 31 32 33-40

PB5 (MOSl) PB6 (MISO) PB7 (SCK) RESET VCC GND XTAL2-XTAL1 PD0 (RXD) PD1 (TXD) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP1) PD7 (OC2) PC0 (SCL) PC1 (SDA) PC2 PC5 PC6 (TOSC1) PC7 (TOSC2) AVCC GND AREFF PA0 PA7

Port BS / SPI bus Master Out Slave In Port B6 / SPI bus Master In Slave Out Port B7 / sinyal clock serial SPI Reset mikrokontroler Catu daya (+) Sinyal ground terhadap catu daya Sinyal input clock eksternal (kristal) Port D0 / Penerima data serial Port D1 / Pengirim data serial Port D2 / Interupsi eksternal 0 Port D3 / Interupsi eksternal 1 Port D4 / Pembanding Timer-Counter 1 (Output PWM 1B) Port D5 / Output PWM 1A Port D6 / Timer-Counter 1 input Port D7 / Output PWM 2 Port C0 / Serial bus clock line Port C1 / Serial bus data input-output Port C2 C5 Port C6 / Timer osilator 1 Port C7 / Timer osilator 2 Tegangan ADC Sinyal ground ADC Tegangan referensi ADC Port A0-PortA7 input untuk ADC (8 channel : ADCO-ADC7)

Inilah fitur Kodebo, 1. 2. 3. 4. 5. 6. 7. 8. 9. Support ATMega16/32/8535 (ATMega16 Included) External Crystal 12Mhz LCD 16x2 8 LED indicator 1x8 Pin header (support as servo connector) L298 Motor Driver Relay 5V TSOP (for remote Control) LM35 Temperature Sensor

10. LDR Light Sensor 11. Potensiometer (for ADC Test) 12. 1 reset button 13. 4 button 14. 3 Dipswitch 15. DC connector for Adaptor 16. Tblock connector 17. 2x8 Pin header 18. ISP Connector

Sekilas tentang CVAVR CVAVR adalah bahasa pemrograman yang menggunakan compiler C dilengkapi lingkungan IDE (Integrated Development Environment) dan pemrogram otomatis yang

didesain untuk mikrokontroller keluarga AVR. CVAVR berjalan pada sistem operasi windows 95,98,NT 4, 2000 dan windows XP. Lingkungan IDE dilengkapi dengan programmer untuk AVR lewat ISP yang

otomatis akan mentransfer file *.hex ke memori mikrokontroller setelah proses kompilasi file *.c berhasil dilakukan. Programmer ISP pada CVAVR ini didesain support untuk : kit modul STK500, Kanda System STK200+/300, Dontronics DT006, Vogel Elektronik VTEC-ISP, Futurlec JRAVR dan MicroTronics ATCPU /Mega2000 Development Board. Selain itu juga dilengkapi program terminal serial untuk mendebug/melihat hasil kompilasi program lewat serial port microcontroller. Fasilitas lain adalah library pada CVAVR didedikasikan untuk: 1. Modul LCD alpha numerik 2. I2C bus Philips 3. Sensor suhu LM75 National Semiconductor 4. SPI 5. Power Management 6. Delay 7. MMC 8. dll Fasilitas menarik lainnya adalah dilengkapi CodeWizardAVR Automatic Program Generator yang membimbing kita dalam menulis sintaks program. Fungsi-fungsi yang didukung oleh codeWizardAVR ini adalah: 1. 2. 3. setup akses memori eksternal identifikasi sumber reset pada chip inisialisasi port input/output

4. 5. 6. 7. 8. 9.

inisialisasi interrupt eksternal inisialisasi timer/counter inisialisasi watchdog timer inisialisasi UART dan interrupt serial inisialisasi komparator analog inisialisasi ADC

10. inisialisasi interfacing SPI 11. inisialisasi bus I2C 12. inisialisasi bus 1Wire dan sensor suhu DS1820/DS18S20 13. inisialisasi modul LCD.

Kaidah-kaidah penulisan bahasa C pada CVAVR Penulisan program menggunakan CVAVR harus mengikuti kaidah-kaidah yang diterapkan oleh bahasa pemrograman C karena compiler CVAVR dikembangkan menggunakan bahasa C. Kaidah-kaidah pemrograman secara garis besar dapat diuraikan sebagai berikut: a. Struktur penulisan program #include < [library1.h] > // Opsional

#include < [library2.h] > // Opsional #define [nama1] [nilai] ; // Opsional

#define [nama2] [nilai] ; // Opsional [global variables] // Opsional [functions] // Opsional

void { [Deklarasi [Isi }

main(void)

//

Program

Utama

local Program

variable/constant] Utama]

b. Tipe data char : 1 byte ( -128 s/d 127 ) unsigned char : 1 byte ( 0 s/d 255 ) int : 2 byte ( -32768 s/d 32767 ) unsigned int : 2 byte ( 0 s/d 65535 ) long : 4 byte ( -2147483648 s/d 2147483647 ) unsigned long : 4 byte ( 0 s/d 4294967295 ) float : bilangan desimal array : kumpulan data-data yang sama tipenya.

c. Deklarasi variabel & konstanta Variabel adalah memori penyimpanan data yang nilainya dapat diubah-ubah. Penulisan : [tipe data] [nama] = [nilai] ; Konstanta adalah memori penyimpanan data yang nilainya tidak dapat diubah. Penulisan : const [nama] = [nilai] ;

Tambahan: Global variabel/konstanta yang dapat diakses di seluruh bagian program.

Local variabel/konstanta yang hanya dapat diakses oleh fungsi tempat dideklarasikannya.

d. Statement Statement adalah setiap operasi dalam pemrograman, harus diakhiri dengan [ ; ] atau [ } ]. Statement tidak akan dieksekusi bila diawali dengan tanda [ // ] untuk satu baris. Lebih dari 1 baris gunakan pasangan [ /* ] dan [ */ ]. Statement yang tidak dieksekusi disebut juga comments / komentar. Contoh: suhu=adc/255*100; //contoh rumus perhitungan suhu

e. Function Function adalah bagian program yang dapat dipanggil oleh program utama. Penulisan : [tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2]) { [statement] } ;

10

f. Conditional statement dan looping if else : digunakan untuk penyeleksian kondisi if [statement1]; [statement2]; } else [statement3]; [statement4]; } for : digunakan untuk looping dengan jumlah yang sudah diketahui for ( [nilai awal] ; [persyaratan] ; [operasi nilai] ) { { ( [persyaratan] ) {

[statement1]; [statement2]; } while : digunakan untuk looping jika dan salama memenuhi syarat tertentu while [statement1]; [statement2]; } ( [persyaratan] ) {

11

do while : digunakan untuk looping jika dan salama memenuhi syarat tertentu, namun min 1 kali do [statement1]; [statement2]; } while ( [persyaratan] ) switch case : digunakan untuk seleksi dengan banyak kondisi switch case break; case break; } [nilai2]: [statement]; ( [nama [nilai1]: variabel] ) { [statement]; {

g. Operasi logika dan biner Logika AND :&& NOT : ! OR : || Biner AND : &

12

OR : | XOR : ^ Shift right: >> Shift left : << Komplemen : ~ h. Operasi relasional (perbandingan) Sama dengan : == Tidak sama dengan : != Lebih besar : > Lebih besar sama dengan : >= Lebih kecil : < Lebih kecil sama dengan : <=

i. Operasi aritmatika + , - , * , / : tambah,kurang,kali,bagi += , -= , *= , /= : nilai di sebelah kiri operator di tambah/kurang/kali/bagi dengan nilai di sebelah kanan operator % : sisa bagi ++ , -- : tambah satu (increment) , kurang satu (decrement) Contoh a = 5 * 6 + 2 / 2 -1 ; maka nilai a adalah 30 a *= 5 ; jika nilai awal a adalah 30, maka nilai a = 30x5 = 150. a += 3 ; jika nilai awal a adalah 30, maka nilai a = 30+5 = 33. :

13

a++ ; jika nilai awal a adalah 5 maka nilai a = a+1 = 6. a-- ; jika nilai awal a adalah 5 maka nilai a = a-1 = 4.

Memulai CodeVisionAVR Untuk memulai suatu projek maka pilih saja pada menu file-> New maka akan muncul gambar berikut,

Pilihlah Project dan klik tombol OK

Selajutnya Anda dapat memilih apakah ingin menggunakan CodeWizardAVR atau tidak. CodeWizardAVR ini berfungsi untuk membuat atau menghasilkan listing program sesuai settingan yang Anda inginkan.

14

Jika Anda memilih menggunakan CodeWizardAVR maka akan muncul tampilan seperti berikut:

Nah, pada gambar tersebut ditunjukkan bahwa chip yang digunakan adalah ATMega16, dan clock 12MHz sesuai dengan fitur yang terdapat pada Kodebo. Settingan selanjutnya juga dapat diatur dengan menggunakan CodeWizardAVR ini. Misalnya USART, Analog Comparator, ADC, SPI, I2C dan masih banyak lagi. Setelah selesai melakukan pengaturan dengan CodeWizarAVR maka klik menu generate file, save and exit. Kemudian beri nama file dan simpan.

15

Setelah melakukan beberapa langkah tadi akhirnya file yang dibuat dengan CodeWizardAVR tadi siap juga untuk di-compile, tentunya dengan penambahan program yang anda inginkan. Berikut tampilan CVAVR yang menampilkan file ekstensi .c , library yang digunakan, fungsi yang ada pada program dan tentunya juga menampilkan menu serta seluruh fitur CodeVisionAVR.

16

Jika program sudah selesai Anda dapat mencoba meng-compile nya dengan menekan tombol compile atau shift+f9. Jika tidak ada kesalahan maka akan tampil pesan no error seperti gambar berikut:

17

Bermain dan Belajar Menggunakan Kodebo


Menghidupkan LED Berikut ini merupakan listing untuk menghidupkan LED sistem flip-flop. LED dihubungkan dengan PORTC Modul Kodebo. Saklar / dip switch dibiarkan pada kondisi OFF saja.

#include <mega16.h> #include <delay.h>

void main(void) { PORTC=0x00; DDRC=0xFF;

18

while (1) { PORTC=0xff; delay_ms(500); PORTC=0x00; delay_ms(500); }; }

Contoh lain, #include <mega16.h> #include <delay.h>

void main(void) { DDRC = 0xFF; while (1) { for (x=1;x<128;x*=2) { PORTC = x; delay_ms(500); } // Nilai x dikeluarkan ke PORTC // PORTC digunakan sebagai output (DDR dibuat high)

19

for (i=256; i>=1;i=i/2) { PORTC= i; delay_ms(500); } } } // Nilai i dikeluarkan ke PORTC

Menghidupkan LED dengan tombol pengaturan Tombol pengaturan yang digunakan pada kali ini adalah menggunakan tombol push button (micro switch). Tombol yang dimaksud adalah 4 buah tombol yang ada di samping lcd pada Modul Kodebo. Tidak perlu susah-susah, program pada contoh ini berfungsi untuk menghidupkan LED dengan Pola tertentu sesuai tombol yang ditekan. #include <mega16.h> #include <delay.h> #define PINA.0 tombol1 #define PINA.1 tombol2 #define PINA.2 tombol3 #define PINA.3 tombol4

Void pola1(void) { PORTC=0xFF; delay_ms(500);

20

PORTC=0x00; delay_ms(500); }

Void pola2(void) { PORTC=0b10101010; delay_ms(500); PORTC=0b01010101; delay_ms(500); }

Void pola3(void) { PORTC=0b11100111; delay_ms(500); PORTC=0b11011011; delay_ms(500); PORTC=0b10111101; delay_ms(500); PORTC=0b01111110; delay_ms(500); PORTC=0b10111101; delay_ms(500);

21

PORTC=0b11011011; delay_ms(500); PORTC=0b11100111; }

Void pola4(void) { for (x=1;x<128;x*=2) { PORTC = x; delay_ms(500); } // Nilai x dikeluarkan ke PORTC

for (i=256; i>=1;i=i/2) { PORTC= i; delay_ms(500); } } // Nilai i dikeluarkan ke PORTC

void main(void) { DDRC = 0xFF; PORTC=0xFF; // PORTC digunakan sebagai output (DDR dibuat high)

22

DDRA=0x00; PORTA=0x0F;

while (1) { if (tombol1==0) pola=1; else if (tombol2==0) pola=2; else if (tombol3==0) pola=3; else if (tombol4==0) pola=4; switch (pola) { case 1; pola1(); case 2; pola2(); case 3; pola3(); case 4; pola4(); } } } Pada program tersebut LED akan menyala sesuai dengan tombol yang ditekan. Tetapi pola LED tidak akan langsung berganti saat mikrokontroler sedang menjalankan program pada pola yang dipilih. Untuk itu penekanan tombol mungkin butuh waktu yang agak lama dengan tujuan menunggu saat mikrokontroler keluar dari fungsi pola yang sedang dijalankan, kemudian mikrokontroler mengecek tombol yang sedang ditekan tadi. Pada contoh selanjutnya akan dijelaskan interupsi yang dapat memberikan solusi terhadap hal ini.

23

Menampilkan karakter LCD Menampilkan sebuah karakter, string atau kalimat bukanlah hal yang susah. Dengan menggunakan bahasa C akan terasa lebih mudah, intruksi-intruksinya lebih mudah dipahami dari bahasa mesin (assembly). Pada Software CodeVisionAVR juga sudah disediakan sebuah library yang memudahkan kita untuk berkreasi dengan sebuah LCD. Pada Board Kodebo sudah tersedia LCD 16x2, Anda tinggal mengubah posisi dip switch yang ada pada PORTC. Untuk memulai projek Anda, pastikan dip switch PORTC pada posisi ON.

#include <mega16.h> #include <lcd.h> #include <delay.h>

// Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm

void main(void) { lcd_init(16); while (1) { lcd_clear();

24

lcd_gotoxy(0,0); lcd_putchar(" lcd_gotoxy(0,1); lcd_putchar("ELECTRONICS"); delay_ms(100); } } KONTRI ");

Menampilkan Nilai pada LCD Untuk menampilkan suatu nilai ke LCD digunakan library stdio.h. Sebelum ditampilkan ke LCD nilai yang akan ditampilkan perlu diubah ke string (character) dan ditampung dalam buffer. Perintah yang digunakan adalah sprintf yang penggunaannya dapat dilihat langsung pada listing berikut:

#include <mega16.h> #include <lcd.h> #include <stdio.h> #include <delay.h> //Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm

25

void main(void) { char buff[20]; unsigned char a=10, b=101; lcd_init(16); while (1) { lcd_clear(); sprintf(buff,nilai a=%d ,a); lcd_gotoxy(0,0); lcd_puts(buff); sprintf(buff,nilai b=%d ,b); lcd_gotoxy(0,1); lcd_puts(buff); delay_ms(100); } }

Aplikasi ADC dengan Kodebo ADC (Analog to Digital Converter) merupakan alat yang berfungsi mengubah sinyal analog menjadi sinyal digital. Dalam akuisisi data ADC biasanya berperan penting. Banyak sensor yang outputnya masih berupa sinyal analog untuk itu perlu diubah ke dalam bentuk digital, agar sinyal tersebut dapat diproses secara digital oleh mikrokontroler. Pada seri

26

AVR mikrokontroler sudah terdapat fitur ADC. Jadi Anda tidak perlu susah-susah menambahkan ADC. Pada AVR Kodebo sudah terdapat input analog berupa tegangan dari potensiometer, sensor suhu LM35, dan sensor cahaya yaitu LDR. Untuk memahami konsep ADC dapat dilihat listing berikut ini. Jangan lupa untuk memposisikan dip switch PINA pada posisi ON. Kemudian aturlah PORTC sebagaimana pada pengaturan penggunaan LCD yang telah dijelaskan sebelumnya.

Mengkonversi Nilai ADC sensor suhu LM35 ke Celcius Nilai suhu yang didapat dari sensor LM35 pastinya dapat bernilai pecahan. Untuk itu diperlukan variabel yang dapat menampun nilai pecahan yaitu float. Tidak cukup di situ, untuk menampilkan nilai pecahan tersebut ke LCD juga diperlukan pengaturan pada menu Configure the Project. Pengaturannya adalah seperti ditampilkan pada gambar berikut:

27

#include <mega16.h> #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #include <stdio.h> #include <delay.h> #define ADC_VREF_TYPE 0x40

char buff[20]; float suhu=0;

typedef unsigned char byte; flash byte char0[8]={ 0b0000111, 0b0000101, 0b0000111, 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0000000};

28

/* function used to define user characters */ void define_char(byte flash *pc,byte char_code) { byte i,a; a=(char_code<<3) | 0x40; for (i=0; i<8; i++) lcd_write_byte(a++,*pc++); }

// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }

29

float baca_suhu(void) { int data_adc=0; float data_suhu=0;

data_adc=read_adc(1); data_suhu=(data_adc*5.0/1023)*100; return data_suhu; }

void main(void) { PORTA=0x00; DDRA=0x00;

// LCD module initialization lcd_init(16);

// ADC initialization // ADC Clock frequency: 187,500 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86;

30

define_char(char0,0); while (1) { suhu=baca_suhu(); hitung_pid(); sprintf(buff,"suhu=%0.2f",suhu); lcd_gotoxy(0,0); lcd_puts(buff); lcd_putchar(0); lcd_putsf("C"); }; }

Mengenal Driver Motor L298D L298D merupakan IC driver motor yang di dalamnya terdapat dua kanal. Setiap kanalnya mempunyai 2 input logic, 1 input enable (dapat digunakan untuk input pwm), dan output yang perlu dirangkai dengan dioda (H-Bridge) sebelum masuk ke beban/motor. Adapun tabel kebenaran IC L298D adalah sebagai berikut:

#include <mega16.h> #include <stdio.h> #include <delay.h>

#define dir1 PORTD.6 #define dir2 PORTD.7

31

#define tbl_run PINA.0 #define tbl_cw PINA.1 #define tbl_ccw PINA.2 #define tbl_stop PINA.3

void kanan(void) { dir1=0; dir2=1; PORTD.4=1; }

void kiri(void) { dir1=1; dir2=0; PORTD.4=1; }

void jalan(void) { PORTD.4=1; }

32

void berhenti(void) { PORTD.4=0; } void main(void) { DDRA=0x00; PORTA=0x0F;

DDRD=0xF0; PORTD=0x00;

delay_ms(100);

while (1) { if (!tbl_run) jalan(); else if (!tbl_cw) kanan(); else if (!tbl_ccw) kiri(); else if (!tbl_stop) berhenti(); } }

33

Mengendalikan Relay 5V Dalam dunia elektronika, relay dikenal sebagai komponen yang dapat mengimplementasikan logika switching. Sebelum tahun 70an, relay merupakan otak dari rangkaian pengendali. Baru setelah itu muncul PLC yang mulai menggantikan posisi relay. Relay yang paling sederhana ialah relay elektromekanis yang memberikan pergerakan mekanis saat mendapatkan energi listrik. Secara sederhana relay elektromekanis ini didefinisikan sebagai berikut : -Alat yang menggunakan gaya elektromagnetik untuk menutup (atau membuka) kontak saklar. -Saklar yang digerakkan (secara mekanis) oleh daya/energi listrik.

Nah, melihat pentingnya sebuah relay dalam dunia elektronika maka AVR Kodebo menghadirkan sebuah relay 5V. Relay tersebut dikendalikan oleh sebuah transistor NPN C9013. Jadi untuk mengaktifkan relay diperlukan tegangan 5V atau logika 1 pada mikrokontroler. Berikut ini diberikan contoh pengendalian relay dengan 2 buah tombol yang berfungsi menghidupkan dan mematikan relay.

Mengenal Interupsi Interupsi adalah kondisi yang memaksa mikrokontroler menghentikan sementara eksekusi program utama untuk mengeksekusi rutin interrupt tertentu / Interrupt Service Routine (ISR) Setelah melaksanakan ISR secara lengkap, maka mikrokontroler akan kembali melanjutkan eksekusi program utama yang tadi ditinggalkan. Pada mikrokontroler jenis AVR terdapat 21 sumber interupsi, di antaranya seperti ditunjukkan tabel berikut:

34

Pada contoh sederhana, akan diperagakan bagaimana mengaktifkan interupsi eksternal. dapat diamati listing berikut. -Membuat Pewaktu berbasis timer 1 detik

Mengambil data remote TV Perlu diketahui remote TV mempunyai protocol yang berbeda. Misalnya Philips dengan sony akan saling berbeda protokolnya. Remote yang digunakan pada aplikasi ini adalah

35

jenis Sony. Jadi jika Anda menggunakan remote Philips, program tidak akan bekerja. Sebagai penerima telah tersedia TSOP1738 pada Modul AVR Kodebo. Sensor tersebut bekerja pada frekuensi 38Khz.

Pulsa yang digunakan pada protocol sony (SIRF) dapat dijelaskan pada gambar di bawah ini:

Dengan melihat gambar tersebut kita tahu satu frame data yang dikirim oleh remot terdiri dari 1 bit start, 7 bit command, dan 5 bit address. Command menjelaskan tombol yang ditekan, sedangkan address menerangkan device yang digunakan. Adapun untuk kejelasan dapat dilihat pada tabel berikut:

36

Tabel Address Remot Sony Address 1 2 3 6 12 16 17 18 TV VCR 1 VCR 2 Laser Disc Unit Surround Sound Cassette deck / Tuner CD Player Equalizer Device

Tabel Command Remot Sony Command 0 1 2 3 4 5 6 7 8 9 16 17 18 19 20 Digit key 1 Digit key 2 Digit key 3 Digit key 4 Digit key 5 Digit key 6 Digit key 7 Digit key 8 Digit key 9 Digit key 0 Channel + Channel Volume + Volume Mute Function

37

21 22 23 24 25 26 27 30 31 38 39 47

Power Reset Audio Mode Contrast + Contrast Colour + Colour Brightness + Brightness Balance Left Balance Right Standby

Listing Program Aplikasi Remot Sony #include <mega16.h> #include <stdio.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h>

char lcd_buffer[30];

#define ENABLE_INT0 GICR |= 0x40

38

#define DISABLE_INT0 GICR &= ~0x40 #define INPUT DDRD.2=0

unsigned int read_IR (void); unsigned char count, code, address;

// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { unsigned int IR_input;

DISABLE_INT0; INPUT; TCNT0=0; while(PIND.2==1); count = TCNT0; if(count < 24) { delay_ms(20); ENABLE_INT0; return; }

//matikan interupt //sebagai input //kosongkan nilai timer/counter0 //ulangi terus sampai PIND.2=0 //ambil nilai Timer //to verify start pulse (2.4 ms long)

//kembali keprogram utama

IR_input = read_IR (); //ke fungsi read_IR code = (unsigned char) ((IR_input & 0xff00) >> 8);

39

address = (unsigned char) (IR_input & 0x00ff); ENABLE_INT0; } //sebagai interupt lagi

unsigned int read_IR (void) { unsigned char pulseCount=0, codeIR = 0, addressIR = 0, timerCount; unsigned int IR_input;

while(pulseCount < 6) { while(PIND.2==0); TCNT0 = 0; while(PIND.2==1); pulseCount++; timerCount = TCNT0; if(timerCount > 8) //8*0.0853=0.6824ms //stay here if PIND.2=1 //stay here until PIND.2!=0

codeIR = codeIR | (1 << (pulseCount-1)); else codeIR = codeIR & ~(1 << (pulseCount-1)); }

pulseCount = 0; while(pulseCount < 5)

40

{ while(PIND.2==0); TCNT0 = 0; while(PIND.2==1); pulseCount++; timerCount = TCNT0; if(timerCount > 8) addressIR = addressIR | (1 << (pulseCount-1)); else addressIR = addressIR & ~(1 << (pulseCount-1)); } IR_input = (((unsigned int)codeIR) << 8) | addressIR; return(IR_input); } //stay here if PIND.2=1 //stay here until PIND.2!=0

void port_init() { DDRD = 0x00; }

//timer0 init void timer0_init() { //8-bit timer for measuring delay between IR pulses

41

TCCR0 = 0x05; //CLK / 1024 TCNT0 = 0; //reset the timer }

0.0853ms

void int0_init() { MCUCR=0x03; ENABLE_INT0; } //transisi naik

void main(void) { port_init(); timer0_init(); int0_init(); // Global enable interrupts #asm("sei") // LCD module initialization lcd_init(16); while(1) { lcd_clear(); sprintf(lcd_buffer,"code%i address%i",code,address); lcd_puts(lcd_buffer);

42

delay_ms(50); }; }

Mengakses Keypad Matrix 4x4 Pada bab ini Anda harus menggabungkan listing berikut dengan program yang sudah anda sebelumnya. Karena program berikut hanya berisi fungsi yang dapat digunakan untuk mengakses fungsi keypad. Ada baiknya jika Anda menggabungkan fungsi keypad ini dengan progarm yang berfungsi untuk menampilkan nilai keypad yang sedang ditekan.

#define kolom PORTA #define baris PINA

unsigned char get_keypad() { unsigned char data, i, j;

43

data=16; for (j=0; j<4; j++) { kolom=0xff; kolom&=~(1<<j); delay_ms(5); for (i=0; i<4; i++) { if(baris &(1<<i+4)) { data=i+(4*j) delay_ms(50); return data; } } } return data; }

Aplikasi Seven Segment dan RTC DS1307 DS1307 merupakan chip atau ic RTC (Real Time Clock) yang dapat difungsikan sebagai jam digital. Untuk megakses informasi jam, menit, detik, tanggal, bulan, dansebagainya perlu digunakan sistem komunikasi i2c. Sistem komunikasi ini mengijinkan perangkat

44

master(mikrokontroler) untuk mengakses slave (DS1307) melalui dua jalur bus yaitu SDA dan SCL. Seven Segment yaitu papan yang terdiri dari 7 segmen membentuk angka dan dapat menyala dengan adanya beberapa buah LED di dalamnya. Kali ini Anda dapat membuat jam digital sendiri dengan adanya modul AVR KODEBO. Hanya dengan mengatur koneksi shift register IC 4094 yang ada di blok seven segmen modul AVR KODEBO. Di samping itu Anda juga harus mengatur koneksi modul RTC dengan port mikrokontroler. Untuk contoh program dapat dilihat pada tulisan berikut: Program Jam Digital #include <mega16.h> #asm .equ __i2c_port=0x18 ;PORTB .equ __sda_bit=6 .equ __scl_bit=7 #endasm #include <i2c.h> #include <ds1307.h> #include <delay.h>

#define on 1 #define posisi_alarm 1 #define posisi_jam 0

#define sw_setting PIND.2

45

#define sw_alarm PIND.3 #define tombol_set PIND.4 #define tombol_down PIND.5 #define tombol_up PIND.6

#define shift_register_hi #define shift_register_lo

PORTB|=(1<<2) PORTB&=~(1<<2)

#define clock_register_hi #define clock_register_lo

PORTB|=(1<<1) PORTB&=~(1<<1)

#define serial_register_hi #define serial_register_lo

PORTB|=(1<<0) PORTB&=~(1<<0)

unsigned char jam, menit, detik; signed char jam_alarm,menit_alarm; eeprom unsigned char eep_jam_alarm, eep_menit_alarm; flash unsigned char font[]={ 0b11000000,//0 0b11111001,//1 0b10100100,//2 0b10110000,//3 0b10011001,//4 0b10010010,//5

46

0b10000010,//6 0b11111000,//7 0b10000000, 0b10010000, };

void clock_4094() { clock_register_hi; clock_register_lo; }

void kirimbyte4094(unsigned char dataled) { if (dataled & (1<<7)) serial_register_hi;else serial_register_lo; clock_4094(); if (dataled & (1<<6)) serial_register_hi; else serial_register_lo; clock_4094(); if (dataled & (1<<5)) serial_register_hi; else serial_register_lo; clock_4094(); if (dataled & (1<<4)) serial_register_hi; else serial_register_lo; clock_4094(); if (dataled & (1<<3)) serial_register_hi; else serial_register_lo; clock_4094();

47

if (dataled & (1<<2)) serial_register_hi; else serial_register_lo; clock_4094(); if (dataled & (1<<1)) serial_register_hi; else serial_register_lo; clock_4094(); if (dataled & (1<<0)) serial_register_hi; else serial_register_lo; clock_4094(); }

void tampil(unsigned char data0, unsigned char data1) { if (data0==255) { kirimbyte4094(255); kirimbyte4094(255); } else { kirimbyte4094(font[data0/10]); kirimbyte4094(font[data0%10]); } if (data1==255) { kirimbyte4094(255); kirimbyte4094(255);

48

} else { kirimbyte4094(font[data1/10]); kirimbyte4094(font[data1%10]); } shift_register_hi; delay_ms(10); shift_register_lo; }

void setting_alarm(void) { rtc_get_time(&jam,&menit,&detik); jam_alarm=eep_jam_alarm; menit_alarm=eep_menit_alarm; while(1) { tampil(255,menit_alarm); delay_ms(500); tampil(255,menit_alarm); delay_ms(400); if (tombol_up==0) {delay_ms(100); jam_alarm++;} if (tombol_down==0) {delay_ms(100); jam_alarm--;}

49

if (jam_alarm>23) jam_alarm=0; else if (jam_alarm<0)jam_alarm=23; if (tombol_set==0) {delay_ms(100); break;} } while(1) { tampil(jam_alarm,menit_alarm); delay_ms(500); tampil(jam_alarm,255); delay_ms(400); if (tombol_up==0) {delay_ms(100); menit_alarm++;} if (tombol_down==0) {delay_ms(100); menit_alarm--;} if (menit_alarm>59) menit_alarm=0; else if (menit_alarm<0)menit_alarm=59; if (tombol_set==0) {delay_ms(100); break;} } }

void setting_rtc(void) { signed char jam_set,menit_set; rtc_get_time(&jam,&menit,&detik); jam_set=jam;

50

menit_set=menit; while(1) { tampil(jam_set,menit_set); delay_ms(500); tampil(255,menit_set); delay_ms(400); if (tombol_up==0) {delay_ms(100); jam_set++;} if (tombol_down==0) {delay_ms(100); jam_set--;} if (jam_set>23) jam_set=0; else if (jam_set<0)jam_set=23; if (tombol_set==0) {delay_ms(500); break;} } while(1) { tampil(jam_set,menit_set); delay_ms(500); tampil(jam_set,255); delay_ms(400); if (tombol_up==0) {delay_ms(100); menit_set++;} if (tombol_down==0) {delay_ms(100); menit_set--;} if (menit_set>59) menit_set=0; else if (menit_set<0)menit_set=59; if (tombol_set==0) {delay_ms(500); break;}

51

} rtc_set_time(jam_set, menit_set, 0); }

void main(void) { unsigned char detik_now; DDRB=0xFF; PORTB=0x00; DDRD=0x01; PORTD=0xFE; i2c_init(); //rtc_init(0,0,0); while (1) { // Place your code here rtc_get_time(&jam,&menit,&detik); if (detik_now!=detik) {PORTB.3=0; delay_ms(400);} else PORTB.3=1; detik_now=detik; tampil(jam,menit); delay_ms(100); if (sw_alarm==on) { if (jam==jam_alarm && menit==menit_alarm && detik==0) {}

52

} if (tombol_set==0 && sw_setting==posisi_alarm) {delay_ms(500); setting_alarm();} if (tombol_set==0 && sw_setting==posisi_jam) {delay_ms(500); setting_rtc();} }; }

DAFTAR PUSTAKA

http://kontri-electronics.com/

53