GPIO (Genral Purpose Input Output) birimi ismindende anladığımız üzere genel amaçlı giriş çıkış işlemleri yapmamızı sağlayan çevre birimidir. GPIO birimini kullanarak bir pin çıkış olarak tanımlanmışsa o pin, lojik 1 veya lojik 0 yapılabilir. Bunun yanı sıra bir pin giriş olarak tanımlandıysa o pinden lojik 1 veya lojik 0 değerleri okunabilir.
Atmega328p de B, C ve D olmak üzere üç adet giriş çıkış portu vardır.
GPIO Registerları
Atmega328p de GPIO birimine ait 3 adet temel register vardır. Bunlar DDR, PORT ve PIN Registerlarıdır. DDR Register’ı ile bir pini veya portu giriş ya da çıkış olarak ayarlama işlemi yapılır. Port register’ı ile çıkış olarak ayarlanmış bir pininin lojik seviyesi belirlenir. PIN Register’i ile ise giriş olarak tanımlanmış bir pinin lojik seviyesi okunur.
DDRx : DDR (Data Direction Register) Register’ı bir pini veya portu dijital giriş veya çıkış olarak ayarlamamızı sağlar. Bir pini çıkış olarak ayarlamak istiyorsak DDR registerındaki ilgili biti ”1” giriş olarak ayarlamak istiyorsak ilgili biti ”0” yapmamız gerekir.

Örneğin; PB4 pinini çıkış yapmak için DDRB registerının 4. bitini ‘1’ yapmalıyız ve yazacağımız kod “DDRB |= (1<<4);” dur. Aynı pini giriş yapmak için ise “DDRB &= ~(1<<4);” kodu ile 4.biti ‘0’ yaparız.
PORTx : PORT Registeri ile dijital çıkış olarak ayarladığımız bir pinin lojik durumunu belirleriz. Bir pini lojik 1 yapmak için PORT Registerı’nda ilgili biti 1 yaparız. Aynı şekilde lojik 0 yapmak içinde ilgili biti 0 yaparız.

Örneğin; PB3 pinini lojik 1 yapmak için yazacağımız kod “PORTB |= (1<<3);” dur.
PINx : PIN registerı ile dijital giriş olarak ayarladığımız bir pinin lojik seviyesini kontrol ederiz. Eğer bir pine lojik 1 uygulanırsa ilgili bit 1 olarak okunur.

Örneğin; B portunun 5 numaralı pinin durumunu kontrol edelim.
((PINB & (1<<5)) == (1<<5)) eğer pine uygulanan voltaj lojik 1 ise bu parantez içi 1 dönderecektir.
GPIO Buton Led Uygulaması(polling)
define F_CPU 16000000UL // CPU çalışma frekansını belirledik
include<avr/io.h>
int main(void)
{
DDRC &= ~(1<<5);
// PC5 pini giriş olarak ayarlandı
DDRB |= (1<<1);
// PB1 pini çıkış olarak ayarlandı
while(1)
{
while (PINC & (1<<5) == (1<<5)) // PB5 pininden 1 okunduğu zaman girilen döngü
{
PORTB &= ~(1<<1); // PB1 lojik 0 yapıldı
}
PORTB |= (1<<1); // PB1 lojik 1 yapıldı
}
}

Buton giriş pinine harici bir pull-up direnci ile bağlanmıştır. Yani butona basılmadığı zaman pine 5V ( lojik 1 ) sinyali gitmektedir. Butona basıldığında ise pin doğrudan GND’ye bağlanacağından lojik 0 olacaktır.
Not: Bu uygulamada buton durumunu kontrol etmek için yoklama (Polling) metodunu kullandık. Bir sonraki yazımda kesme (İnterrupt) kullanarak aynı örneği yapacağım.
Eline sağlık çok yararlı bir paylaşım olmuş
LikeLike