bab 5 pengolahan input output

12
Modul Dasar Mikrokontroler | Beny Abdurrahman | 45 BAB V I/O ATMega16 ATMega16 dikemas dengan beberapa tipe, namun yang banyak digunakan dan mudah ditemui adalah tipe PDIP. Kemasan PDIP (Dual Inline Package) ini memiliki 40 kaki. Dimana terdiri dari 32 pin untuk input/output. Gambar susunan kaki ATMega16 bisa dilihat berikut : Port untuk Input dan Output dibagi menjadi 4 bagian yaitu PORT A, PORT B, PORT C dan PORT D. Keempat port tersebut merupakan jalur bi-directional yang dapat di program sebagai input maupun output melalui register. Berikut adalah register yang terkait dengan operasi I/O : DDRx – Data Direction Register PORTx – Pin Output Register PINx – Pin Input Register dimana x = nama port (A, B, C atau D) REGISTER Sebelum membahas lebih jauh, kita perlu mengenal apa yang disebut dengan register. Register adalah suatu memori di dalam CPU yang bisa diakses secara sering dan cepat. Register berkaitan dengan berbagai operasi dalam mikrokontroler. Sebuah register berukuran 1 byte dimana sama dengan 8 bit data. Bit No. 7 6 5 4 3 2 1 0

Upload: beny-abd

Post on 08-Jan-2017

505 views

Category:

Education


4 download

TRANSCRIPT

Page 1: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 45  

BAB V I/O ATMega16 ATMega16 dikemas dengan beberapa tipe, namun yang banyak digunakan dan mudah ditemui adalah tipe PDIP. Kemasan PDIP (Dual Inline Package) ini memiliki 40 kaki. Dimana terdiri dari 32 pin untuk input/output. Gambar susunan kaki ATMega16 bisa dilihat berikut :

Port untuk Input dan Output dibagi menjadi 4 bagian yaitu PORT A, PORT B, PORT C dan PORT D. Keempat port tersebut merupakan jalur bi-directional yang dapat di program sebagai input maupun output melalui register. Berikut adalah register yang terkait dengan operasi I/O :

• DDRx – Data Direction Register • PORTx – Pin Output Register • PINx – Pin Input Register

dimana x = nama port (A, B, C atau D) REGISTER Sebelum membahas lebih jauh, kita perlu mengenal apa yang disebut dengan register. Register adalah suatu memori di dalam CPU yang bisa diakses secara sering dan cepat. Register berkaitan dengan berbagai operasi dalam mikrokontroler. Sebuah register berukuran 1 byte dimana sama dengan 8 bit data.

Bit No. 7 6 5 4 3 2 1 0

Page 2: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 46  

upper nibble lower nibble 

Register DDRx Seperti yang telah dijelaskan sebelumnya, port dalam mikrokontroler adalah bidirectional dimana bisa diatur baik sebagai input maupun output. Untuk mengaturnya kita menggunakan bantuan register DDRx (Data Direction Register). Register DDRx 

Bit No.  7  6  5  4  3  2  1  0 

Nama  DDRx7  DDRx6  DDRx5  DDRx4  DDRx3  DDRx2  DDRx1  DDRx0 

Nilai  0  0  0  0  0  0  0  0 

‘x’ pada tabel diatas bisa diganti dengan nama port (A, B , C atau D). Sebagai contoh : DDRC = (1<<DDC0)|(1<<DDC4)|(1<<DDC5)|(1<<DDC7);

Penulisan di atas sama saja dengan

DDRC = 0b10110001;

atau

DDRC = 0xB1;

atau juga

DDRC = (1<<0)|(1<<4)|(1<<5)|(1<<7); Bagaimana jika ingin mengakses port B? Ganti x dengan B : DDRB = (1<<DDB0)|(1<<DDB4)|(1<<DDB5)|(1<<DDB7); atau dengan: DDRB = 0xB1; atau DDRB = 0b10110001; Sekarang coba kita lihat di port mikrokontrolernya, nilai 1 menjadikan port sebagai output dan 0 sebagai input. Pada gambar di samping, berarti pin PC7, PC5, PC4 dan PC0 telah diset sebagai Output. Sedangkan pin PC6, PC3, PC2 dan PC1 sebagai input. Pin input nantinya akan dapat membaca masukan logika baik itu high (1) atau low (0). Begitu juga untuk pin output akan dapat mengeluarkan logika 1 (tegangan = VCC/5v) dan 0 (tegangan = 0/Gnd).

Page 3: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 47  

PORTx Register

PORTx berfungsi untuk memberikan nilai keluaran pin Output, apakah berlogika 1 atau 0. Setelah pin di set menjadi output, kita bisa memberikan nilai logika baik 1 atau 0. Ilutrasi register PORTx :

Bit No.  7  6  5  4  3  2  1  0 

Nama  PORTx7  PORTx6  PORTx5  PORTx4  PORTx3  PORTx2  PORTx1  PORTx0 

Nilai  0  0  0  0  0  0  0  0 

Register ini sama dengan register DDRx, yang membedakan hanya namanya yaitu PORTx. Untuk penulisannya pun juga sama, mari kita lihat contoh di bawah ini :

PORTD = (1 << PD0)|(1 << PD3)|(1 << PD6); PORTD = (1 << 0)|(1 << 3)|(1 << 6); PORTD = 0b01001001; PORTD = 0x49;

Kita lihat contoh program :

DDRC = 0b10110001; PORTC = 0b10010001; OUTPUT = 0b10010001;

Port C diinisialisasi menggunakan DDRx register. Bit yang berwarna oranye menandakan sebagai pin output. Sekarang, mari berkonsentrasi pada bit berwarna oranye saja. Karena mereka adalah pin output, ketika diberi nilai '1' di PORT, pin akan berlogika HIGH (1), dan akan memberikan tegangan output VCC di pin itu.

Sekarang lihat contoh lain :

DDRC = 0b10110001; PORTC = 0b10010101; OUTPUT = 0b10010001;

Sekali lagi, bit berwarna oranye berarti adalah pin output. Jadi, apapun nilai (0 atau 1) yang diberikan pada bit oranye tersebut, hasilnya akan sama pada output. Sekarang, lihat bit berwarna merah. Meskipun kita memberi logika HIGH (1) di register PORTx, output yang keluar tetap bernilai LOW (0). Hal ini karena pin diinisialisasi sebagai pin input oleh DDRx. Oleh karena itu, PORTx tidak dapat mengubah nilai dari pin itu. Oleh karena itu, secara umum, PORTx tidak dapat memodifikasi properti dari pin yang diinisialisasi sebagai input oleh DDRx.

Page 4: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 48  

PINx Register

Register PINx memperoleh nilai dari membaca masukan/inputan pin mikrokontroler. Registernya adalah berikut :

Bit No.  7  6  5  4  3  2  1  0 

Nama  PINx7  PINx6  PINx5  PINx4  PINx3  PINx2  PINx1  PINx0 

Nilai  0  0  0  0  0  0  0  0 

Prosedur penulisan register PINx masih sama.

DDRC = 0b10110001; PINC = 0b01001011; INPUT = 0b01001011;

Di sini, bit berwarna sesuai dengan pin yang diinisialisasi sebagai input oleh DDRx. Pada baris kedua, PINx register didefinisikan. Nah, contoh ini hanya untuk menjelaskan konsep, dalam praktiknya kita selalu menggunakan PINx sebagai kondisi (seperti di IF atau WHILE loop). Sesuai pernyataan kedua, perintah PINx membaca nilai hanya pada pin input.

DDRC = 0b10110001; PINC = 0b01011010; INPUT = 0b01001010;

Di sini, Anda dapat membandingkannya dengan contoh yang saya miliki untuk PORTx. Karena bit berwarna merah adalah pin output, PINx tidak bisa mengubah nilainya. Oleh karena itu, secara umum, PINx tidak dapat memodifikasi properti dari pin yang diinisialisasi sebagai output oleh DDRx dan sebaliknya.

Contoh Program DDRC = 0x0F; PORTC = 0x0C; // asumsi tegangan 4v dialirkan ke PORTC.6 dan Vcc = 5V if (PINC == 0b01000000) PORTC = 0x0B; else PORTC = 0x00; Penjelasan :

o DDRC = 0x0f; setara dengan DDRC = 0b00001111; Ini berarti bahwa pin PC0 - PC3 adalah pin output (dapat dimanipulasi menggunakan PORTC) dan pin PC4 ... PC7 yang pin input (yang kadarnya menentukan nilai pinc).

Page 5: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 49  

o PORTC = 0x0C; setara dengan PORTC = 0b00001100; Ini berarti bahwa pin PC2 dan PC3 memiliki tegangan HIGH (Vcc = 5V) dan pin PC0 dan PC1 memiliki tegangan LOW (0V). Pin lainnya memiliki tegangan rendah secara default.

o if (pinc = 0b01000000) memeriksa tegangan input pada pin PC6. Karena itu disebutkan dalam komentar yang 4V sebuah dipasok ke PORTC.6 (sama seperti pin PC6), kondisi ini benar (seperti 4> 2,5, di mana 2.5V adalah ambang batas, 5/2 = 2,5).

o Karena kondisi if : benar, PORTC = 0x0B; dijalankan. o Jika kondisi if tidak terpenuhi, PORTC = 0x00; akan dieksekusi.

Page 6: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 50  

Program menyalakan led Sebelum memrogram led, kita harus melihat skematik rangkaian untuk bisa menentukan apakah led akan menyala atau mati ketika diberikan logika 1/0. Ada beberapa tipe kerja rangkaian untuk mengaksesnya, yaitu Aktif LOW dan Aktif High. Aktif LOW merupakan kerja rangkaian yang dapat dioperasikan/di –ON –kan dengan diberi logika rendah (“0”/0). Sedangkan Aktif HIGH merupakan kerja rangkaian yang dapat dioperasikan/di-ON-kan dengan diberi logika tinggi (“1”/+5V). Berdasarkan skematik dari kerja rangkaian diatas dapat digambarkan sebagai berikut:

Penulisan skrip bisa dilakukan secara hexa maupun biner, dengan keterangan penjelasan bisa dilihat di tabel :

Contoh penulisan skrip di atas, untuk hexa 0x0F sama saja penulisannya dengan biner 0b00001111, yang berarti bahwa bit0 – bit3 mendapatkan logika high (tegangan vcc / 5 volt) dan bit4 – bit7 mendapat logika low, yaitu tegagan 0 volt / ground. Gambar rangkaian untuk praktikum di bawah :

Page 7: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 51  

1. Menyalakan semua led bersama #include <avr/io.h> int main(void){ DDRA=0xFF; //Port A0-7 sebagai output, penulisanya sama saja dengan : 0b11111111 while(1){ PORTA=0b00000000; //bisa ditulis 0x0F

//berarti port A mengeluarkan tegangan 0 / GND //sehingga led akan menyala

} } 2. Led 1 On, Led 2 Off, Led 3 On, Led 4 Off, Led 5 On, Led 6 Off, Led 7 On, Led 8 Off

#include <avr/io.h> int main(void){ DDRA=0xFF; //Port A0-7 sebagai output, penulisanya sama saja dengan : 0b11111111 while(1){ PORTA=0b01010101; } }

3. Program Led Kedip #include <avr/io.h> #include <util/delay.h> //memasukan library delay int main(void){ DDRA=0xFF; //Port A jadi Output, bisa ditulis -> 0b11111111 while(1){ PORTA=0b11111111; // LED MATI _delay_ms(120); // jeda 0.12 detik PORTA=0b00000000; // led HIDUP _delay_ms(150); // jeda 0.15 detik dan akan balik ke atas } }

Page 8: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 52  

4. Program Menyalakan Geser Kanan

#include <avr/io.h> #include <util/delay.h> //memasukan library delay int main(void){ DDRA=0xFF; //Port A jadi Output, bisa ditulis -> 0b11111111 while(1){ PORTA=0b11111110; _delay_ms(120); PORTA=0b11111101; _delay_ms(150);

PORTA=0b11111011; _delay_ms(120); PORTA=0b11110111; _delay_ms(150); PORTA=0b11101111; _delay_ms(120); PORTA=0b11011111; _delay_ms(150);

PORTA=0b10111111; _delay_ms(120); PORTA=0b01111111; _delay_ms(150); } }

5. Latihan

1. Buatlah program untuk menyalakan LED geser bergantian kekiri! 2. Buatlah program untuk menyalakan LED geser bergantian kekanan -kekiri!

Page 9: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 53  

Progam Input dengan Push Button Pada topik sebelumnya sudah dikenalkan cara meng-akses port sebagai keluaran, sehingga selanjutnya pada topik ini akan digabung dengan masukan atau input. Masukan untuk mikrokontroler bisa dari saklar, sinyal logika, atau rangkaian lain yang memiliki keluaran. Sebagai dasar mempelajari masukan pada mikrokontroler, pada topik ini akan digunakan saklar/button sebagai masukannya. Mendefinisikan Port Sebagai Input Cara mendefinisikan PORT sebagai inputan digunakan skrip berikut : DDRB =0b00000000; //Semua 8 bit pada PORTB berfungsi sebagai masukan //Bisa ditulis --> DDRB =0x00; Kita juga bisa mengeset beberapa pin saja yang menjadi masukan contoh : DDRB =0b11110000; //PinB0-3 sebagai masukan, PinB4-7 sebagai keluaran //Bisa ditulis --> DDRB =0xF0; Pengambilan Data Input / Masukan Rangkaian masukan ke mikrokontroler kebanyakan mengambil prinsip falling edge sebagai sinyal tanda aktif, atau bisa dikatakan memiliki logika aktif jika sinyal masukannya rendah (low). Apabila terhubung dengan sebuah masukan dari saklar/button, maka saklar saat tertutup terhubung dengan ground (Gnd). Sebaliknya, apabila saklar dalam kondisi terbuka akan mempertahankan logika tinggi (high) pada masukan, dikarenakan terdapat resistor pull up yang menjaga jalur data masukan dalam kondisi tinggi. Walaupun dalam pengaturan kondisi masukan sudah di pull up, akan tetapi untuk mengamankan kondisi datanya , maka akan dipasang resistor pull up lagi di luar pada system minimum. Berikut ilustrasi skematiknya;

Page 10: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 54  

Instruksi yang digunakan untuk mengambil data masukan adalah dengan menggunakan register PINx (seperti telah dijelaskan pada materi sebelumnya), Berikut penjabaran penulisan program untuk membaca sinyal data dari luar :

PINA == 0b11111101; Penjelasan : pada PORTA bit 1 berlogika rendah (terdapat sinyal masukan), bit 0 dan bit 2-7 berlogika 1 (tidak terdapat sinyal masukan)

Instruksi program masukan PIN biasanya digunakan bersamaan dengan dengan intruksi syarat pada bahasa C. Salah satunya yaitu penggunaanya bersama instruksi “IF”, berikut contohnya;

if(PINA==0b11111101) { …….. (aksi yang dilakukan) };

Atau pada perulangan “while”;

while(PINA==0b11111101) { …….. (aksi yang dilakukan berulang-ulang) };

Penggunaan symbol “==” (sama dengan dua kali), mempunyai fungsi sebagai pertanyaan kondisi pada PIN yang dituju. Apakah kondisi PIN masukan dalam kondisi rendah atau pada kondisi tinggi. Sedangkan untuk mengetahui hasil dari pembacaan masukan program masukan (INPUT) digabung dengan program keluaran (OUTPUT). Contoh rangkaian :

Page 11: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 55  

Penjelasan rangkaian : pada rangkaian di atas, tombol berada di PORTB yaitu di PB0-PB3 maka untuk pendefinisian port B sebagai input adalah : DDRB=0b11110000; atau DDRB=0xF0; Kemudian berikan kondisi awal / default port dengan nilai 1 pada PB0-PB3 : PORTB=0b11111111; atau PORTB=0xFF; Contoh program : 1. Tombol untuk menyalakan 1 lampu

Skrip berikut ini akan menghasilkan program : Ketika tombol ditekan, lampu C0 akan menyala, sementara ketika dilepaskan, lampu akan mati. #include <avr/io.h> #include <util/delay.h> int main(void){ DDRB=0xF0; //PORTB0-3 jadi Input, PORTB4-7 jadi output DDRC=0xFF; //PORTC sebagai Output PORTB=0xFF; //Tombol default mendapat nilai 1 PORTC=0xFF; //LED Default Mati while(1){ if(PINB==0b11111110) //Jika SW1 ditekan { PORTC=0b11111110; // PORT C0 lampu menyala } else //kondisi jika tombol tidak ditekan / dilepas { PORTC=0b11111111; //PORT C lampu mati (bisa ditulis 0xFF) } } }

2. Dua Tombol, tombol 1 untuk menghidupkan dan tombol 2 untuk mematikan Saklar Sw1 untuk menghidupkan LED, Saklar Sw2 untuk mematikan LED ... ... if(PINB==0b11111110) //Jika SW1 ditekan { PORTC=0b11111110; // PORT C0 lampu menyala } if(PINB==0b11111101) //Jika SW2 ditekan { PORTC=0b11111111; //PORT C lampu mati (bisa ditulis 0xFF) } ..

Page 12: Bab 5  Pengolahan Input Output

Modul Dasar Mikrokontroler | Beny Abdurrahman    | 56  

3. Tombol untuk menghidupkan led bergeser if(PINB==0b11111110) //Jika SW1 ditekan { PORTC=0b11111110; // PORT C0 lampu menyala _delay_ms(500); PORTC=0b11111101; // PORT C1 lampu menyala _delay_ms(500); PORTC=0b11111011; // PORT C2 lampu menyala _delay_ms(500); ......seterusnya }

4. Tombol untuk mengakses beberapa port #include <avr/io.h> #include <util/delay.h> int main(void){ DDRA=0xFF; //PORTA sebagai Output DDRB=0xF0; //PORTB0-3 jadi Input, PORTB4-7 jadi output DDRC=0xFF; //PORTC sebagai Output DDRD=0xFF; //PORTD sebagai Output PORTA=0xFF; PORTB=0xFF; //Tombol default mendapat nilai 1 PORTC=0xFF; //LED Default Mati PORTD=0xFF; while(1){ if(PINB==0b11111110) //Jika SW1 ditekan { PORTA=0b11111110; // PORT A0 lampu menyala } if(PINB==0b11111101) //Jika SW2 ditekan { PORTC=0b11111110; // PORT C0 lampu menyala } if(PINB==0b11111011) //Jika SW3 ditekan { PORTD=0b11111110; // PORT D0 lampu menyala } if(PINB==0b11110111) //Jika SW4 ditekan (Led A dan C geser) { PORTA=0b11111110; // PORT A0 lampu menyala

PORTC=0b11111110; // PORT C0 lampu menyala _delay_ms(500);

PORTA=0b11111100; // PORT A0,A1 lampu menyala PORTC=0b11111100; // PORT C0,C1 lampu menyala _delay_ms(500); .....seterusnya

} } }