Arduino(Atmega) Port İşlemleri ( Port Manipülasyonu )

30Oca, 2016

Merhaba,

Arduino veya atmel mikrodenetleyicileriniz üzerinde aynı anda birden çok porta veri göndermek veya onlardan aynı anda veri okumak isteyebilirsiniz.

Bu tür durumlarda port işlemleri devreye girer.

Arduino Uno üzerindeki Atmega328 mikrodenetleyicisi dikkate alarak bakacak olursak;

atmega328

Atmega 328’de B , C ve D olmak üzere 3 adet port bulunmaktadır.

Bize digital input/output şeklinde 1 ile 13 arasındaki numaralarla veya A0 – A5 arası pinlerle gösterilen bu entegrede aslında B , C ve D portları bulunur.

Bu portların kontrolü bazı registerlarla sağlanır.

DDRD – PORTD’nin giriş/çıkış belirleme registerı
PORTD – PORTD’ye veri yazma ve okuma için kullanılan register

DDRC – PORTC’nin giriş/çıkış belirleme registerı
PORTC – PORTC’ye veri yazma ve okuma için kullanılan register

DDRB – PORTB’nin giriş/çıkış belirleme registerı
PORTB – PORTB’ye veri yazma ve okuma için kullanılan register

Örneğin PORTD’nin tüm pinlerinden tamamen dijital Çıkış yapılacaksa ;(örneğin hepsinden led, motor veya röle çalışacak)

DDRD=B11111111

Tüm PORTD pinleri giriş olacaksa (Örneğin hepsinden buton veya sensör okunacak)

DDRD=B00000000

Bu register bizim tek tek yazdığımız pinMode komutlarının yerini almaktadır 🙂

Örnek : PORTC’nin 1 2 ve 3 nolu pinleri giriş, diğer pinleri çıkış olarak tanımlanacaktır.

DDRC = B11110001 yazılır 🙂

DDR belirlemeleri void setup() Kısmında yapılacaktır. Dikkat edelim.

Şimdi gelelim belirlenen pinlerden nasıl tek komutla çıkış verebiliriz onu görmeye 🙂

Örnek : Arduino Uno’nun 13,12,1,5,6 nolu pinlerine bağlı olan LED’ler aynı anda ışık verecek, 3 saniye sonra sönerek; 2,4,7 nolu pinlerine bağlı olan LEDler ışık verecektir.

atmega328

13,12,1,5,6 nolu pinlerin karşılığına bakalım:

13= PB5 (PORTB5)
12= PB4
11= PB3
1= PD1 (PORTD1)
5= PD5
6= PD6

ilk işlem için PORTB ve PORTD’nin tümü öncelikle çıkış(output) olarak tanımlanmalıdır.
Bu işlemi pinMode komutu ile yapsaydık, tüm pinler için birer pinMode ( toplamda 6 adet) komut yazılacaktı.

Onun yerine ;
DDRB=B11111111;
DDRD=B11111111;
yeterlidir 🙂

Bu LED’lerin yanması içinse yine 6 tane digitalWrite komutu yazmak yerine :

PORTB=B00111000;
PORTD=011000010;
yeterlidir:)

Sorunun devamı içinse :

2 = PD2
4 = PD4
7 = PD7

Bunları yakmak için de 3 adet digitalWrite yerine;

PORTD= B10010100;

Tüm komutları programda birleştirelim :

void setup()
{
DDRB=B11111111;
DDRD=B11111111;
}
void loop()
{
PORTB=B00111000;
PORTD=011000010;
delay(3000);
PORTB=B00000000;
PORTD= B10010100;
delay(1000);
}

Bu programı digitalWrite ve pinMode komutları ile yazmaya çalışsaydık bir çok satırdan oluşacaktı. Fakat port yöntemi ile birkaç komutta aynı işlemin yapılmasını sağladık. 🙂

7 segment display sürme gibi uygulamalarda da emin olun size çok kolaylık sağlayacaktır. 🙂

İyi çalışmalar dilerim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir