Intellectual Discourse Business in Islamic Perspective - Mej Dr Mohd Adib Abd...
Bab 5 Pengolahan Input Output
1. 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
2. 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).
3. 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.
4. 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).
5. 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.
6. 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 :
7. 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
}
}
8. 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!
9. 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;
10. 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 :
11. 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)
}
..
12. 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
}
}
}