
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ı.
üç ş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)
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
digitalWrite(led,LOW); dersek çıkış Lojik 0 (LOW) yani yaklaşık 0v olur
programımızın son hali
#define led 13
void setup() {
void setup() {
pinMode(led,OUTPUT);
}
void loop() {
}
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.
Benim için çok güzel bir uygulama oldu.
YanıtlaSil