ah..cuma 2 angka ...eitt..jangan sepelekan...ini adalah penemuan paling brilian abad ke 20 yg memungkinkan kita bermain game , PC, internet blaa..blaaa....tanpa berlama-lama langsung kita goyang teory & operasi byte pada microcontroller dan bahasa C (win Avr)
"ingat , Micro AVR itu 8 bit ! , jadi semua data berpola 00000000-11111111"
Kita akan mengambil contoh AVR yg paling sering digunakan pada blog ini yaitu ATTINY 2313
ukuran memory FLASH (program) adalah 2kbyte (2048 byte), RAM 128 Byte dan EEPROM 128 byte juga.
Port input/output berjumlah 18 (Max) dengan register I/O A, B dan D (paling umum digunakan register I/O B & D)IO port B berjumlah 8 (PB0-PB7) dan D berjumlah 7(PD0-PB6) sedangkan portA jarang digunakan karena berhubungan dengan xtal dan reset.
Operasi byte berguna saat melakukan perubahan register, memory dan juga input output. Semisal kita ingin melakukan setting PORT D menjadi output semua, maka kita tuliskan di listing seperti ini :
DDRD=0b1111111;
atau
DDRD=0x7F;
atau
DDRD=127;
begimana kalo ingin membuat port D0 input, port D2 output port D6 output ...gampang ...kita bikin aja seperti ini :
DDRD=0b1000010;
tapi tiba-tiba ditengah tengah program, ada pin yg ingin kita ubah menjadi fungsi yg berbeda tanpa menghiraukan bit yg lainnya? sebenernya bisa aja kita pake cara yg tadi...tapi percaya deh, cara ini lebih gampang dan akan berguna suatu saat nanti
semisal....kita ingin hanya memperhatikan port D3 sebagai output , yg laen gua ga peduli ...begini caranya:
GESER YUKKK....
kita memanfaatkan angka 1 dimana 1 secara biner juga dipanggil 0b0000001. Jika kita ingin merubah port D3 sebagai output maka kita perlu menuliskan :
DDRD=0b0001000;
hubungan antara 0b0000001 dan 0b0001000 adalah bergesernya bit 1 dari paling kanan ke 3 posisi disebelah kiri. Secara aritmetika binner dan bahasa C , operasi ini dapat dipanggil dengan :
(1<<3)
artinya angka 1 digeser 3 kali ke kiri...dapet deh.. trus gimana jika kita ingin mengubah jadi input..ya sama aja kita geser aja nilai 0 ke kiri 3 kali (0 <<3) , tapi cara ini tidak elegan menurut para programmer.
nah ... operasi diatas hanya bisa dilakukan jika nilai yg laennya 0 dan dilakukan di awal inisialisasi program, jika dilakukan ditengah2, kita perlu melakukan operasi laen yaitu operasi exclusive or (XOR) dan negasi AND. Cara ini efektif jika kita ingin merubah suatu register di posisi selaen awal program (semisal berubah ditengah2)
semisal kita pengen ngidupin led di port 4 dan 6 aja, tanpa menghiraukan port laen, kita tulis seperti ini :
PORTD |=(1<<4) | (1<<6);
sedangkan jika kita ingin mematikan LED di port 2 & port 5 maka yg kita tulis seperti ini (cara ini yg disarakan):
PORTD &=~(1<<2) & ~(1<<3);
nah...hal ini berfungsi banget jika inisialisai register2 yg rumit didalam AVR, seperti contoh inisialisai timer berikut :
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
OCR1A = 62499; //compare the CTC A 1 sec
TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
jadi kita tidak pusing-pusing lagi menyusun bit satu persatu, hanya perlu mencari nama register yg perlu di on / off ( 1/ 0) kan ...beress dahhh...simple bukan ?
SELAMAT MENCOBA
Ohh jadi maksud penulisan (1<<3) dll dalam bahasa C itu begitu ya.. memangnya ngk ada perintah yang langsung merubah kondisi tiap Bit ya?
BalasHapusPantesan ane bingung sama bahasa C soalnya sudah terbiasa Assembly. kalo pake Assembly cukup satu perintah sederhana SETB dan CLR cukup.