Elektronik / Elektronik Kaynakları/

MikroC Dersleri 5

Sponsorlu Bağlantılar

Merhaba elektronik Severler…

Bir önceki dersimizde Döngüler Kontrol deyimleri ve değişkenleri ugulamalarda kullandık programcılığımızı biraz daha geliştirdik.Ayrıca dizileri gördük ve bunun da uygulamasını inceledik.

Bugün Dersimizde Dizileri biraz daha kullanacağız MikroC de buton yapısını kullanıp Tek portla çoklu Kontrol (TARAMA YÖNTEMİ) üzerinde durup dersimizi sonlandıracağız. Ama bende alışkanlık yapan kısa hatırlatmalar vermeden geçemeyeceğim.

“C ile pic progralmalaya hakim olmak istiyorsak bu dersler bizim için çok önemli. Tabiki ilk derslerde temel oluşturmak açısından önemli yer etmektedir”

Dersimize başlamadan önce işimize yarayabilecek kısa ip uçları vereyim.

  • Pıc Devresi tasarlanırken Kullanılmayacak olan pinler çıkış olarak ayarlanmalı ve Baskı devrede bu pinler (-) hattına bağlanmalıdır. Bu durumda pic için muhtemel kararsız çalışmalar önlenmiş olur.
  • Pic PORTLARININ sadece üç pinini kullanarak PORTLARI istediğiniz bit(basamak)kadar artırılabilirsiniz. Buna SPİ (serial Prepheral İnterface) seri haberleşme denir. Tarama yöntemlerinde sıklıkla kullanılır.
  • Bir Projenin baskı devre uygulamasını yapıp çalışmadan önce (Pic devreye Takılmadan Önce) Devre üzerindeki besleme noktalarını ölçünüz. Eğer pic beslemesi 5 volt olduğunu gözlemlerseniz pic montajını yapınız.Olası besleme hatalarından dolayı PİC yanmayacaktır.

Arkadaşlar bu dersimizde de 7segment display kullanarak geçen haftaki gibi sayac oluşturalım fakat bu sefer işi bu sefer zorlaştıralım 99a kadar sayacımızı saydıralım. Sayac değerlerini displayda göstermek için karakter değerlerini yine diziler ile tanımlayalım ve görüntüleme işini yapalım.

Şimdi sizlere birkaç soru?

0 99 sayacı yapacağımıza göre kaç adet 7segment display kullanacağız? Ve displayleri çalıştırmak için kaç adet pine ihtiyacımız olacak? Kullanacak olduğumuz pic in kaç adet çıkışı var? Cevaplar mı Hadi bakalım biraz düşünün :D

2 adet 7 segment display kullanacağız. Displayların 7+7 =14+2pin Besleme pini olacak Pic çıkışı 14. Biz birde buton kullanıyoruz kaldı 13pin. Tüh biz 16f628a kullanamayacakmıyız şimdi bu işte.

Bir pin boşta kalıyor?

Hayır Tabiki de kullanacağız. Hem istersek 999999….. sayan program bile yaparız.

E peki bunu nasıl yapacağız ?

Cevappp Tabiki tarama yöntemi ile. Tarama yöntemini kısaca açıklayacak olursak Direk olarak bu yönteme göz yanıltma diyebiliriz.

İnsan gözü saniyede 15 defadan fazla tekrarlanan olguları sabit görürler. Örnek verecek olursak hızlı giden bir otomobilin yanından geçerken cantlarını duruyor ki görüntüsüne çok yakın bir şekilde duruyor gibi görürüz.

Evlerimizde aydınlatmaları hep sabit yanıyor gibi görürüz oysa saniyede 100 defa yanıp sönmektedir.Veya dükkan vitrinlerinde kullanılan kayan yazılar biz orada yazıları net bir şekilde görmekteyiz oysa yazı karakterlerindeki bütün ledler aynı anda hiç bir zaman yanmazlar hepsi göz aldatması olan saniyede çok defa tekrardan ibarettir.

Şimdi gelelim bizim sayacımıza. Biz iki displaylerin aynı bacaklarını birleştirip picin aynı pinine bağlayalım.(iki displayin1.uçları birleşip pice 2.uçları birleşip pic3…)

Şimdi toplamda 7pin+2pin beslememiz oldu yani pic in toplamda 9 pinini kullnıyoruz.hatta 4 pinimiz de boşta kaldı neler yapılmazki bu 4 pinle :D

Peki sayac görüntüsünü nasıl oluşturacağız. Şimdi programda bir sayac tanımlayacağız 0 99 a kadar sayacak. Ve biz bu sayacı birler ve onlar basamağı olarak iki basamağa böleceğiz.

Artık iki hanenin bilgisi ayrı ayrı programımıza aktardık. PORTBye önce birler basamağını göndeririz ardından birleri gösterecek displayın eksisini bağladığımız transistor ün Pic çıkışını aktif yaparız ve birler görüntülenir. Bir süre sonra (5-10mili saniye);transistör çıkışı pasif yapılır ve PORTBye onlar basamağı bilgisi gönderilir ve onların bağlı olduğu transistör aktif yapılır birler hanisindeki süre kadar bekleme yapılır ve bu olay sürekli olarak gösterilir.

1 saniyenin 1000ms olduğu bilindiğine göre ortalamadaniyede 80 90 defa sıralı bir şekilde birler onlar görüntüsü gösterilir. Ve böylece az sayıda pinle çok basamaklı display çalıştırılır. Siz sayacı yapın tarama yöntemini kullanarak dot matris led ekranda bile görüntüleme yapacaksınız.

Şimdi bukadar bahsini yaptığımız olayın programını da yazalım bakalım. Ama değerli öğrencilerim benden 99a kadar saydırma yeter size ödev haftaya 999 a kadarını siz kendiniz yapacaksınız.

7Segment display ile 99 sayaç programı


unsigned char sayac=0,birler,onlar;/*değişkenlerin ilk değeri burada verilebilirve basamak değerleri burda tanımlanıyor*/

unsigned int display[10]={63,6,91,79,102,109,125,7,127,111}; /*display göstergeleri burada tanımlandı*/

void main() {

/*PORT AYARLAMALARI YAPILACAK GİRİŞ ÇIKIŞ AYARLARI Ve varsa Analog ve Karşılaştırıcı MOdüller Ayarlanır*/

TRISB=0x00;

PORTB=0;

TRISA=0x01; /*PORTA.B0  girişe yönlendirildi*/

PORTA=0;

CMCON =0x07;/*Comparator(karşılaştırıcı) kapatıldı Pinler dijitale ayarlandı*/

for(;;){ /*Program sonsuz döngü içinde çalışacak for(;;) sonsuz döngü */

if(PORTA.B0==1){ /*eğer butona basılmışsa artırma işlemi yapılır ve bir süre beklenir butondan elimizi çekmemişsek değer artmaya devam eder*/

sayac=sayac+1;/*sayac değişkeni bir artırılıp tekrar sayac değişkenine yazılır.*/

delay_ms(100);}

PORTA=0x02;/*Birler basamağının transistörü PORTA.B1e bağlı bu çıkış aktif yapılıyor*/

delay_ms(5);

PORTB=display[onlar];/*sayaci display içine yazdık ve sayaç kaç ise örneğin5  display dizsinin 5.elemanı olan 6nın göstergesi portbye gönderilir*/

PORTA=0x04; /*onlar basamağının transistörü PORTA.B2yebağlı bu çıkış aktif yapılıyorPORTB.B1 pasif yapılıyor*/

delay_ms(5);

PORTB=display[birler];

birler=sayac%10;    /*sayaç ona kadar saydırılıyor ve basamak değeri olan birlerini içine yazılıyor.*/

onlar=(sayac/10)%10;/*sayacın her on saymasında değer bir artırılıyor buda onlar basamağına yazılıyor.ve bu değerde 10u sayıyor yani 9dan sonra sıfıra dönüyorbunu%10 ile yaparızÖrn%8 sekiz sayar ve sıfıra döner.*/


}}/*son*/

Bu programın isis uygulamasında displayler yanıp sönüyor görülebilir fakat uygulaması yapılırsa yanıp sönme gözlenmeyecektir.

Programın başında söylediğim ödev konusunu unuttuğumu sanmayın sakın 999sayacı size ödev. Yapıp bana ulaştırın siteye hemen ekleyelim.

Öğrenciler ödev yapmazsa öğretmen anlattığından zevk almaz? :D

Şimdi mikroCye özel bir kütüphane olan Button yapısını anlatayım. Bu üstteki kullandığımız buton kontrolü ile aslında aynı ama biraz daha esnek kullanımı var yukarıdaki program da butona basılı tuttuğumuzda sayaç sürekli artmakta aslında bu istediğimiz bir durum değil. Butona her basmamızda değer bir artmalıişte bunun en kolay çözümü BUTTON kullanmak..

Mesela biz bildiğimiz yoldan bir ledi butondan elimizi çekince yakmak istesek bunu nasıl yaparız yada butona elimizi bastığımızda led yansa.

Öncelikle butonun durumuna göre değer alacak değişkenlere ihtiyacımız olacaktı ve bu değişkenleri birkaç if altında fonksiyon edecektik. Buda programı karştıracak ve uzatacak.
Şimdi bu butonu inceleyelim bakalım

unsigned short eski_durum
do {
if (Button(&PORTB, 0, 1, 1)) eski_durum = 1;
if (eski_durum && Button(&PORTB, 0, 1, 0)) {
PORTD = PORTD+1;
Eski_durum = 0;
}
} while(1);

Buradaki program parçası tamamen (Button(&PORTB, 0, 1, 1) gibi fonksiyonla kontrol edilmektedir.

Burada (Button(&butonun bulunduğu port(PORTA (b c d e vs),portun kaçıncı pin olduğu,bu virgülden sonrasını 1de tutun,bu virgülden sonrası ise fonksiyonun pin 1 i mi 0 ı mı algılayacak bunun belirlendiği yerdir.)

(Button(&PORTB, 0 , 1 , 1)

Burada PORTBnin 0.bit 1ms aralıklarla if çalışacak, ve pin0 1 iken işlem yapılacak demektir.
Bu istekti yazılı program parçası ise butona basılınca eski durum 1 yapılır ve butona basılı tutuldukça 1de bekler

Hemen alttaki fonksiyon ise butonun bırakılmasını bekler ve bırakılır bırakılmaz PORTDnin değerini bir artırır İf dışına çıkılır.

Bu dersimizde bukadar arkaadşlar.sayac programının dosyaları ekte mevcuttur. Tavsiye olarak görürseniz ödev uygulamasını BUTTON ile yapmaya çalışın.

İyi çalışmalar diliyorum Kolay gelsin.

Haftaya dersimiz 2satır 16 Karakterli LCD ekran uygulamaları olacak.

Not:Derslerde gecikmeler oluyor Öğretmenlik için KPSS hazırlanıyorum dershane görev vs. İdare edin hocanızı… :D Bu dersimize ait isis ve kod dosyaları: MikroC Dersleri 5

Dosya indirme LINK listesi (HTML formatında) link-14152.zip şifre-pass: 320volt.com

aytacdurgen@gmail.com

  • Erkan Karakaş

    hocam teşekkürler yardımınız için derslerin devamını bekliyorum kolay gelsin..

  • yaren

    hocam elinize sağlık bu devirde böyle uğraşıp derler hazırlayıp zor iş teşekkürler

  • aytacdurgen

    Eğer birilerinin birşeyler öğrenmesine katkım bulunuyorsa ne mutlu emeklerimize…
    Umarım takip edenlere ders havasında PIC programlamayı öğretebiliyorumdur.
    ilgilenenler derslerle ilgili dönütler verirlerse gelecek derslerde daha faydalı düzenlemeler yapmama imkan tanımış olurlar

  • cihat

    hocam faydalı bilgileriniz için teşekkürler..

  • Erdem

    Hocam ekteki dosyada verdiğiniz isis şema dosyası hangiversiyonda hazırlandı acaba? Bendeki versiyon 7.1 hata alıyorum.

  • Fatih

    hocam haftaya demişsiniz 2 hafta geçmiş aradan. yeni dersler gelmeyecek mi?

  • Fatih

    Notu fark etmedim hocam iyi çalışmalar teşekkürler

  • cihat

    hocam faydalı çalışmalarınız için teşekkürler…

  • eurolaz

    Hocam bu BUTTON fonksiyonu zaman zaman sıkıntılı çalışabiliyor. Bunun yerine

    .
    sbit tus at RF1_bit;
    .
    .
    if (tus==1) {
    Delay_ms(50);
    . // Tuşa basılınca işlem yapılacaksa
    . // gerekli kod buraya.
    while(tus) {
    Delay_ms(50);
    . //Basılı tutulduğu sürece işlem yapılacaksa
    . //gerekli kod buraya.
    }
    . // Tuş bırakılınca işlem yapılacaksa
    . // gerekli kod buraya.
    }
    .
    .

    şeklinde bir yapı kullanıyorum. Daha verimli oluyor. Size de tavsiye ederim.

  • aytacdurgen

    Faydalı bilgilerinizin için teşekkür ederim.

    Button fonksiyonu şart kontrolü ile çalıştığı için içerisinde bekleme yapmamak gerekiyor.
    Dediğiniz gibi böylesi kontrollerde bazen sıkıntı verebiliyor fakat Button yapısı bir çok kullanıcıya yeni yazılımlarında değişik fikirlere yer vereceği için bu konuya yer vermeyi uygun buldum

  • yusuf son

    hocam ben skorboard yapmak istedim
    diplay ile devreyi çalıştırdım, karakteri büyütmek için sekmentleri kendim oluşturdum ledlerden, fakat başarılı olamadım.. sekmentler sürekli yanıyor. displayde saymayı görüyorum .. yardımcı olursanız sevinirim…

  • aytacdurgen

    @Yusuf SON Öncelikle skorboardın tüm ledlerin artılarını tek hatta toplamalısın. Display segmentlerinin ayrı ayrı eksilerini çıkartmalısın.
    Displayı devreye bağlamadan ayrı ayrı denediğinde segmentlerin yanması gerekir. Eğer bu şekilde çalışıyorsa sorun yoktur.
    Gelelim devreye…

    Programda PIC çıkışları Ortak katoda Göre ayarlanmıştır.
    Bunun için pıc çıkışlarını güçlü bir NPN transistörle sürmen gerekir.
    Bunun için BD 241C kullanabilirsin.veya mosfet(Nkanal)kullanman gerekir

  • yusuf son

    dediklerinizi yapıyorum..sekmentleri tek tek yakıyorum. rakamları oluşturuyorum..hazır displayli devre ile birleştirdiğimde segmentlerin hepsi yanıyor… acaba transistörlerimde zaman gecikmesimi oluyor diye düşünüyorum..yani segmentleri yedi tarnsistörle sürüyorum rakamların ortak katotlarını üç transistörle sürüyorum. rakamları göremiyorum..kırpmaları görüyorum ama tam rakam görünmüyor.. kafayı yiyeceğim…..

  • özgür

    “Hayır Tabiki de kullanacağız. Hem istersek 999999….. sayan program bile yaparız.” da hocam sanırım yazının bir kısmı eksik. transistörleri nasıl bağlamamaız gerekiyor ? benim elimde pic değil başka bir mikrokontrolor var. 8 portu var. bcd converter kullanmadan ben de yakabilir miyim ? günlerim geçti bilgisayar başında bulamadım bir türlü tarama tekniğini en çok sizin yazınız umut verdi teşekkür ederim

    • Mustafa Dinç

      ben bu proğramı kendi anladığım şekilde yazdım ama, belek yetmedi!
      sanırım bu proğramda hata var

  • semih yıldırım

    Hocam birşey soracağım ben bu button function`ı bir türlü kullanamadım. displayde sayılar bastığım sürece artmaya devam ediyor. eğer mümkünse çok basit bir örneğini paylaşabilirmisiniz. ya da ben yazdığım kodu göndereyim nerede hata yaptığımı söyleyebilirmisiniz.

    void main() {
    int a=0;

    char x[10]={63,6,91,79,102,109,125,7,127,111};
    bit eski_durum;

    trisb=0x00;
    portb=0;
    trisc=0x02;
    do
    {
    if(button(&portc,1,1,1)) {
    eski_durum=1;

    portb=x[a];
    delay_ms(500);
    a++;
    if(a==10)a=0; }
    if(eski_durum&&(&portc,1,1,0)) {

    portb=portb+1;
    eski_durum=0;}}while(1);
    }

  • Mustafa Dinç

    Hocam öncelikle salyongoz hızında da olsa yol alıyoruz, bence önce mantıksal işlemlere sonra aritmatik işlere doğru ilerlersek daha anlaşılır olur, malum yazıtlarınız size daha kolay anlaşılır olsa da biz yeni başlayanlar için çoğu havada kalıyor, yinede buraya kadar gelebildik verdiğiniz özveri için çok teşekkür ederiz

  • FURKANKOCABAŞ

    hocam bende easypıc7 geliştirme kiti var kodu yazıyorum cmcon=7 de hata veriyor nedeni ne olabilir