04- LED yak söndür – ilk proje
Merhaba sevgili okuyucu.
Genel bilgi edindik ve gerekli yazılımların kurduk. Minimum devremizi de belirledik. Şimdi ilk uygulamamıza başlamaya hazırız.
LED yakıp söndürme 🙂
Aslında PIC eğitiminin en önemli konusudur. O kadar önemlidir ki o LED in yanıp yanmaması elektronik hayatını etkiler kimilerin. Ben “o” LED i bir kez yakana kadar birkaç gün boyunca kaç saatimi harcamıştım bilemezsiniz. Bunun sebebi ise “eksik bilgi”. Neyse ki benim öğrendiğim ve mantık yürüttüğüm her şeyi bu blogda paylaşacağım ki “siz” PIC programlama öğrenmek isteyenler benim takıldığım noktalarda takılmayın. Ne kadar klişe bir laf olsa da “bilgi paylaştıkça çoğalır”. Bu bilgi eksikliği olmadan bu projeyi en iyi şekilde tamamlayacağız. Bunun için önceki 3 bölüme iyi hakim olmanızı tavsiye ederim.
MPLAB X de proje oluşturma
Programı açtığımızda böyle bir ekran karşılıyor bizi.
Yeni proje oluşturmak için File > New Project yoluna gidiyoruz.
Categori olarak Microchip Embedded, proje olarak da Standalone Project i seçip ileri (Next) diyoruz.
Device kısmından PIC imizin ismini seçiyoruz. Bu proje için 16F877A kullanıyoruz.
Donanım aracı olarak bir şey kullanmayacağımızdan hangisini seçersek seçelim farketmiyor. İleri ile geçiyoruz.
Compiler bölümünde XC8 i seçmeliyiz. Buradan görüldüğü gibi mpasm compiler ı ile birlikte ASM dilinde de yazabiliyoruz programı. Bu MPLAB üzerinde kurulu geliyor. Biz XC8 i kullanacağız bu eğitimde. İhtiyaç olursa XC8 içinde ASM kodlarını da kullanabileceğimizi belirteyim.
Project Name kısmına projemizin ismini giriyoruz. Konumu kendisi öntanımlı olarak belirliyor. İstersek konumunu bu sayfadan değiştirebiliriz. Encoding kısmını ISO-8859-9 yapmanızı öneriyorum. Bu şekilde kodlar içine açıklama olarak yazılan türkçe karakterlerle ilgili sorunumuz olmaz. İsterseniz bu ayarı ayarlardan öntanımlı olarak belirleyebilirsiniz.
Projeyi oluşturduğumuzda böyle bir ekran ile karşılaşıyoruz. Sol tarafta projemizin altında ilgili dosyaları yerleştireceğimiz klasörler yer alıyor. Bu arada programı açtığımızda açılan Start Page ve MPLAB X Store sekmelerini karmaşayı önlemek adına kapatabiliriz.
Biz ilk olarak bir main.c dosyası oluşturacağız. Ana dosyamız bu olacak. Bunun için Source Files klasörüne sağ tıklayıp New > main.c… yolunu seçiyoruz.
Dosya ismi newmain olarak karşımıza çıkacak ama karışıklık olmaması için bunu main yapmanızı tavsiye ederim. Finish diyerek projemize main.c dosyamızı oluşturmuş oluyoruz.
Karşımıza gelecek ekran şu şekilde. Solda görüldüğü gibi Source Files klasöründe main.c dosyası belirdi. Ben kodların en üstünde yer alan ve tarih ve yazar bilgilernin olduğu bölümü silmeyi tercih ettim.
Projemizi oluşturduk. Şimdi gelelim hazırlık safhasına.
Configuration Bits – Ayar Bitleri
Configuration bitleri Türkçe olarak “sigorta” olarak kullanılsa da ben tercih etmiyorum. Bu ayarlar PIC imizin çalışma durumunu ve bazı güç ayarlarını içeriyor. 16F877A için 8 ayar bulunmakta. Bu PIC e göre değişmektedir. Datasheet in 144. sayfasındaki CONFIGURATION WORD bölümünde yer almaktadır.
- FOSC: Osilatör (saat frekansı) seçme biti
- WDTE: Watchdog Timer biti
- PWRTE: Power-up Timer biti
- BOREN: Gerilim Düşümünde Reset biti
- LVP: Düşük Gerilimde Programlama biti
- CPD: EEPROM Hafızası Kod Koruma biti
- WRT: Program Hafızası Yazma Koruma biti
- CP: Program Hafızası Kod Koruma biti
FOSC
Osilatör seçme bitidir. Hangi tip ve hangi değerde osilatör kullanacağımızı burada belirtiriz. Datasheet sayfa 146 da gösterildiği gibi 20 MHz kristal osilatör için bu değeri HS girmemiz gerekiyor. Ayrıca bir önceki bölümde 22 pF iki adet kondansatör kullanmıştık. O değerin de buradaki 15-33 pF değerleri arasında seçilerek alındığını da belirtmekte fayda var.
WDTE
Watchdog Timer biti PIC de yazılımsal veya donanımsal bir sorun olduğunda reset atmasını sağlayan ayardır. Bunu aktif yapmamız bu korumayı sağlayacaktır.
PWRTE
Power-up Timer biti herhangi bir reset durumunda PIC in 72 ms hiçbirşey yapmadan beklemesini sağlar.
BOREN
Gerilim düşümünde reset biti gerilim 4V altına düşüp o seviyede 100 mikrosaniye kalırsa oluşacak resettir. PIC imiz 4-5.5 V arası çalıştığını bildiğimiz için bu gayet yaralı bir ayardır.
LVP
Düşük gerilimde programlama biti devre kurulu iken düşük gerilimli bir programlayıcı tarafından programlamaya izin verme ayarıdır.
CPD
EEPROM hafızası kod koruma biti EEPROM hafızasındaki dataların okunmaması için yapılan bir ayardır.
WRT
Program hafızası yazma koruma biti programı yazacağımız alana yazma yetklisi verme bitidir. Ne kadarına izin vereceğimiz belirtilir.
CP
Program hafızası kod koruma biti harici bir kaynağın PIC in içindeki kodu okumasına engel için ayarladığımız bittir. Eğer pasif edersek PIC içerisindeki program tekrar okunabilir.
Bu ayarları MPLAB da şu şekilde kolayca ayarlayabiliyoruz.
Windows > PIC Memory Views > Configuration Bits
Şöyle bir ayar tablosu karşımıza çıkacak. Burada FOSC değerini “HS” diğer tüm ayarları “OFF” yapıyoruz ve “Generate Source Code to Out” butonuna tıklıyoruz.
Program bizim için konfigürasyon ayarlarını veren kodları oluşturuyor.
Bu kodu kopyalayıp main fonksiyonunun hemen öncesine yapıştırıyoruz.
Bir proje nasıl oluşturulur ve konfigürasyon ayarlarını nasıl yapılır bunu gördük. Bu ayarları her projede yapacağımız için detaylıca inceledik. Bu kısım da önceki 3 bölüm gibi ezberlenmesi gereken bir kısımdır. Çünkü bunlardan herhangi birinde yapılacak bir hata bu kısımdan sonra yazacağınız kodların tamamen veya kısmen çalışmamasına neden olabilir. Eğer hata yapıyorsanız veya takılıyorsanız eğitimin başından bu kısmına kadar tekrar göz atın. Buraya hakim olmanız PIC e hakim olmanız, hükmetmeniz demektir. Şimdi sıra geldi asıl programa…
LED Yak Söndür
LED yakmak masaüstü programlamada “Merhaba Dünya” yazmakla eşdeğerdir. Herkes bununla başlar. Biz LED imizi B0 portuna bağlayacağız. Belirlediğimiz portun değerini 1 yani 5V yaparsak ledimize 5V vermiş ve yakmış oluruz. Yazılım kısmına başlayalım. Yazdığımız kodlar main fonksiyonu içerisinde olacak.
1 |
TRISB0 = 0; //RB0 çıkış olarak belirleniyor |
Bu kod ile RB0 pinini çıkış olarak tayin ediyoruz. Giriş yaptığımız uygulamayı buton uygulamasında göreceğiz.
1 |
RB0 = 0; //RB0 mantıksal 0, kapalı, low olarak belirleniyor |
Çıkış yaptığımız pini 0 yani 0V yapıyoruz. Bu, LED in sönük olarak başlamasını sağlayacak programdır.
1 2 3 4 |
while(1) //Sonsuz döngü { } |
Ayarlarımızı yaptıktan sonra bizim bir döngüye ihtiyacımız var. Çünkü LED in yanıp sönmesinin sürekli olmasını istiyoruz. Bundan sonra yazacağımız kodlar while döngüsü içerisine yazılacaktır.
1 |
RB0 = 1; //RB0 açık konuma getiriliyor |
RB0 pinini 1 yaparak LED i yakıyoruz.
1 |
__delay_ms(1000); //1000 ms bekleme |
1000 ms yani 1 saniye bekliyoruz.
1 |
RB0 = 0; //RB0 kapalı konuma getiriliyor |
LED yeniden kapatılıyor.
1 |
__delay_ms(1000); //1000 ms bekleme |
Yeniden 1 saniye bekleme yapıp while döngüsünü bitiriyoruz.
Bu kodlar ile PIC den güç kesilene kadar LED 1 saniye yanıp 1 saniye sönecek.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#define _XTAL_FREQ 20000000 #include <xc.h> #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) void main(void) { TRISB0 = 0; //RB0 çıkış olarak belirleniyor RB0 = 0; //RB0 mantıksal 0, kapalı, low olarak belirleniyor while(1) //Sonsuz döngü { RB0 = 1; //RB0 açık konuma getiriliyor __delay_ms(1000); //1000 ms bekleme RB0 = 0; //RB0 kapalı konuma getiriliyor __delay_ms(1000); //1000 ms bekleme } return; } |
Tüm program şu şekilde olacak. Proje ile ilgili tüm belgelere aşağıdaki dosyalar bölümünde ulaşabilirsiniz. Programı yazdık sırada derleme işlemini yapacağız ki PIC e atmamız gereken .hex kodunu oluşturalım.
Run > Build Main Project ile derlememizi yapabiliriz.
Derlendikten sonra BUILD SUCCESSFULL yazısını aldıysak derleme başarılı demektir. Altındaki satırda da hex dosyamızın nerede oluşturulduğunu görebiliriz.
Derleme istatistiklerini de sol alt köşeden görebiliriz.
Şema ve Çizimler
Derlediğimiz programın tüm şema ve breadboard üzerinde gösterimi şu şekilde olacaktır. Önceki bölümde yaptığımız devreye bikaç ilave ile devremizi tamamlıyoruz. PIC 5V verecek. Bu LED in (+) bacağına bağlanacak. (-) bacağı ise toprağa bağlanacak. Fakat eğer sadece bunu yaparsak devrede hiç direnç olmamış olacak. Direnç olmayınca akım sonsuza gitmek isteyecektir. Bu da LED e vermemiz gerekenden fazla akım vererek LED imizi yakmamız demektir. Bu hafif bir yanık kokusuyla beraber LED in ortasında oluşacak siyahlıkla kendini gösterir. Tabi PIC de belirli bir amperaja kadar akım verebilir ki bu yanlış hareket PIC imizi de yakar. O yüzden PIC ile LED arasına veya LED ile toprak arasına en az 220 ohm luk bir dirençle bu akımı istediğimiz değere getirmemiz gerekmektedir. Not olarak 5mm bir LED 20mA akım çeker ve rengine göre 2-3.3 V arasında çalışır. Bu hesaba göre rengi ihmal edersek en az 150 ohm luk direnç koymamız gerekmektedir teorik olarak. Fakat 220 ohm koymak daha güvenli olacaktır. Konusu geçmişken söylemekte fayda var. Hiçbir elektronik alet elektriksel sınır değerlerine bakılmadan direkt olarak elektriğe bağlanmamalıdır. Bağlanmak durumunda kalınsa bile kesinlikle direnç tercih edilmelidir.
SONUÇ
Programımızı derleyip .hex kodumuzu PIC e yazdırdıktan sonra projemizin başarı ile çalıştığını görebiliyoruz. Proje ile ilgili MPLAB, Fritzing ve Proteus dökümanlarına aşağıdaki linkten ulaşabilirsiniz.
Bir sonraki yazıda görüşmek üzere.
Yazıların devamı ne Zaman gelir? Teşekkürler
Yakın zamanda birkaç bölüm gelecek. 1 hafta içinde zaman ayırıp yazabileceğimi düşünüyorum.
1000 ms yapınca 40 saniyede yanmaya başlıyor sistem bu mümkün mü?
Kristal osilatörünüzü ve osilatör ayarlarını kontrol edin. LED yanıyor fakat zamanında yanmıyorsa kesinlikle kristal ayarlarındandır. Devrenin fiziksel kısmına odaklanın.