AVR Sleep (Uyku Modu) Kütüphanesi ve Uygulaması

Bu uygulamada AVR için yazdığım uyku modu kütüphanesinden bahsedeceğim ve bir örnek uygulama göstereceğim. Daha öncesinde “C ile AVR Programlama” derslerinde uyku modunu kısaca anlatmıştım. Normalde bu uyku modunu kullanmak için avr/sleep.h yerleşik kütüphanesini kullansak da kütüphane yazma alıştırması yapmak adına kendi kütüphanemi yazmayı tercih ettim. Sizin de gömülü sistemlerde ileri bir seviyeye gelebilmeniz için sadece uygulama yazmanız değil, bir yandan da kütüphane yazma alışkanlığını kazanmanız gereklidir.

Öncelikle sleep.h dosyasının içine bakalım.

AVR’da uyku modunu kullanmak oldukça kolaydır. Belirli modlardan biri seçilir, uyku yazmacından uyku modu etkinleştirilir ve SLEEP komutu ile uyku moduna geçilir. Uykunun derinliğine göre çeşitli uyku modları mevcuttur. Bu modların açıklamasını yine “C ile AVR Programlama” derslerinde okuyabilirsiniz. Şu resimde bu modların özelliği gözükmektedir.

Burada modlara göre birimlerin saat beslemeleri kesilmekte ve uyandırma kaynakları değişmektedir. Uyku modunda ne kadar az birim saat kaynağı ile besleniyorsa o kadar az enerji tüketimi söz konusudur. Bütün uyku modlarında ise CPU ile program hafızası saatinin durdurulduğunu yani işlemcinin gerçek anlamda durduğunu görmek mümkündür. Normalde bizim program akışı sırasında programı durdurmamız mümkün olmaz. Ne kadar while(1) veya delay() işlemleri ile durduruyormuşuz gibi görünsek de işin aslında sadece meşgul ederiz. Burada ise gerçek bir durdurma söz konusudur. Bu sayede örneğin kullanıcıdan bir komut bekleme anlarında boş yere güç tüketmemiş oluruz.

Uyku fonksiyonları ise şu şekildedir,

void sleep(int mode);
void bod_disable_sleep(int mode);

Burada normal bir uyku için sleep() fonksiyonunu kullanıp içine modu yazmamız gerekli. Eğer uyku sırasında BOD özelliğini de devre dışı bırakmak istiyorsak önce bod_disable_sleep() fonksiyonunu kullanırız.

.c dosyası ise şu şekildedir,

Burada sleep() fonksiyonunda önce SMCR yazmacına mode değişkenini aktarıyoruz ve sonrasında SMCR yazmacındaki SE bitini 1 yapıyoruz. Bu sayede kısa bir süreliğine (birkaç çevirim) mikrodenetleyicide uyku modu özelliği açık hale gelmiş oluyor. Bu süre içerisinde bizim SLEEP işlemci komutunu yürütüp bir an önce uyku geçmemiz gerek. Bu yüzden aşağıda asm(“SLEEP”) şeklinde SLEEP komutunu yürüttük. C dilinde SLEEP komutunun karşılığı bir fonksiyon veya operatör olmadığı için mecburen bunu Assembly komutları ile yazmak zorunda kaldık.

Bunun gibi pek çok zaman C’de karşılığı olmayan özellikler için satır içi (inline) Assembly kullanmamız gerekebilir. Bazen C derleyicisi mikrodenetleyicideki bazı komutları kullanmayabilir, her ne kadar temel komutlarla aynı işi yapsa da kullanmadığı gelişmiş komutlarla biz çok daha performanslı program ortaya koyabiliriz. Bu yüzden ne sadece Assembly ne de sadece C kullanmak gereklidir.

Aşağıda bod_disable_sleep() fonksiyonu yer almakta. Burada yine mikrodenetleyici güvenlik gereği BODS ve BODSE bitlerini 1 yapmamızı istemekte ve sonra devre dışı bırakmamızı istemektedir. Bu bune benzer bir güvenlik şartını EEPROM işlemlerinde de hatırlayabilirsiniz.

Şimdi uygulamaya geçelim. Öncelikle ben bu sefer RGB LED’leri farklı ayaklara bağladım. Bu bağlantıya göre öncelikle rgbled.h bağlantılarını değiştirmeniz veya kendi bağlantılarınızı uygulamanız gereklidir.

#define RGBDATADIRECTION DDRD
#define RGBPORT PORTD
#define KIRMIZIPIN PORTD4
#define YESILPIN PORTD5
#define MAVIPIN PORTD6

Yani bağlantılar şöyle olacaktır,

Kırmızı → PORTD4
Yeşil → PORTD5
Mavi → PORTD6

Aynı zamanda PORTD2'ye pull-up direnci ile beraber bir adet düğme bağlanmalıdır.

Programı çalıştırdığımızda kırmızı LED yanacak ve program orada uyku moduna girip bekleyecektir. Siz düğmeye basana kadar bu böyle devam edecek ve düğmeye basmanızla beraber uyku modundan çıkılıp tekrar çalışmaya başlanacaktır. Uyku modundan çıkmak için D portunun 2 numaralı ayağını harici kesme olarak belirledik ve boş bir kesme fonksiyonu oluşturduk. Biz bu kesmeyi sadece uyku modundan çıkmak için kullanmaktayız.

Aynı şekilde kesme ile uyku modundan çıktığımız için kesme fonksiyonunun içerisine kısa sürede işletilecek programı yazıp kesmeden çıkınca tekrar uyku moduna sokabilirsiniz. Genellikle uyku modu uygulamaları bataryalı ve uzun süre çalışması gereken cihazlarda kullanılmaktadır. Bu uygulamalarda kesmeler olmazsa olmaz özelliklerden biridir.

--

--