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.
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 :
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
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 :
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 :
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.
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);
}
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.
- 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.
- 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.
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;
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