AVR Programlama – GPIO

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.

B portu DDR Register ı

Ö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.

B portu PORT register ı

Ö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.

B portu PIN register ı

Ö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.

One comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s