• LinkedIn
  • Join Us on Google Plus!
  • Subcribe to Our RSS Feed

Kamis, 01 Oktober 2015

Mengakses PORT I/O pada AVR

08.23 // by Imam Firmansyah // No comments

WinAVR


WinAVR merupakan kumpulan tools software untuk pemograman mikrokontroler AVR open source di  OS Microsoft Windows. kumpulan tools software tersebut meliputi: Teks Editor dengan Programmers Notepad, MFile software untuk membuat file Makefile,  compiler C untuk AVR menggunakan AVR-GCC dan Avrdude software untuk meng-upload file hex ke dalam memory flash mikrokontroler. berikut pemograman basic AVR dengan AVR-GCC.


Pemograman Basic I/O 

Setiap port pada mikrokontroler AVR dapat ditulis dan dibaca. sebuah port pada mikrokontroler umumnya mempunyai 8 (delapan) I/O atau PIN, dimana tiap I/O atau PIN dinamakan dengan nama PORT.no urut pin. contoh pada ATmega8535 mempunyai 4 port yaitu PORTA, PORTB, PORTC dan PORTD. pada PORTA mempunyai 8 I/O atau PIN yaitu PORTA.0 (PA0), PORTA.1 (PA1), PORTA.2 (PA2) sampai dengan PORTA.7 (PA7) dan begitu pula dengan PORT yang lain. berikut gambar dari susunan mikrokontroler AVR ATmega 8535.

setiap  PORT pada mikrokontroler AVR mempunyai tiga register yaitu DDRx, PORTx, dan PINx,

DDRx

DDRx merupakan register 8 bit yang mengatur arah dari port mikrokontroler apakah port mikrokontroler tersebut digunakan sebagai input atau output. jika ditulis 1 (satu) atau High maka PORTx tersebut akan menjadi keluaran atau output. sebaliknya jika ditulis 0 (nol) atau Low maka PORTx tersebut akan menjadi input. berikut adalah contoh

jika 4 bit lower pada PORTB digunakan sebagai input dan 4 bit upper digunakan sebagai output maka nilai susunan register DDRB yaitu :

DDRB = 0b11110000

0b diatas menyatakan bahwa format nilai adalah format biner. jika dalam format hexa maka

DDRB = 0xf0
0x menyatakan format hexa.

jika ingin menset hanya PIN tertentu saja dari PORT, misal hanya PORTB.5 saja yang ingin diset menjadi output atau memberikan nilai 1(satu) atau High, maka dapat dilakukan perintah shift seperti berikut:

DDRB |= ( 1<<5)

artinya perintah diatas adalah nilai DDRB di OR kan dengan nilai 1 (dalam biner 0000 0001) yang digeser 5 kali ke kiri, sehingga menjadi 0010 0000 hasilnya disimpan pada register DDRB. perintah ini akan memaksa bit ke 5 dari DDRB menjadi nilai 1 (satu) atau High.

untuk menyederhanakan perintah, dalam header avr/io.h terdapat macro _BV(x) yang sama dengan perintah (1<<x) sehingga perintah diatas dapat disederhanakan dengan peritnah dibawah ini :

DDRB |= _BV(5)

jika ingin memberikan nilai 0 (nol) atau low pada PIN tertentu dapat digunakan teknik shift seperti berikut :

DDRB &= ~(1<<5)

artinya adalah nilai DDRB akan di ANDkan dengan nilai 1101 1111 didapat dengan menggeser nilai 1 kekiri tiga kali kemudian meng inversekannya. 

1 => 0000 0001 
(1 << PB5) => 0010 0000
~(1 << PB5) => 1101 1111

dengan menggunakan macro _BV(x) maka dapat disederhanakan seperti berikut :

DDRB&= ~_BV(5)


PORTx

PORTx merupakan register yang mempunyai dua fungsi tergantung port tersebut digunakan sebagai input atau output.
  1. jika digunakan sebagai input, maka memberi nilai 1 (satu) atau High pada register ini akan mengaktifkan Resistor Pull up pada Port, sebaliknya jika memberikan nilai 0 (nol) atau Low resistor pull up tidak diaktifkan. 
  2. jika digunakan pada port yang diset seebagai output, maka fungsinya yaitu untuk memberikan nilai keluaran jika diberi nilai 1 (satu) atau High maka output keluaran port tersebut akan High atau akan keluar tegangan sekitar +5V , sebaliknya jika memberi nilai 0 (nol) atau Low pada register ini akan memberikan keluaran low atau memberi tegangan nol volt atau memberikan jalur ground.
cara pemograman untuk memberi nilai ke register ini sama dengan cara memberikan nilai ke DDR diatas. berikut adalah contoh memberikan nilai ke PORTB

PORTB = 0b11111111 (dalam biner) sama dengan PORTB = 0xff (dalam hexa)  sama dengan PORTB = 255 (dalam dec)

pemograman per bit PORTx dapat dilakukan sama dengan DDRx diatas. contoh untuk memberikan PORTB.3 bernilai High dapat dilakukan dengan cara berikut :

PORTB |= _BV(3)

atau jika ingin membuat nilai nol atau low ke PIN tertentu. contoh untuk memberikan nilai PORTA.3 menjadi nol atau low, yaitu dapat dilakukan dengan cara berikut :

PORTA &= ~_BV(3)

PINx

PINx merupakan register yang digunakan untuk membaca nilai PORT dalam mikrokontroler. register ini umumnya digunakan untuk membaca keadaan suatu PORT atau PIN pada PORT di mikrokontontroler yang umumnya terhubung ke sebuah sensor atau inputan push button atau tombol yang lain. cara penggunaannya langsung dapat dimasukan ke sebuah variabel berukuran 8 bit. berikut contoh penggunaan register PINx untuk membaca nilai pada PORT.

unsigned char dataMasukanPortA;
dataMasukanPortA = PINA;

variabel dataMasukanPortA akan berisi nilai yang terdapat pada PORTA.

untuk pengecekan perPIN dari sebuah PORT dapat digunakan fungsi bit_is_clear(PINx, n) untuk mengecek sebuah PIN bernilai nol atau low atau bit_is_set(PINx, n).

contoh penggunaan yaitu sebagai berikut :

if (bit_is_clear(PINC, 7)  => untuk mencek apakah PIN di PORTC.7 bernilai low atau tidak
{
PORTB |= _BV(2);     => jika PIN di PORTC.7 bernilai low makan PORTB.2 akan diberi nilai High
}

atau penggunaan bit_is_set seperti dibawah ini

while (bit_is_set(PINB, 6)   => untuk mencek apakah PIN di PORTB.6 bernilai high atau tidak
{
PORTA |= _BV(3)
 _delay_ms(300);                                                  
PORTA &=~_BV(3)
_delay_ms(300);
}

0 komentar:

Posting Komentar