STM32 ile Karaşimşek Uygulaması

Daha önce öğrendiğimiz bilgilerle bir uygulama yapalım dedik ve yarım saatte karaşimşek devremiz hazır oldu. Bu devre soldan sağa sonra da sağdan sola sürekli kayarak yanmaktadır. 1980lerden beri elektronik kitaplarında gördüğümüz bu klasik devreyi bir ARM mimarisine ve Cortex M-4 çekirdeğine taşıyarak büyük bir seviye atlattık. Devremizde STM32F3 Discovery kartını ve 8 adet kırmızı ledi kullanmaktayız. Bu ledler C0-C7 numaralı ayaklara sıra ile bağlanmakta. Devreyi kurmanız için bu kadar bilgi yeterlidir. Ayrı bir şema vermemize gerek yok. Şimdi yazdığımız programı paylaşalım ve inceleyelim.

Burada klasik for döngüsü ile işi yürütsek de GPIO fonksiyonlarını farklı bir şekilde kullanmaktayız. İlla bit kaydırma operatörü ve yazmaçları kullanmamıza gerek yoktur. Şimdi kodu satır satır inceleyelim ve önemli noktaları vurgulayalım.

#define bekleme 50  burada bekleme adında bir sabit tanımlıyoruz ve programlarken 50 değerini veriyoruz. Eğer sabit bir değer içeriyorsa #define direktifini kullanmamız hafızadan tasarruf ettirecektir. Buradaki 50 değerini değiştirerek hızlı veya yavaş çalıştırabiliriz.

__GPIOC_CLK_ENABLE();  Her zaman olduğu gibi kullanacağımız port biriminin saat sinyalini etkinleştirerek işe başlıyoruz. Burada C portunu kullanacağımız için GPIOC olarak belirttik.

led.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);  Toplam 8 adet ayak kullanacağımız için ayakların arasına OR ( | ) ifadesi koyarak sırayla yazdık. Bunun yerine kısaca 0x00FF de yazabilirdik. Görüldüğü gibi bazen kütüphane kullanmak kod kalabalıklığına sebep oluyor.

uint16_t bit = 0x01;  Karaşimşek devresini tamamen kütüphane fonksiyonu ve parametreleri ile yapsaydık kodumuz aşırı derecede kalabalık olacaktı. Tek tek bitleri açıp kapamakla uğraşmak yerine döngü içerisine alıp bit kaydırma işlemi yapmamız çok daha pratik ve performanslı olacaktır. O yüzden 16 bitlik yani port yazmacına uygun bir bit değeri tanımlıyoruz ve bunun en son biti bir olacak şekilde değer veriyoruz. Bu da bir değeri ile mümkün olur.

for (int i = 0; i<8; i++)   Bu döngümüz toplamda 8 kere çalışacaktır. 8 adet ayağımız olduğu için bunu böyle belirledik.

HAL_GPIO_WritePin(GPIOC, bit, GPIO_PIN_SET);  Görüldüğü gibi fonksiyonun parametresine illa GPIO_PIN_0 diye yazmamıza gerek yok. Buraya bir değişken yazabileceğimiz gibi binary sayı bile yazabiliriz. Bu sabitlerin değerleri de zaten 0001, 0010, 0100,  1000 … diye gitmektedir. Burada bit değişkeninin değerine denk gelen ayağı yakmış olduk.

bit = bit << 1;  Burada bit değişkenini bir basamak sola kaydırdık. Örneğin 01 ise 10 oldu. Bu durumda bir sonraki bit değişkeni bir sonraki biti yakacaktır. Fakat önceki biti söndürmemiz gerekli. Bunun için şu kodu yazıyoruz.

HAL_GPIO_WritePin(GPIOC, bit >> 1, GPIO_PIN_RESET); C dili bilenler fonksiyon parametreleri içine işlemlerin yazılacağını normal karşılayacaktır. Burada fonksiyona giden parametre içindeki değeri bir adım sağa kaydırmış oluyoruz. Fark ederseniz burada parametre etkilenmiş oluyor. Bit değişkenine dokunmamış oluyoruz. Böylelikle sağdaki biti de söndürmüş oluyoruz.

HAL_Delay(bekleme);  Bekleme vererek yanan ledlerin fark edilebilir olmasını sağlıyoruz.

Öteki for döngüsü ise aynı komutları tersten işletecektir. O yüzden onu açıklamamız gereksiz tekrar olacaktır. Karaşimşek programımızın işleyişi böyledir. Şimdi çalışma videosuna bakalım.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

2 Responses

  1. İrem KILIÇ dedi ki:

    merhabalar rica etsem bu projenin kodlarını bana yollarmısınız .yazıda yer aldığı gibi yaptım fakat. çalıştıramadım bir türlü .

  2. İrem KILIÇ dedi ki:

    mail adresim iremkilic992@gmail.com

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.