ARDUINO 8 - VE İLK PROGRAMIMIZ, " LED GÖZÜNÜ AÇTI 😉 "


Bir önceki konuda da bahsettiğim gibi önce atmel-avr-4-ilk-programmz-led-yakmaca   konusuna göz atmanız sizin için faydalı olacaktır.
Bu konuya çalışırsanız led konusunda bilgi sahibi olacaksınız, ledin nasıl bağlanması gerektiğini öğreneceksiniz, port yönlendirme işlmelerini öğreneceksiniz ve ayrıca  Arduino ile kaydedici seviyesinde program yazabileceksiniz.


Ve sıra geldi ilk programımızı yazmaya. Arduino program sayfasını tekrar incelersek karşımıza

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}


ifadesi çıkacaktır. Şimdi burada ne neyi anlatıyor. bir bakalım. C programı yazarken olmazsa olmazımız main() isimli ana fonksiyondur. C programlarının içinde birtane mutlaka main() fonksiyonu olmalıdır ve bu fonksiyon ana fonksiyondur. Program buradan işlemeye başlar. Arduino da C tabanlı bir fonksiyondur ve onun da programın başlayacağı bir ana fonksiyonu olmalıdır. Arduino programlarında bu görevi  void setup() fonksiyonu görür.

C programlarında bir de while(TRUE) ,while(1) ve for(;;) ile başlayan sonsuz döngülerimiz vardır. Sonsuz döngü içinde yazmış olduğumuz program kodları sırasıyla sonsuz defa işler. biz bu döngüden çık demedikçe mikrodenetleyici bu döngü içindeki programı koşturur durur. Arduino içindeki sonsuz döngümüz ise void loop() fonksiyonudur ve bu fonksiyon içine yazılan komutlar biz dur demedikçe  sonsuz defa işlenir durur.

İlk yazacağımız program bir ledi yakmak olacak. Arduino nano üzerinde bir adet led mevcut ve bu led D13 pinine bağlı.
O zaman önce D13 pinini led olarak tanımlayalım.

#define led 13 

Bu şekilde tanımlamalar yapmak program yazarken işimi kolaylaştırır. Programlarda giriş ve çıkışlara birçok şey bağlı olabilir. Program yazarken "nereye ne bağlıydı ?" şeklinde kafamızı karıştırmaktansa program başlangıcında giriş ve çıkışları anlamlı şekilde tanımlarsak,  nereye ne bağlı olduğunu karıştırmayız. Ayrıca örneğin burada led D13 pinine bağlı ve biz program yazarken tanımlama yapmadık  ve program yazımında "D13" ifadesini  kullandık. İlerki aşamada eğer led'in bağlı olduğu portu değiştirirsek; örneğin  D12 yaparsak bu sefer D13 yazdığımız her yeri değiştirp D12 yazmamız gerekecek ve bu karmaşaya neden olacak. Oysa program başında sadece tanımlama kısmını değiştirsek tüm programda istediğimiz değişikliği yapmış oluruz. Bu şekilde karamaşa yaşanmamış olur.

Tanımlamamızı yaptıktan sonra bu pini çıkış olarak yönlendirmemiz gerekiyor. Çünkü le bağlantısına göre Nanaodan akım çekeceği için çıkış oluyor.  Unutmamalıyız ki mikro denetleyici programı yazarken hangi pini kullanıyorsak o pini kullanımımıza göre çıkış veya giriş olarak yönlendirmeliyiz.

 bunun için  pinMode(pinno,giriş/çıkış) fonksiyonunu kullanıyoruz.

üç şekilde kullanabiliriz.

 pinMode(led,OUTPUT);                          led'in bağlı olduğu pin çıkış yapıldı

 pinMode(buton,INPUT);                          butonun bağlı olduğu pin giriş yapıldı.
 pinMode(buton,INPUT_PULLUP);        butonun bağlı olduğu pin giriş yapıld VE PULLUP   
                                                                      direnci   aktif edildi.(ilerki konularda PULLUP'tan  
                                                                      bahsedeceğiz)

 pinMode(led,OUTPUT);

pinMode() fonksiyonu pin yönlendirme  fonksiyonudur ve sadece programın başında bir defa çalıştırılacağı için  void setup() fonksiyonu içersinde yazılmalıdır.


 

led'in bağlı olduğu D13  dijital giriş /çıkış(I/O) pinidir. Led'i  yakmak için bağlı olduğu pini lojik 1(HIGH),   söndürmek için ise Lojik 0 (LOW) yapmalıyız.(atmel-avr-4-ilk-programmz-led-yakmaca   konuyu inceleyiniz.)
 
Bunun için  digitalWrite(pin,durum); fonksiyonunu kullanırız.

digitalWrite(led,HIGH);    dersek çıkış Lojik 1 (HIGH) yani yaklaşık  5v olur 
digitalWrite(led,LOW);    dersek çıkış Lojik 0 (LOW) yani yaklaşık  0v olur 

programımızın son hali 

#define led 13
void setup() {
        
                      pinMode(led,OUTPUT);
                     }

void loop() {
                
                  digitalWrite(led,HIGH);

                  }

 progamı derleme

Yazmış olduğumuz programda yazımsal hata olup olmadığını kontrol etmek için aşağıdaki resimde görülen derleme butona tıklarız ve sonuçlar program sayfasının alt tarafındaki alanda görülür. 


Sonuşç ekranında hata varsa kırmız ile belirtilir. yoksa yukarıdaki resimde gördüğünüz gibi bir yazıyla karşılaşırsınız. 

Örneğin programın başındaki #define led 13 satırının başına // (uncommand) işareti koyarak satırı iptal edin // işareti burada derleyiciye bu satırın yorum satırı olduğunu program işlenmesiyle ilgili olmadığını ve derlememesi gerektiğini söyler. Derleme  sonucu :



   ilkprogram :8: error 'led ' was not declared in this scope 

Sonuç ekarınında kırmızı ile yazılan satır bize şunu söylüyor. ilkprogram isimli programın 8.  satırında yer alan led ifadesi tanımlanmamıştır. 

Programın 8. satırında  digitalWrite(led,HIGH);  ifadesindeki led tanımlanmamıştır. ve o satır resimde gördüğünüz gibi kırmız ile işaretlenmiştir.

exit status 1
'led' was not declared in this scope   uyarısı ise void setup() içindeki hatalarla ilgilidir. Burada da led tanımlanmamıştır diyor

Bu şekilde hatalarınızı görüp düzeltebilirsiniz. Tabi burada hatalar sırayla gösterilir. Örneğin void loop() içersinde 8. satırdan başka satırlarda da led ifadesi olmuş olabilir ama önce ilk led ifadesinin geçtiği 8. satır için uyarı verilir. Sonra diğerlerini de düzeltmezseniz 8. satırdan sonra ilk led ifadesi nerde denk gelirse o satır içinde hata uyarısı verilir.

Şimdide programımızı Arduino kütüphanesine ait olan pinMode() ve digitalWrite() fonksiyonlarını kullanmadan , Atmega328p kaydedicilerini kullanarak yazalım. Bunu yapabilmek için Arduino pinlerinin Atemga328p karşılığının ne oduğunu bilmemiz gerekiyor. 






Ayrıca mikrodenetleyici programı yazarken mikrodenetleyicinin datasheet'ini yanımızdan ayırmamalıyız.Atmega328p 'nin data sheet'ini buradan indirebilirsiniz.

Yukarıdaki şekilde gördüğümüz üzere bizim D13 olarak isimlendirdiğimiz pin aslında Atmega328p'nin B portunun 5.pinidir.. yani PB5 dir. Şimdi arduino programında voidsetup() fonksiyonu içinde bu pini çıkış olarak yönlendirmeliyiz. 

atmel-avr-4-ilk-programmz-led-yakmaca konusunu inclersek burada port yönlendirme işleminin nasıl yapıldığını anlatmıştım.

buna göre portb'nin 5. bitini çıkış yapmak için PORTB Data Direction Register'ı olan DDRB'yi pinMode()fonksiyonu yerine kullanacağız.

#define led 5 olarak düzeltme yapmalıyız. çünkü şimdi led 5. pin oldu.(Atmegada PB5 = Arduinoda D13)

DDRB=0b00100000;   veya  DDRB=0x20; komutları kullanılabilir.  yada DDRB |=(1<<led) ; ()

portb'nin 5. bitine bağlı olan led'i yakabilmek için ise bu biti 1 yapmalıyız.bunun için

PORTB=0b00100000;  , PORTB=0x20; veya PORTB |=(1<<led); komutları kullanılabilir.


sonuçta programımız.

#define led 5
void setup() {

  DDRB |=(1<<led);

}

void loop() {
  PORTB |=(1<<led);

}


böylece Arduino üzerinde kaydedici seviyesinde program da yazmış olduk. Bu programı derleyebilirsiniz. Tekrar etmekte fayda var bu şekilde kaydedici seviyesinde program yazabilmek için
atmel-avr-4-ilk-programmz-led-yakmaca konusunu incelemelisiniz.





Yorumlar

Yorum Gönder