AVR RGB LED Kütüphanesi ile RGB LED Uygulaması
Bu makale ile beraber hazırlamış olduğum ileri seviye AVR uygulamalarını anlatmaya başlıyorum. İlk uygulama basit bir uygulama olup kütüphane yazımını sizlere gösterecek. Uygulama her ne kadar basit olsa da RGB LED ile durum ifade ederken oldukça kullanışlı olacaktır. Öncelikle RGB LED kütüphanesini inceleyelim.
Burada rgb.h dosyasını görmekteyiz. Öncelikle burada bazı kullanıcı ayarları mevcuttur. RGB LED’in kullandığı portu ve ayak numaralarını tamamen kullanıcıya bıraktım. Böylelikle boştaki ayaklara bu atamayı yapabilirsiniz. Bütün ayakların aynı portta olması gerektiğine dikkat etmeniz gereklidir. Bunu RGBDATADIRECTION ve RGBPORT tanımlamaları ile yapmaktayız. Eğer C portunu kullanacaksanız buraya DDRC ve PORTC yazmanız gereklidir. Ben ATmega328PB’nin E portunu kullandığım için bu şekilde yazdım.
Sonrasında ise aşağıda olduğu gibi renk tanımlamaları yapılmaktadır.
#define KIRMIZI 0
#define YESIL 1
#define MAVI 2
#define CAMGOBEGI 3
#define SARI 4
#define MOR 5
#define BEYAZ 6
Bu tanımlar .c dosyasında göreceğiniz karar yapısını çalıştıran değerlerdir. Program bunu 0, 1, 2.. diye okusa da siz kod yazarken bir soyutlama gerekli olacaktır. Bu yüzden daha anlaşılır olması adına KIRMIZI, YESİL, MAVİ diye belirttim. RGB LED’in bütün LED’leri sabit parlaklıkta yandığı zaman toplamda 7 renk meydana gelmektedir. Diğer renkler için değişken parlaklık gerektiğinden PWM sinyaline ihtiyaç duyulmaktadır. Bunu bir sonraki uygulamada yapacağız.
Son olarak kütüphane fonksiyonu olarak led_init(), led_yak() ve led_sondur() fonksiyonlarını tanımladık. Bunların nasıl çalıştığını da .c dosyasında göreceğiz.
Burada öncelikle led_init() fonksiyonuna bakalım.
RGBDATADIRECTION |= ((1<<KIRMIZIPIN) | (1<<YESILPIN) | (1<<MAVIPIN));
Burada gördüğünüz gibi tek işlev belirlenen ayakların çıkış olarak ayarlanmasıdır. Burada DDRx yazmacını doğrudan belirtmeyip RGBDATADIRECTION adında bir tanım kullandık. Bu sayede kütüphane daha esnek olur ve kullanıcı tarafından ayarlanabilir. İleride yazacağınız kütüphanelerde bu yöntemi benimsemeniz işinizi kolaylaştıracaktır.
led_yak() fonksiyonu renk adında bir tamsayı değişkeni argüman olarak almaktadır. Biz KIRMIZI diye programda belirtsekde işin aslında bu 0 olarak fonksiyona gitmektedir. Bu şekilde bütün renkleri switch-case yapısıyla kontrol edip ona göre ilgili ayakları yakmaktayız. Dikkat edilmesi gereken bir nokta da bu ayakların ortak katot RGB LED’e göre yanıp söndüğüdür.
Şimdi örnek bir uygulamayı yapalım.
Burada RGB LED bağlantıları şu şekilde olmalıdır ve her bir ayağa 220ohm direnç bağlanmalıdır.
- Kırmızı → PE0
- Yeşil → PE1
- Mavi → PE2
Ayrıca C portunun 2 ve 3 numaralı ayaklarına (Arduino’da A2 ve A3) birer düğme bağlanmalı ve diğer ayaklar şaseye çekilmelidir.
led_init() fonksiyonunun ardından bütün renkleri kısa bir bekleme süresiyle yakmaktayız ve daha sonrasında sonsuz döngüye gelmeden önce değeri sıfırlamaktayız. Buraya kadar tanımları kullanarak KIRMIZI, SARI, YEŞİL… şeklinde LED yakma işlemini yaptık. Ama bu bunlar üzerinde matematik işlemleri yapamayacağımız anlamına gelmiyor. Bunlar işin aslında birer sayı olduğu için yeri geldiğinde işimizi kolaylaştırmakta. Eğer karakter dizisi ifadesi olsalardı bu kolaylığı göremezdik.
if (!(PINC & (1<<PORTC2)))
{
_delay_ms(200);
renk++;
if (renk>6)
renk = 6;
led_yak(renk);
}
Şurada görüldüğü gibi PORTC2 ayağına bağlı düğmeye bastığımızda renk değişkeni bir artmakta ve sırayla belirlenen renklerde RGB LED’i yakmaktadır. Burada taşma olmaması için değeri karar yapıları ile 0–6 arasında sınırlandırdık.
İlk uygulama için basit bir kütüphane yazdık ve denedik. Daha önce yaptığım AVR çalışmalarını takip edenler için oldukça basit görüneceğini düşünmekteyim. Bir sonraki uygulamada biraz daha gelişmiş bir şekilde RGB LED’i kullanacağım.