ibrahim-atikerMikroişlemciler 1 Yazdığınız Programlar Hareket Etsin

Merhaba arkadaşlar. Bu gün sizlerle çok zevk aldığım, beni çok keyfilendiren bir konuya giriş yapıcaz. Hayatımız içinde sürekli olarak kullandığımız fakat birebir ilişki içine girmediğimiz elektronik harikaları mikroişlemciler. Elimizdeki telefondan tutun, izlediğimiz televizyondan, tuttuğumuz kumandaya tüm elektonik aletlerin içinde bulunan beyinlerdir aslında.

Neden beni bu kadar çok heycanlandırıyor onu anlatmak istiyorum. Size şöyle bir örnek vermek istiyorum. Dünyanın sahibinin sizin olduğunuzu düşünün. İstediğiniz yere istediğiniz binayı dikebileceksiniz, o binalara istediğiniz insanları yerleştireceksiniz ve bu insanlar siz ne isterseniz onu yapacaklar. Mikroişlemciler ile tasarlayacağınız sistemleride böyle düşünebilirsiniz. En basitinden yazdığınız programla kurduğunuz sistemdeki bir motoru ister yavaşlatın ister son hızda çalıştırın. İster ses çıkarsın, ister ışık yaksın. Tüm kontrol sizde. Tabi bu kontrolü sağlayabilmek için bazı konularda bilgi sahibi olmamız gerekiyor.

Mikroişlemcilerimizi programlarken kullanacağımız dil C tabanlı bir dildir. Tabi bu bir standart değil. Assembly dilinde yada basic dilinde de pic programlama yapabiliyoruz. Fakat Basic dili üst seviye bir dil olduğu için donanımda çok fazla kontrol sahibi olmamıza olanak tanımıyor. Assembly ise donanım üzerinde tam kontrol imkanı sağlıyor fakat makina diline çok yakın olduğu için anlaması, kavraması ve yazması çok zahmetli bir işe dönüşüyor. Basit bir program bile yüzlerce, binlerce satır kod demek oluyor bazen.

Assembly’den sonra makina diline en yakın ve donanıma en fazla hakimiyet imkanı veren dil C dilidir. Şu ana kadar yapılmış profesyonel projelerin birçoğunda C dili kullanılmıştır. Bende sizlere anlatırken CCS C programlama dili ile anlatacağım arkadaşlar. Farklı özellikte farklı C derleyecileri var fakat biz bunula ilerleyeceğiz. Bilgi sahibi olmamız gereken ilk konu C tabanlı bir derleyici kullanacağımız için öncelikle C dilini bilmemiz. Tabi bilmeden de vereceğim bilgilerle temel atıp devam edebilirsiniz fakat eğer biliyorsanız bu sizin için büyük bir kolaylık sağlayacaktır.

Diğer bilgi sahini olamamız gereken konu ise elektronik alanı. Çünkü artık yazdığımız programlar gerekirse harekete geçecek, gerekirse ses çıkaracak. Bir led yakacağınızı düşünün. Programlayacağımız mikrodenetleyiciler genellikle 5V ile çalışacaklar ve ledin çalışması için gerekli olan voltaj 1.5 civarındadır. Eğer bu ledi korumazsak ledimiz yanar. Bu ledi nasıl koruyacağız, gerektiği yerde akımı nasıl arttıracağız, gerilime nasıl yön vereceğiz, nasıl anahtarlama yapacağız bunları bilmemiz gerekiyor. Ayrıca kullanacağımız tüm elektronik malzemelerin kullanım kılavuzları yani datasheet’leri vardır. Bu datasheetleri okuyabilmemiz gerekiyor. Örneğin mikroişlemcilerde bacaklar bulunur ve bu bacakların bazıları özeldir. Bu bilgilerin hepsi dahasheetlerde yazar. Bu beceriler yavaş yavaş oturacaktır o yüzden gözünüzü korkutmasın.

Basit çalışmalar için bunlar yeterli olacaktır. Şimdilik ilk önceliğimiz elektronik devreleri hazırlamak ve programını yazabilmek, ilerki çalışmalar için mekanik hesaplara da gireceğiz fakat bu bir sonraki aşama.

  ELEKTRONİK DEVREYİ OLUŞTURMA VE PROGRAMI YAZMA AŞAMASI

Arkadaşlar öncelikle kendi edindiğim tecrübelerden başlamak istiyorum. Bir mikrodenetleyici programlamadan önce elektronik devrenizi kabataslak olarak bile olsa tasarlarsanız bu size programı yazarken çok fayda sağlayacaktır. Daha öncede söylediğim gibi tüm kontrol sizde. Bu yüzden eğer kafanızda oluşturduğunuz bir devreniz varsa yazacağınız kodları da daha kolay yazabiliyorsunuz. Tabi bu benim kendi yöntemim, bana bu şekilde kolay geliyor. Sizde kafanızda böyle bir yöntem oluşturursanız sizin için daha iyi olacaktır.

Şimdi sizlerle beraber 3 farklı butonla led kontrol ettiğimiz bir devre hazırlayalım.

1) Elekronik Devre Çizimi

Elektorik devrelerimiz için Proteus programını kullancağız. Öğrencilik dönemimiz için yeterli bir program ve neredeyse tüm elektronik malzemelerin kütüphaneleri olduğu için bize yetecektir.

Öncelikle devremizde ne kullanmamız gerekiyor bunlara karar vermeliyiz. Sol tarafta sarı ile boyalı üstteki kısım programın Component Mode  kısmıdır. Burada devrede kullancağımız malzemeleri seçecegiz. Biraz yanında bulunan P tuşu ile (pick from libraries) kütüphanemizi açarak gerekli olan devre elemanlarımızı arama kısmına yazıyoruz ve üzerine çift tıkladığımızda malzeme listemize eklenmiş bulunuyor. Malzemelerimizi İngilizce isimleriyle aratmamız gerekiyor.

Devredeki Malzeme Listesi: Button, Cap, Crystal, Led, PIC16F84A, Res

Diğer sarı ile boyadığım kısım ise Terminals Mode‘dur. Burada ise devremize gerekli olan +5V ve toprak hatlarına ulaşabiliriz.

Malzemelerimizi seçtikten sonra datasheet bilgilerine bakarak devre üzerinde istediğimiz yere yerleştirebiliriz bu konuda tamamen özgürüz. Yerleştirdikten sonra her alamanın ucunda bir nokta olacaktır ve bu noktalara geldiğimizde programda otomatik olarak faremizin işaretçisi kalem şeklini alacak ve bu elemanlar arası bağlantı yapabileceğiz. Bununla elektrik teli ile iletim yaptığımızı düşünebilirsiniz.

Şimdi biraz devre elemanlarını anlatayım.

Mikroişlemcimizin 4 numaralı pinine 10 kΩ direnç , ledlerimizin önündeki 220 Ω direnç, butonların önündeki 220 Ω direnç bu elemanları korumak içindir. Unutulmamalıdır ki devredeki elemanları yakan şey gerilim değil akımdır. Bu dirençler akımı kontrol altına almamızı sağlar.

Butonların diğer ucuna bağlı 10 kΩ dirençler ise  bağlı oldukları pinlerin giriş pini olmasıyla alakalıdır. Bu giriş-çıkış işlemini programı yazarken anlatacağım. Giriş pinleri yükselen kenar ile tetiklenir. Butona bastığımızda 5V giriş pinine iletilir ve butondan elimizi çektiğimizde tekrar 0V yani toprak hattına ulaşması gerekir. Bu yüzden giriş pinine toprak hattı da bağlarız fakat eğer 10 kΩ direnç koymazsak giriş sinyali için verdiğimiz 5V direk kısa devre olacak ve mikroişlemcinin giriş ucuna sinyal iletilmeyecektir.

Crystal yani Türkçe olarak kristal osilatör programımızda kullanacağımız beklemeler için gereklidir. Örneğin ledimizi 0.5 saniye yakmak istediğimizde bunun süresini hesaplayan eleman kristal osilatördür. Kristal osilatör sürekli olarak kare dalga üretir ve bu sinyaller sonucu istediğimiz zaman hesaplarına ulaşabiliriz.

Kristal osilatörün ucuna bağladığımız kondansatörler ise parazitleri önlemek içindir. Elektronik elemanlarda parazit istenmeyen bir durumdur. Çok kısa sürelerde çok büyük sinyal değişikleri olabileceği için kondansatörler bu dalgalanmaların oluşmasına engel olacaktır.

Elemanların kullanım amaçlarını kısaca anlatmaya çalıştım. Basit olarak bu kadar bilmemiz yeterli olacaktır.

2) Programın Yazılması

Daha öncede belirttiğim gibi C tabanlı bir programlama yapacağız ve bunun için CCS C derleyicisini kullanacağız.

Öncelikle nasıl bir program yapacağız onu anlatayım. Elektronik devrede çizmiş olduğumuz 3 farklı buton ledleri farklı şekilde kontrol edecektir. Bir butona basına bir ledimiz 0.5 saniye aralıklar ile yanıp sönecetir. Bir başka buton ile başka bir pin 0.15 saniye aralıklarla yanıp sönecektir. Diğer butonumuzda ise 3 led ardı ardına yanıp sırayla sönecektir. Bunları istediğimiz gibi değiştirebiliriz, en güzel yanıda tüm kontrolün bizde olması. Şimdi devremize uygun yazdığımız programa geçelim.

#include <16F84A.h>           //kullanacağmız mikrodenetleyici yazıyoruz
// çift slash dan sonra yazacağımız açıklama satırlarını program okumaz
#fuses nowdt                  //sigorta ayarları…ilerki konularda bize lazım olacak

#use fast_io(a)               // a portunu kullanacağımızı belirttik
#use fast_io(b)               // b portunu kullanacağımızı belirtitk

#use delay(crystal=20000000)  // kullancağımız kristalin 1 saniyede üreteceği kare dalga sayısı

void main()
{
set_tris_a(0xff);          // a portunun tamamı giriş
set_tris_b(0x00);          // b portunun tamamı çıkış

output_b(0x00);            // başlangıçta b portunu sıfırlıyoruz

   while(TRUE)                // programın işleneceği sonsuz döngü
{
if(input(pin_a0))       // A0 pinine sinyal geldiğinde işlenecek kısım
{
for(int i=1; i<=3; i++) // 3 tekrar
{
output_high(pin_b0);    // B0 pinine yüksek sinyal yani 5V gönder
delay_ms(500);          // 500 milisaniye bekleme süresi
output_low(pin_b0);     // B0 pinine düşük sinyal yani 0V gönder
delay_ms(500);
}
}

if(input(pin_a1))
{
for(int i=0; i<3; i++)
{
output_high(pin_b1);
delay_ms(150);
output_low(pin_b1);
delay_ms(150);
}
}

if(input(pin_a2))
{
for(int i=0; i<3; i++)
{
output_high(pin_b0);
delay_ms(150);
output_low(pin_b0);

output_high(pin_b1);
delay_ms(150);
output_low(pin_b1);

output_high(pin_b2);
delay_ms(150);
output_low(pin_b2);
}
}
}

}

Diğer led yakma kodları aynı olduğu için hepsine açıklama eklemedim arkadaşlar.

Build dediğimizde bize programda yazılımsal hatalar olup olmadığını kontrol eder ve eğer hata yoksa mikroişlemcimizin içine atacağımız olan hex dosyasını hazırlayacaktır. Bu dosyanın içinde derleyicinin çevirmiş olduğu tamamı makina diline ait kodlar vardır. Bu dosyayı mikroişlemcilerin içine atabilmemiz için özel bir elemana ihtiyacımız vardır. Programlama kartı diye aratırsanız birçok seçeneği mevcuttur.

Kodlarımızı yazdıktan sonra öncelikle proteus programında simulasyonda denemeliyiz. Bunun içinde devremizde 16f84a nın üzerine çift tıklayarak Program File kısmında oluşturan hex dosyamızı seçmemiz gerekiyor. Son olarak bir alt kutucuğunda bulunan Processor Clock Frequency kısmına osilatörümüzün değerini yazmalıyız.

Simulasyonu çalıştırmak için sol altta bulunan play tuşuna basmamız yeterli.

Programımızın çalıştığını gördükten sonra baskı devresini hazırlmak için Isis programına geçiş yapacağız. Fakat henüz ilk konu için fazla olacağını düşünüyorum. Her malzemenin kılıfı olur. Simulasyonda bu önemli değildir fakat baskı devreyi hazırlarken her malzemenin doğru kılıfının seçilmesi gerekmektedir. Bu konuya ilerleyen zamanlarda geçsek daha iyi olacak. Devreyi hazırlamak isteyen arkadaşlar için ben gerekli tüm dosyaları ekleyeceğim.

Baskı Devre Çizimleri

İlk konu olduğu için açıklamalarımız biraz fazla oldu. İlerleyen konularda daha çok uygulama yapacağız arkadaşlar. Dosya ekleri ve çalışma videosu aşağıdadır. Bu çalışmamızda malesef baskı devre ile hazırlayamadım. Ayrıca Mehmet Doğan kardeşime teşekkür etmek istiyorum. Gece 11 sıralarında malzemelerimin eksik olduğunu farkettim ve kendisi imdadıma yetişti. Takıldığınız bir noktayı yorum olarak belirtirseniz elimden geldiğince yardımcı olurum. Geliştirilmesi gereken, üzerinde durmamı istediğiniz kısımları belirtirseniz sevinirim arkadaşlar. Okuduğunuz için teşekkür ederim arkadaşlar umarım yararlı olmuştur.

 

 

Facebook Sayfamizdan Bizleri Takip Edebilirsiniz
  • İbrahim Atiker

    teşekkür ederim Murat hocam 🙂

  • Hocam bir Endüstri Mühendisi olarak benim bile ilgimi çekmesini sağladın. Eline sağlık muhteşem bir yazı olmuş 🙂