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

Saturday, September 12, 2015

Arduino dan sensor PIR (Passive Infra Red)

Hampir semua benda yang memiliki suhu diatas nol mutlak (absolute zero) memancarkan energi panas dalam bentuk radiasi gelombang infrared sehingga mata manusia tidak dapat melihat secara langsung. Oleh karena itu digunakan sebuah sensor PIR atau passive infrared. Disebut passive karena sensor ini hanya mendeteksi pancaran infrared yang ada disekitarnya tanpa memancarkan radiasi apapun. Sensor ini cukup mudah ditemukan karena sifatnya yang murah, ukuran kecil, dan hemat daya.

Berikut ini merupakan bagian-bagian dari sensor PIR

Gambar tersebut menunjukan terdapat 3 konektor yang siap disambungkan dengan perangkat lain, 2 diantaranya adalah VCC dan Ground yang mana adalah positif dan negatif power suply untuk sensor, sensor ini bekerja pada tegangan 3-5VDC. 1 pin yang terletak ditengah merupakan output dari sensor. output sensor ini merupakan data digital yang akan bernilai HIGH jika mendeteksi pergerakan objek dan bernilai LOW jika tidak ada objek yang terdeteksi.

Untuk menguji kinerja Sensor ini, kita gunakan alat bantu untuk mengujinya yaitu Arduino board. pin output dari sensor, akan disambung dengan pin no 7 pada board Arduino. berikut ini program untuk pengujianya

void setup() {
  // put your setup code here, to run once:
    pinMode(7,INPUT_PULLUP);
    Serial.begin(9600);
    pinMode(13,OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
    if(digitalRead(7)==LOW){
        digitalWrite(13,LOW);
    }else{
        digitalWrite(13,HIGH);
    }
}

jika ada pergerakan disekitar sensor maka LED user pada board arduino akan menyala dan jika tidak akan tetap mati. Selamat mencoba