RSS

AKSES INPUT OUTPUT (I/O) AVR

13 Apr

Pada dasarnya untuk mengakses I/O (input output) AVR ada beberapa register yang harus disetting terlebih dahulu, yaitu:

1. Data Register (PORTx)

2. Data Direction Register (DDRx) dan

3. Port Input Pin (PINx)

DDRx digunakan untuk mendefinisikan port sebagai input atau output, Jika level logika pada register DDR bernilai 1 maka Port tersebut dikonfigurasikan sebagai Output. Sedangkan jika level logika pada register DDR bernilai 0 maka Port tersebut dikonfigurasikan sebagai input.

Contoh: DDRA=0xff → maka Port A sebagai Output

00 hh  0DDRA=0x00 → maka Port A sebagai Input

PORTx digunakan untuk mengeluarkan nilai dari port yang digunakan.

Contoh: PORTB=0xff → maka Port B = 11111111 (biner)

0mm  00PORTB=0xa3 → maka Port B = 10100011 (biner)

PINx digunakan untuk mengambil/membaca data dari port mikrokontroler, saat dikonfigurasikan sebagai input.

PORTx digunakan untuk mengeluarkan/menulis data ke port mikrokontroler, saat dikonfigurasikan sebagai output.

Untuk lebih mengerti tentang register DDRx, PORTx dan PINx. Perhatikan gambar dibawah ini.

Menyalakan LED (Mengeluarkan data ke PORT)

Pada aplikasi ini saya akan menyalakan LED yang dihubungkan ke PORTA. Caranya adalah teman-teman harus menentukan terlebih dahulu PA0-PA2 sebagai output (melalui DDRA), kemudian memberikan logika high pada PA0-PA3 (melalui PORTA) sebagai kondisi awal LED mati. Untuk menyalakan LED maka teman-teman harus memberikan logika LOW pada PA0-PA2.

DDRA=0x07;//PA0-PA2 dikonfigurasikan sebagai output, lainnya input
PORTA=0xff;//memberikan logika high untuk PA, agar kondisi awal LED mati
While (1)
{
PORTA=0xf8;//memberikan logika low untuk PA0-PA2, lainnya high, agar LED menyala semua
}

atau

DDRA=0x07;//PA0-PA2 dikonfigurasikan sebagai output, lainnya input
PORTA=0xff;//memberikan logika high untuk PA, agar kondisi awal LED mati
While (1)
{
PORTA.0=0;//memberikan logika low untuk PA0, agar LED di PA0 dapat menyala
PORTA.1=0;//memberikan logika low untuk PA1, agar LED di PA1 dapat menyala
PORTA.2=0;//memberikan logika low untuk PA2, agar LED di PA2 dapat menyala
}

Mendeteksi Push button (Membaca data dari PORT)

Pada aplikasi ini saya akan mendeteksi push button yang dihubungkan ke PORTC. Caranya adalah teman-teman harus menentukan terlebih dahulu PC0-PC2 sebagai input (melalui DDRC), kemudian memberikan logika high pada PC0-PC3 (melalui PORTC) sebagai kondisi awal. Ketika nanti terjadi penekanan tombol maka PIN tombol tersebut akan terhubung ke GND (berlogika LOW).

DDRC=0xf8;//PC0-PC2 dikonfigurasikan sebagai input, lainnya output
PORTC=0xff;//memberikan logika high untuk PC, sebagai kondisi awal
While (1)
{
if  (PINC.0==0)//mendeteksi tombol PC0
    {
    //ketikkan program disini sebagai aksi penekanan tombol PC0
    }       
if  (PINC.1==0)//mendeteksi tombol PC1
    {
    //ketikkan program disini sebagai aksi penekanan tombol PC1
    }
if  (PINC.2==0)//mendeteksi tombol PC2
    {
    //ketikkan program disini sebagai aksi penekanan tombol PC2
    }
}

Berikut beberapa program yang sering digunakan dalam mengakses I/O dan schematic untuk mengakses I/O AVR yang terdiri dari LED dan Push Button.

Berikut adalah beberapa program untuk menyalakan LED, running LED, dan Penekanan push button.

#include <mega8535.h>
#include <delay.h>

unsigned char kiri=0b00000001, kanan=0b10000000;

void nyala_led() //menyalakan led selama 0.5 detik kemudian dimatikan
{
PORTA = 0xffh
delay_ms(500);
PORTA = 0x00;
}

void geser_led_kanan() //fungsi untuk menggeser led berjalan kearah kanan
{
if (kanan ==0b00000001) kanan = 0b10000000;
else kanan >>= 1;
PORT_led = kanan;
delay_ms(500);
}

void geser_led_kiri()  //fungsi untuk menggeser led berjalan kearah kiri
{
if (kiri==0b10000000) kiri = 0b00000001;
else kiri <<= 1;
PORT_led = kiri;
delay_ms(500);
}

void tekan_tombol_led_nyala() //jika tombol PORTBx ditekan maka akan menyalakan led pada PORTAx
{
PORTA = PINB;
}

void main(void)
{
PORTA = 0xff; //Port A diberikan logika high atau LED mati
DDRA = 0xff; //port A sebagai output

PORTB = 0x0f; //PB.7-4 logika low, PB3-0 logika high
DDRB = 0x00; // port B sebagai input

while(1)
{
//disini adalah program utama tinggal memanggil fungsi diatas saja, sebagai contoh jika kita ingin menggeser nyala led kekiri kita tinggal panggil fungsi seperti dibawah ini
geser_led_kiri() ; // pemanggilan fungsi
};
}

 
2 Comments

Posted by on April 13, 2011 in Tutorial AVR

 

Tags: , , , , ,

2 responses to “AKSES INPUT OUTPUT (I/O) AVR

  1. Achilles

    June 24, 2011 at 12:38

    Mas, saya sudah coba program diatas. itu yang geser yang mati ya. kalo yang geser yang hidup gimana programnya ? saya sudah coba tapi gak bisa.

     
    • ElectrO-cOntrOl Team

      June 24, 2011 at 14:25

      tinggal dibalik aja logikanya seperti ini:

      unsigned char kiri=0b11111110, kanan=0b11111110;

      void geser_led_kanan() //fungsi untuk menggeser led berjalan kearah kanan
      {
      if (kanan ==0b11111110) kanan = 0b01111111;
      else kanan >>= 1;
      PORT_led = kanan;
      delay_ms(500);
      }

      void geser_led_kiri() //fungsi untuk menggeser led berjalan kearah kiri
      {
      if (kiri==0b11111110) kiri = 0b01111111;
      else kiri <<= 1;
      PORT_led = kiri;
      delay_ms(500);
      }

       

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: