About

Ahmad Edi Saputra

Wednesday, September 23, 2015

WinAVR GPIO (menulis library seperti arduino) ATMega32

GPIO sebenarnya merupakan dasar yang simple dari sebuah mikrokontroler, pengaksesan GPIO bisa dibilang seperti "hello world!"-nya setiap bahasa pemrograman. Dengan arti lain, setidaknya kita harus mengenal GPIO untuk mulai bermain dengan mikrokontroler. Pengaksesan GPIO sendiri cukup mudah, misalnya pada ATMega32 hanya perlu mengatur pin sebagai input atau output dan menulis logika pada pin IO tersebut dengan DDRx = 0xFF untuk output atau DDRx=0x00 sebagai input, PORTx=0xFF(5V) untuk logika tinggi atau PORTx=0x00 untuk logika rendah(0V).  lalu bagaimana agar pemrograman kita dapat terkesan lebih profesional dan dapat digunakan kembali dilain waktu? bagaimana jika kita tidak ingat perbedaan DDRx dan PORTx?

Logika dasarnya register DDRx, PORTx, dan PINx juga memiliki alamat register, jadi inilah yang seharusnya kita simpan kedalam library yang akan kita buat. berikut ini contoh register ATMega32
Selanjutnya karena ATMega32 memiliki 32 pin IO maka buatlah kedalam sebuah array yang setiap 8 byte menyimpan alamat registernya. untuk lebih mudahnya, susun sesuai dengan mapping IO ATMega32 (DIP Package) sehingga akan berurutan PORTB, PORTD, PORTC, PORTA. sehingga array untuk register DDR akan menjadi 
const uint8_t DDRx[32]={
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, //DDRB
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, //DDRD
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, //DDRC
0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,//DDRA
};
const uint8_t PORTx[32]={
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,//PORTB
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,//PORTD
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,//PORTC
0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,//PORTA
};
 Setelah mendapatkan array dari register, dua fungsi yang harus di ketahui yaitu _BV(x) dan _SFR_IO8(registerAddress), dua fungsi ini biasanya dipakai pada macro sbi(register,bit) dan cbi(register,bit). oleh karena itu fungsi yang akan dibuat kurang lebih akan sama dengan sbi dan cbi. berikut fungsi pinMode(pinNumber,modePin).

#define INPUT 0
#define OUTPUT 1
#define INPUT_PULLUP
void pinMode(uint8_t pin, uint8_t mode){
uint8_t num_pin = pin%8;
if(mode==OUTPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))|=_BV(num_pin);
}else if(mode==INPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
}else{
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
_SFR_BYTE(_SFR_IO8(PORTx[pin]))|=_BV(num_pin);
}
}

No comments :

Post a Comment