Elektronik / Elektronik Kaynakları/

MikroC Dersleri 4

Sponsorlu Bağlantılar

Merhaba elektronik Severler…

Bir önceki dersimizde Döngüler konu başlığı altonda for while do while döngülerini ve ilgili programları inceledik.

Bugün Dersimizde bugüne kadar gördüklerimizi uygulamalarda kullanmaya çalışacağız ve dizilere değinip kısa bir örnek program yazıp dersimizi bitireceğiz.

C ile pic progralmalaya hakim olmak istiyorsak bu dersimizden sonrası 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.

Pic programına dahil ettiğimiz değişken değerleri veya sayılar dış dünyada ikilik sayı sisteminde olan karşılıkları ile aktarılır.Yani örneğin PORTB=5; şeklinde yazdığımız bir programın gerçek dünyadaki görüntüsü (portb 8 bittir) 00000101 şeklindedir.

Bir programa değişken değerlerini onluk olarak (1,2,3,7,5 gibi), ikilik olarak (PORTB=01010011,1111111,01010111gibi) yada hexadecimal olarak (onaltılık sayı sistemi)(PORTB=0x0A,0x14,0x15,0xff,0x00) gibi yazılmalıdır.

Pic seçimi yaparken pic donanımsal özellikleri pin sayıları, pwm, adc, comp modülleri var mı işimize gerekiyor mu yazacak olduğumuz programın kaplayacağı boyut ne kadar olacak pic hafızası bu alana yetecek mi, pic ne kadarlık hızı destekliyor gibi özelliklerine dikkat edilerek seçilmelidir.

Projelerimizde çoğunlukta kullanacağımız 16F628A dahili osilatöre sahiptir.1 tane donanımsal pwm modülüne sahiptir.3tane 10bitlik Analog dijital çevirici (adc) modüle sahip bir işlemcidir. 20Mhz hıza kadar çalışmaktadır.

Pic devrelerinde besleme gerilimini 5V a sabitlemek için 7805 pozitif gerilim düzenleyici entegreleri kullanılmaktadır.

Projelerde 16F628A için MikroC proje ayarlarını resimdeki gibi yapın.Bu ekran Project sekmesi içinde edit Project penceresidir.

microc-dersleri-configuration-bits

Eveeett Gelelim dersimize. Bu dersimizde 7segment display kullanarak 0-9 arası sayac oluşturalım Ve ikinci uygulama olarak Bir butona her bastığımızda gösterilen değeri bir artıran programı yazalım. Programımızı yazmadan 7 segment displayda karakter oluşturmak için bu displayleri inceleyelim.

microc-7segment

Bu degerler harflere göre verilmelidir. Aşagıdaki tabloda harflere göre kodlar mevduttur

microc-bdc-inputs-segment-outputs

Displayler iki çeşittir ortak katotlu yada ortak anotlu displayler piyasada yaygındır. Biz programlarımızda ortak katotlu kullandığımızı varsayacağız. Bu displayleri çıkış uçlarından sırası ile pic portlarına bağlarsak pic portlarınada hangi sayıyı oluşturmak istiyorsak ona uygun kodu göndermemiz gerekmektedir.

7 Segment display animasyonu (kaynak : http://talkingelectronics.com)

7-Segment-Display-0-9-Animation

Ayrıca kendi hazırladığım exel 7 segment kod dönüştürücüsüde ekte mevcuttur.

İlk programımız 0-9 arası 1saniye ara ile sayan sayıcı programı


unsigned char sayac=0;/*değişkenlerin ilk değeri burada verilebilir*/
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=0;
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 (sayac==0)PORTB=63;
if (sayac==1)PORTB=6;
if (sayac==2)PORTB=91;
if (sayac==3)PORTB=79;
if (sayac==4)PORTB=102;
if (sayac==5)PORTB=109;
if (sayac==6)PORTB=125;

if (sayac==7)PORTB=7;
if (sayac==8)PORTB=127;
if (sayac==9)PORTB=111; /*buraya kadar sayıları Display görüntü karşılıkları portbye gönderiliyor*/
/*sayma işlemi 1saniye ara ile yapılıyor*/
sayac=sayac+1;/*sayac değişkeni bir artırılıp tekrar sayac değişkenine yazılır.*/
if(sayac==10)sayac=0;/*sayac değeri kontrol ediliyor ve 9a kadar saymasını istediğimiz için sayac10 olur olmaz sıfırlıyoruz*/
delay_ms(1000);
}
}

Siz de bu uygulamayı kendiniz değişik şekillerde yapın. (if yerine else if kullanmayı yada switch case yapılarını kullanmaya çalışın)

Şimdi buton kontrolünde sayıcı programını yazalım



unsigned char sayac=0;/*değişkenlerin ilk değeri burada verilebilir*/
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=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 (sayac==0)PORTB=63;
if (sayac==1)PORTB=6;
if (sayac==2)PORTB=91;
if (sayac==3)PORTB=79;
if (sayac==4)PORTB=102;
if (sayac==5)PORTB=109;
if (sayac==6)PORTB=125;
if (sayac==7)PORTB=7;
if (sayac==8)PORTB=127;
if (sayac==9)PORTB=111;
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.*/
if(sayac==10)sayac=0;/*sayac değeri kontrol ediliyor ve 9a kadar saymasını istediğimiz için sayac10 olur olmaz sıfırlıyoruz*/
delay_ms(200);
}}}


Buraya kadar geçen haftaların tekrarını da yapmış olduk.

Şimdi gelelim dizilere.

Diziler iyi bir programcı olmayı düşünüyorsak bilmemiz gereken en önemli kullanımlardan biridir.Hemen hemen tüm programlardadiziler oldukça yoğun kullanılmaktadır.

Örneğin bir fabrikada on ayrı yerin sıcaklığını ekrana belirli süre aralıklarıyla yazdırmamızı sağlayan bir program gerekli olsun. Bu fonksiyonun kabaca yapılışı

Yazdır_1.sıcaklık;
Bekle
Yazdır_2.sıcaklık;
Bekle
Yazdır_3.sıcaklık;
:
:
Yazdır_10.sıcaklık,

Şeklinde 10 satır yazmamız gerekir tüm programlarımızı bu şekilde yazarsak bize sayfalar yetmeyecektir buda iyi bir programcıda olması istenmeyen bir özelliktir. İyi programcı bir işi kabaca ve uzun uzadıya yapmak yerine fonksiyonları kullanarak en kısa satırda yapmalıdır.

Bunu dizilerle yapabilmemiz için öncelikler programımıza dizi tanımlaması yapmamız gereklidir.
Bu tanımlamayı önceki derslerimizde değindiğimiz gibi değişken tanımlamadaki kurallara uygun yapmamız gerekir.

Şimdi sıcaklık dizisini tanmlayalım

Dizimiz kaç değeri tutacak bunu belirlemeliyiz Üstteki tanımlamalar için 10 değer tutacak
Sicaklik[10]={0,1,2,3,4,5,6,7,8,9}/*buraya 0n değer yazılabilir*/

1.ortamın sıcaklığı=Sicaklik[0];
Bekle
2.ortamın sıcaklığı=Sicaklik[1];
Bekle
3.ortamın sıcaklığı=Sicaklik[2];
:
10.ortamın sıcaklığı=Sicaklik[9];

Burada da mı on satır yazdık sanki !?.

Hayır buradaki yaptığımız 10satır işin mantığını kavramak için Bakın 10 satırı (bu 100, 500de olabilir) nasıl kolaylıkla yazacağız.

İnt sayac;
For(sayac=0;sayac<10;sayac++){
(Sayac+1).ortamınsıcaklıgı=sicaklik[sayac]
Bekle;
}

Burada yazdığımız programı incelersek

İlk değeri 0 olan sayac

Sayac+1 =1;olur

1.ortamınsıcaklığı=sicaklık[0]; sıcaklık dizisinin 0. Değeri 1 ortamla eşleştirildi

Bir süre bekledik for döngüsü içinde sayac 1 oldu

Sayac+1=2;olur

2.ortamınsıcaklığı=sicaklık[1];
:
:
:seklinde döngü 10 defa gerçekleşir ve on ayrı ortamın sıcaklığı 4 satırda yazılmış olur.

Şimdi konuyu pekiştirmek adına Üstteki sayaç örneğini dizi ile yapalım


unsigned char sayac=0;/*değişkenlerin ilk değeri burada verilebilir*/
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ü */
PORTB=display[sayac];/*sayaci display içine yazdık ve sayaç kaç ise örneğin5  display dizsinin 5.elemanı olan 6nın göstergesi portbye gönderilir*/
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.*/
if(sayac==10)sayac=0;/*sayac değeri kontrol ediliyor ve 9a kadar saymasını istediğimiz için sayac10 olur olmaz sıfırlıyoruz*/
delay_ms(200);
}}}

Ve programımızın dizi ile yapılmış hali işlemi nekadar kısalttı :) Bu dersimizde bukadar arkaadşlar.dizi programının dosyaları MikroC Dersleri 4

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

İyi çalışmalar diliyorum

Kolay gelsin.

aytacdurgen@gmail.com

  • ferit06

    Projelerimizde çoğunlukta kullanacağımız 16F628A dahili osilatöre sahiptir.1 tane donanımsal pwm modülüne sahiptir.3tane 10bitlik Analog dijital çevirici (adc) modüle sahip bir işlemcidir. 20Mhz hıza kadar çalışmaktadır.

    Denilmiş ancak 16F628 de ADC yoktur. Metnin düzeltilmesi ve bunun yerine ADC kullancaksanız 16f819 öneririm.

  • Hakan

    tüm dersleri dinletim.örneklerin daha gelişmişlerini yaptım diğer dersleri sabırsızlıkla bekliyorum.1 dersinizide kesmeler,analog-digital girişler,pwm nasıl ayarlanır hangi registerlar kontrol edilmedi diye açıklarsanız sevinirim.Emeğinize sağlık.Acaba microc yi anlatan bildiğiniz kitap varmı daha detaylı öğrenmem için sizin faydalandığınız kaynağı söylerseniz bizde onu alırız .

  • aytaç dürgen

    Merhabalar. @Ferit:Düzeltme için teşekkür ederim. 3 ad VREF Comp var 12f675den 877 den çağrışım yaptı sanıyorum.

    @Hakan: Ben mikroC derleyicisinin help den library manager bölümündeki açıklamalarından öğrendin. Kullandığım kitap yok ancak help deki İngilizce kaynağın türkçe çevirisi elektrovadi.com sitesinde(mikroC nin resmi distribitörü) satılıyor dilerseniz oran alabilirsiniz. Ama acele etmezseniz Pıc ile bir çok işi yapabilecek kısma kadar dersleri götüreceğim.
    LCD RF pwm SPİ onewire (sıcaklık okuma) vs uygulamalar yer vereceğim.

  • Hakan

    anladım.benim amacım sayıcı uygulamaları,pwm uygulamaları,ve voltmetre-ampermetre yapmak şuan yapabiliyorum bunları ama çok iyi değil sürekli takıldım yerler oluyuor onlarıda inşallah. sizle aşacağız saygılar…

  • Erkan Karakaş

    hocam dersler güzel güzel gidiyor. sonraki derste 4 digit 7 segment displayde tarama yöntemi ile ilgili bir örnek yapabilir misiniz? bu konuyu çok merak ediyorum. kolay gelsin teşekkürler…

  • yunus

    uzun zamandır ccsc kullanıyordum,güzel özellikleri var ama ne zaman özel proje yapmak istesem beni çıldırtıyor,şimdi microc kullanıyorum ,ilk başlayanlarda dahil kesinlikle microc kullanılmalı,.. hocam teşekkür ederiz,başarılar dilerim

  • Ruzgar

    While döngüsü ile yapmak isteyen arkadaşlarımız için ;

    while(PORTA.B0==1){ /*eğer butona basılı ise 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(50);
    if(sayac==10)sayac=0; /*sayac değeri kontrol ediliyor ve 9a kadar saymasını istediğimiz için sayac10 olur olmaz sıfırlıyoruz*/
    }}}

  • Tarık

    Hocam birşey sorabilirmiyim trisb=0x00; ifadesi ne anlama geliyor?

  • Adem ESEN

    trisb port b nin 8 bitine yönlendirir tris a ise port anın 5 bitine yönlendirir