Senin, 27 Juni 2011

MENGAKSES INPUT OUTPUT (I/O) AVR

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=0×00 → maka Port A sebagai Input

PORTx digunakan untuk mengeluarkan/menulis data ke port mikrokontroler, saat dikonfigurasikan sebagai output.
Contoh: PORTB=0xff → maka Port B = 11111111 (biner)
0m m  0 PORTB=0xa3 → maka Port B = 10100011 (biner)

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

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=0×07;//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=0×07;//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 = 0×00;
}

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 = 0×00; // 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
};
}

13 komentar:

  1. bagaimana jika tombol ditekan led menyala dan ketika dilepas led masih menyala? gimana programnnya dengan bahasa c? terima kasih

    BalasHapus
  2. if (PINC.0==0)//mendeteksi penekanan tombol PC0
    {
    PORTA.0=0;//memberikan logika low untuk PA0, agar LED di PA0 dapat menyala
    }
    else //tombol dilepas
    {
    PORTA.0=1;//memberikan logika high untuk PA0, agar LED di PA0 dapat mati
    }

    BalasHapus
  3. terima kasih ilmunya, sangat bermanfaat sekali...

    BalasHapus
  4. bagaimana kalo kita ingin inputannnya tegangan analog dan displaynya dengan LED??
    jadi jika tegangan 2 volt,led yang menyala nomer mana saja??
    terimkasih sebelumnya

    BalasHapus
  5. mas mau tanya, buat input berasal dari keluaran relay normali close dan normali open , gmna yak cara ngakali programnya....??

    BalasHapus
  6. mas kalo tuk sistem traffic light pada lampu lalu lintas beserta timernya gmn mas???

    BalasHapus
  7. gan da g' cv avr untuk windows7 64 bit...?

    BalasHapus
  8. mas mau tanya software buat program umtuk windows 7 64 bit apa...? kalau di xp kan bisa pake cv avr

    BalasHapus
  9. @anto: coba anda pakai software CVAVR terbaru.. silakan download pada menu free software

    BalasHapus
  10. mas mw nanya kl kyk gini gmn : jika pinb.1 di tekan maka porta nyala terus jika ditekan lagi baru bisa mati, trus di tekan lagi porta nyala lagi begitu seterusnya,,

    BalasHapus
  11. mas mau nanya kalau misalnya ada 4 tombol dg 8 led, trus klau satu tombol dtekan delay nya nambah, tombol 2 ditekan nambh lagi dan strusnya, itu gmana?

    BalasHapus
  12. thanks gan atas ilmunya,
    http://elektrotips.blogspot.com

    BalasHapus