PIC18F452 Hakkında Bilgi C dili PIC Uygulamaları

| Aralık 16, 2019 Tarihinde güncellendi
PIC18F452 Hakkında Bilgi C dili PIC Uygulamaları

C dili ile hazırlanmış projeler (ccs c) derleyiciler,mikrodenetleyiciler ile ilgili bilgilerin yanısıra pic18f452 hakkında Türkçe bilgiler bulunmakta Emeği geçen Kişilere Teşekkürler

PCBway Türkiye PCB Manufacturer PCB Assembly

Proje II kapsamında, hocalarımın referansı doğrultusunda Microchip firmasının ürettiği PIC mikrodenetleyicileri ile otomatik kontrol uygulamaları geliştirmeyi amaçladım.Bu nedenle PIC ile otomasyon sistemleri, C programlama dili, PICALL programlama kartı, CCS PCW C derleyicisi hakkında bilgi edindim.

Edinilen bilgiler doğrultusunda ;

  • Soldan sağa ardından sağdan sola kayan ışık
  • Analog/Dijital Çevirici
  • PWM ( Pulse Width Modulation )
  • LCD kullanımı
  • PIC ile bilgisayarı seri port üzerinden haberleştirme
  • Bootloader
  • Kayan yazı panosu

uygulamaları gerçekleştirildi.

Bu uygulamalar gerçekleştirilmeden önce birtakım hazırlık aşamalarında geçildi.Bu hazırlık aşamaları hakkında bilgi vermem gerekirse ;

Gerekli Yazılımların Elde Edilmesi

Proje kapsamında birçok yazılım kullanıldı.En çok yararlanılan programlar ise Proteus, Picall, CCS C derleyicisi oldu.

Proteus Programı

Proteus, neredeyse tüm PIC mikrodenetleyicilerini simülasyon desteği vermesinden dolayı tüm uygulamalarda başvurulan bir araç oldu. Gerçekleştirilen tüm programların bilgisayar ortamında analiz edilmesi ve hatalarının ayıklamasında kullanıldı.Bunun dışında neredeyse tüm elektrik-elektronik elemanlarının ve devrelerinin simülasyonunu gerçekleyebilmesi bakımından da proje boyunca çeşitli zamanlarda birçok kez başvuruldu .Program hakkında detaylı bilgi için Labcenter sitesi ziyaret edilebilir.

Picallw Programı

Picallw bilgisayar programı ise kullandığımız PIC programlama kartının bilgisayar arayüzüdür.12, 16 ve 18 serisi picleri rahatlıkla programlayabilir.Bunun için paralel portun 8 pinini kullanana program derleyici ile hazırladığımız hex uzantılı dosyaları saniyeler mertebesinde mikrodenetleyicimize yükleyebilir.

Yükleme yapmanın yanı sıra mikrodenetleyicideki programı okuyabilir,silebilir ve doğrulayabilir.Program aracılığı ile config birlerinin ayarlarıda yapılabilmekte.Programı indirmek ve deyatlı bilgi alamk için Picallw sitesi ziyaret edilebilir.

CCS C Derleyicisi

CCS C yazılımı C dilinde yazılan programın makine diline yani hex koduna dönüştürülmesini sağlayan derleyici olarak kullanıldı.Piyasada birçok derleyici bulanmasına rağmen, gelişmiş yardım menüsü, kısaltılmış komut sistemi, kullanışlı düzenleyicisi ve internet üzerinde birçok örnek program bulunması sebebiyle ccs c tercihim oldu.

CCS sayesinde asm ile sayfalarca sürebilecek kod yazımı kısa komutlar sayesinde birkaç satırda halledilebilmektedir. Daha detaylı bilgi için ccsinfo sitesini ziyaret edilebilir.

Pic Programlama Kartı

Derleyicide yazılan kodun mikrodenetleyiciye aktarılması için kullanılanılan elektronik karttır.Piyasada paralel-seri port ve usb arabirimini kullanabilen birçok programlayıcı mevcut.Ben projemde picallw programlama kartını kullandım.Kart bilgisayar arayüzü olarak picall programını kullanmakta. En son 0.16 versiyonu yayınlanmış olan program, internet üzerinden ücretsiz olarak elde edilebilir.8 , 18 ve 40 pin denetleyicileri programlayabilen kart ayrıca eeprom yazma/okuma işleminide gerçekleyebiliyor.

Programalama kartını kullanırken 18F452 mikrodenetleyicisini picall ile programlamayı gerçekleştiremedim.Bu yüzden diğer bir programlayıcı olan Winpic v.3.55 yazılımını kullandım.Bu programın bünyesinde usb ve seri/pararlel port bağlantılarını kullanabilen birçok ayar mevcut.Picallw donanımı ile 18F452’yi Winpic programındaki PG3B ayarı ile programladım.

Programlama Kartı baskı devre ve yerleşim planları
pic18f452-programlama-kart-pcb-yerlesim pic18f452-programlama-kart-pcb-ust pic18f452-programlama-kart-pcb-alt

PIC programlayıcı parça listesi
programlayici-parca-listesi

Mikrodenetleyiciler Hakkında Genel Bilgiler

Mikrodenetleyici Nedir? : Bir bilgisayar içinde bulunması gereken Hafıza , Giriş/Çıkış ünitesi gibi elemanların CPU ile birlikte tek bir entegre (chip) içerisinde üretilmiş haline Mikrodenetleyici denir. Böylece hem yer tasarrufu yapılıp maliyet düşürülürken hem de tasarım kolaylaştırılmış ve programlama işlemi basitleştirilmiş olur.

Günümüzde mikrodenetleyiciler otomobillerden kameralara , cep telefonlarından oyuncaklara kadar sayılamayacak alanlarda kullanılır. Mikrodenetleyiciler birçok firma tarafından üretilmektedir. Microchip , Intel , Motorola , SGS Thomson, Hitachi gibi …

Her üreticinin en az birkaç mikrodenetleyicisi vardır. Mesela ; Microchip 12C508 , 16C84 , 16F84 ve 16F877 gibi farklı mikrodenetleyicilere sahiptir ve hemen, hemen aynı komutlarla programlanırlar.

Mikrodenetleyici adlarında bulunan harfler aynı aile içinde farklı özelliklere sahip (hafıza yapısı ve miktarı, hız gibi) elemanları ifade eder. Bir uygulama yapmadan önce hangi firmanın , hangi numaralı mikrodenetleyicisinin kullanılacağı tespit edilmelidir. Bunun için KATALOG (Data sheet) adı verilen kaynaklardan ya da internetteki ilgili sitelerden faydalanılır.

Bir Mikrodenetleyici İçinde Bulunabilen Bazı Özellikler Şunlardır :

  • 1 ) Programlanabilir Dijital Giriş / Çıkış ( I / O )
  • 2 ) Programlanabilir Analog Giriş
  • 3 ) Seri Giriş / Çıkış ( I / O )
  • 4 ) Darbe( Pals ) – PWM (Darbe genişlik modulasyonu) işareti çıkışı
  • 5 ) Harici hafıza bağlanabilme
  • 6 ) Dahili hafıza seçenekleri ( ROM , PROM, EPROM , EEPROM, Flash gibi )
  • 7) Kesme, Zamanlayıcı ve Sayıcı gibi özellikler.

PIC Mikrodenetleyicilerin Diğer Bazı Avantajları :

  • 1 ) Destek Yazılımları internetten ücretsiz sağlanır.
  • 2 ) Çok yaygın ve ucuzdur. Hem profesyonel hem de amatör kullanıma uygundur.
  • 3) İnternette ve kitap/dergilerde çok sayıda örnek programlar vardır.
  • 4) Çok az ve basit birkaç elemanlarla ( direnç , kondansatör ) donanımları kurulabilir.
  • 5 ) Komut sayısı az ve basittir.
  • 6 )Daha üst seviye diller için (PIC C, PicBasic gibi) Derleyiciler’e (compiler) sahiptir.

Pic Mikrodenetleyiclerinin Özellikleri

Güvenirlik: PIC komutları bellekte çok az yer kaplarlar. Dolayısıyla bu komutlar 12
veya 14 bitlik bir program bellek sözcüğüne sığarlar. Harward mimarisi teknolojisi
kullanılmayan mikrokontrolörler de yazılım programının veri kısmına atlama yaparak bu
verilerin komut gibi çalıtırılmasını salamaktadır. Bu da büyük hatalara yol açmaktadır.
PIC’ ler de bu durum engellenmitir.

Hız : PIC oldukça hızlı bir mikrokontrolör’ dür. Her bir komut döngüsü 1µsn’ dir.5 milyon komutluk bir programın 20Mhz’ lik bir kristalle iletilmesi yalnız 1sn sürer. Bu süre 386SX33 hızının yaklaık 2 katıdır. Ayrıca RISC mimarisi ilemcisi olmasının hıza
etkisi oldukça büyüktür.

Komut seti : PIC’ in 16C5X ailesinde bir yazılım yapmak için 33 komuta ihtiyaç 16CXX araçları için bu sayı 35’ tir.18FXXX serisinde ise komut sayısı 75 dir. PIC tarafından kullanılan komutların hepsi yazmaç (register) temellidir. Komutlar 16C5X ailesinde 12 bit, 16CXX ailesinde 14 bit 18FXXX ailesinde ise 16 bit uzunluğundadır. PIC’ te CALL, GOTO ve bit test eden BTFSS ve INCFSZ gibi komutlar dışında diğer komutlar 1 saykıl çeker. Belirtilen komutlar ise 2 saykıl çeker.

Statik işlem : PIC tamamıyla statik bir işlemcidir. Yani saat durdurulduğunda da tüm yazmaç içeriği korunur. Pratikte bunu tam olarak gerçekletirebilmek mümkün değildir. PIC mikrosu programı iletilmediği zaman uyuma (sleep) moduna geçirilerek micronun çok düşük akım çekmesi sağlanır.

Sürme özelliği (Sürücü kapasitesi): PIC yüksek bir çıktı kapasitesine sahiptir. Tek bacaktan 40mA akım çekebilmekte ve entegre toplamı olarak 150mA akım akıtma kapasitesine sahiptir. Entegrenin 4mHz osilatör frekansında çektiği akım çalışırken 2mA, stand-by durumunda ise 2µA kadardır.

Seçenekler : PIC ailesinde her türlü ihtiyaçların karılanacaı çeitli hız, sıcaklık, kılıf, I/O hatları, zamanlama (Timer) fonksiyonları, seri iletiim portları, A/D ve bellek kapasite seçenekleri bulunur.

Çok yönlülük : PIC çok yönlü bir mikrodur ve ürünün içinde, yer darlığı durumunda birkaç mantık kapısının yerini değitirmek için düşük maliyetli bir çözüm bulunur.

Güvenlik : PIC endüstride en üstünler arasında yer alan bir kod koruma özelliğine sahiptir. Koruma bitinin programlanmasından itibaren, program belleğinin içeriği, program kodunun yeniden yapılandırılmasına olanak verecek ekilde okunmaz.

Geliştirme: PIC program geliştirme amacıyla programlanabilip tekrar silinebilme özelliğine sahiptir. (EPROM, EEPROM) Aynı zamanda seri üretim amacıyla bir kere
programlanabilir (OTP) özelliğine sahiptir.

Liste dosyası : Assembler tarafından yaratılan ve kaynak dosyadaki tüm komutları hexadecimal sistemdeki değerleri ve tasarımcının yazımı olduğu yorumlarıyla birlikte içeren bir dosyadır. Bir programı bug’lar dan arındırırken kullanılacak en yararlı dosya
budur. Çünkü bu dosyayı izleyerek yazılımlarda neler olup bittiğini anlaşılması kaynak
dosyasından daha fazladır. Dosya uzantısı .LST dir.

Projede Kullanılan Mikrodenetleyiciler

Projemde 16F877 ve 18F452 olmak üzere iki farklı mikrodenetleyici kullandım.Ağırlıklı olarak 18F452 kullandığım için bu denetleyicinin özelliklerini şöyle sıralayabiliriz;

  • Yüksek hızlı RISC ilemciye sahiptir;
  • 75 adet komut mevcuttur;
  • Tüm komutlar 1 saykıl çeker
  • 40 Mhz’ye kadar işlemci hızına sahiptir
  • 32Kbyte flash hafıza
  • 256 byte eeprom bellek
  • Power-on Reset (POR), Power-up Timer (PWRT)
  • Watchdog Timer (WDT);
  • 10 bit analog/dijital çevirici
  • Programlanabilen kod koruma;
  • Enerji tasarrufu için uyku (SLEEP) modu;
  • Tamamen statik dizayn;
  • Devre üzerinde seri programlama
  • 5 V’luk kaynak ile çalışma
  • Düşük güç harcama
  • < 2 mA typical @ 5V, 4 MHz
  • 20 mA typical @ 3V, 32 kHz
  • < 1 mA typical standby

Şekil 2.1 de 18F452 nin pin bağlantıları verilmiştir.Bu bağlantıları kısaca açıklarsak; Denetleyici toplam 5 porttan meydana gelmektedir.Bunlar A,B,C,D ve E portlarıdır.Bütüm portlar dijital giriş/çıkış olarak kullanılabilir.

A portu 6 giriş/çıkışa sahiptir ve dijital giriş çıkış olarak kullanılabilir.

B portu 8 giriş/çıkışa sahiptir.Bu portun 0,1,2,3,4 nolu pinleri harici kesme girişi olarak kullanılabilir.

C portu 8 giriş/çıkışa sahiptir.Pwm, capture/compare, spi ve bilgisayar ile seri iletişim kurma gibi işlevleri vardır.

D portu 8 giriş/çıkışa sahiptir.Paralel slave port ile mikroişlemci portu olarak kullanılabilir.

E portu 3 giriş/çıkışa sahiptir.Analog/dijital çevirici olarak kullanılabilir.

Şekil 2.1 18F452 Pin Yapısı
pic18f452-bacak-baglantilari-pin-yapisi

Şekil 2.2 de PIC18F452 nin bellek miktarları ve önemli özellikleri görülebilir. PIC18F452 nin mikrodenetleyici sistemlerinde ortaya çıkabilecek çoğu ihtiyacı karşılayabileceği bu tablodadan da anlaşılmakta. 18F452 hakkında daha detaylı bilgi için www.microchip.com adresi ziyaret edilerek katalog bilgileri elde edinilebilir.

Şekil 2.2 18F452 Genel özellikleri
pic18f452-genel-ozellikler

Proje Uygulamaları

Yürüyen Işık, Analog/Dijital Çevirici ve Pwm Uygulaması

Şekil 3.1 de devresi görülen uygulama mikrodenetleyiciyi programlama ve çevre birimlerinin kullanılmasını öğrenilmesi açısında çok yararlı oldu.Devrede “Yürüyen Işık” butonuna basıldığında ledler soldan sağa ardından sağdan sola kaymaya başlar, “ADC” butonuna basıldığında RV1 potu aracılığıyla RA0 pininden alınan analog bilgi mikrodenetleyici tarafından ledler üzerinden dijital bilgiye dönüştürülür.”PWM” butonuna basıldığında ise doluluk/boşluğu RV1 potu ile ayarlanabilen frekansı sabit kare dağla elde edilir ve bu dalga devredeki osiloskop aracılığı ile gözlemlenebilir.

Uygulama 1’in proteusda hazırlanmış simülasyon devresi

yuruyen-isik-analog-dijital-cevirici-pwm-uygulamasi

Uygulama-1 program kodları aşağıdaki gibidir;

NOT: C dilinde // karakterlerinden sonra yazılan ifadeler derleyici tarafından işlenmez.Bu karakterlerden sonra kullanılan tanımlamalar genelde açıklayıcı ifade olarak program kodunda yer alır.

#include <18F452.h>
#device ADC=8
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)        //4 Mhz osilatör hızı
#byte porta = 5         //porta tanımlaması
#byte portb = 6        //portb tanımlaması


void isik(void);  	//////////////////////////////////
void adc(void);   	// Kullanılacak fonksiyonlar tanımlandı  //
void pwm(void);   	/// ///////////////////////////////


void main() {


while(true){

output_low(pin_c2);                    // pwm i açıp kapattıktan sonra çıkış değerinin
// +5 de kalması engelleniyor.

if (bit_test(porta,1) == 0) isik();           //porta 1.buton yürüyen ışığa geç

delay_ms(100);


if (bit_test(porta,2) == 0) adc();             // porta 2.buton adc'e geç
delay_ms(100);


if (bit_test(porta,3) == 0) pwm();
delay_ms(100);                  // porta 3.buton pwm'e geç..




output_b(0xff);         //////////////////////////////////////////////////
delay_ms(100);         //bir butona basılana kadar bu efekt devam eder..//
output_b(0x00);        ///////////////////////////////////////////////////
delay_ms(100);

}

}

/////////////////////////////* Yürüyen Işık Fonksiyonu**///////////////////


void isik (void) {


while(true){
output_b(0b00000001);
sol:
if (bit_test(PORTB,7)) goto sag;
delay_ms(200);
PORTB<<=1;
goto sol;
sag:
if (bit_test(PORTB,0)) goto sol;
delay_ms(200);
PORTB>>=1;
goto sag;


}

}


///////////////////* Analog Dijital Çevirici *////////////////////

void adc (void){


int i;
long deger,max,min;

setup_adc_ports(RA0_ANALOG);        // sadece RA0 pini analog olarak tanımlandı
                                                              //diğer pinler digital giriş/çıkış
setup_adc(adc_clock_internal);
set_adc_channel(0);                  // RA0 giriş olarak belirleniyor


while(true){

delay_ms(1);

deger=read_adc();                 //analog deger RA0 girşinden okunuyor


output_b(deger);                 //B protunda analog değer dijital olarak gösterilir

}

////////////////////// PWM FONKSİYONU ////////////////


void pwm (void) {


long deger;

setup_ccp1(ccp_pwm);                                        //Yakalama modu PWM olarak ayarlandı.
setup_timer_2(t2_div_by_16, 255,1);                   //PWM ferakansı ayarlandı

setup_adc_ports(RA0_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel(0);

while(true){

deger=read_adc();
set_pwm1_duty(deger);

}}
        ////////////////// PROGRAM SONU //////////////

LCD Uygulamaları

LCD mikrodenetleyicide yapılan işlemler ve elde edilen sonuçların kullanıcıya ulaşmasını sağlayan bir araçtır.Değişik firmalar tarafından üretilen LCD modülleri, küçük hesap makinaları veya mikrodenetleyicili sistemlerde çok az bir çaba ile etkili bilgi sunuşunu sağlarlar. LCD’ler yaygın olarak 1 ile 4 satır arasında değişmekte ve her satırda 16’dan 40’a kadar karakter olabilmektedir.

Bir LCD’deki her bir nokta gösterge karakteri 5*7 veya 5*10 noktalı olabilmektedir.LCD’ler baskılı devreye karakter üreticisi ve sistem kontrolörü ile birlikte monte edilmiştir. LCD’lerin çeşitli olmasına karşın kontrolörle iletişim protokolü standarttır.LCD arabirimi TTL uyumludur. LCD 4 veya 8 bit bir veri yoluna bağlanabilir.

4 bit veri yolu mimarisinin gerçekleştirilmesi, mikrodenetleyiciye başka amaçlarda kulanılan 4 bit kazandırır buna karşın gösterge ile haberleşme süresi iki katına çıkar ki bu gecikme çok önemli değildir.LCD için 3 kontrol hattı gerekir. LCD lojik devreleri için 5V ve LCD sürücüsü için ise ayrı bir beslemeye ihtiyaç vardır.

Bit Veri Yolunu Kullanan LCD Pin Bağlantıları

bit-veri-yolunu-kullanan-lcd-pin-baglantilari

Bu şekilde D4,D5,D6,D7 ile gösterilen pinler lcd’nin 4 bitten oluşan veri yollarıdır.
E ucunun düşen kenarında veri yolundaki komut ya da veri lcd’ye aktarılır.Gönderilecek komut ya da veri veya okunacak veri bu uca düşen kenarlı bir işaret uygulanarak lcd’ye bildirilir.

RW ucu lcd’ye yazma ya da lcd’den okuma işlemlerinden hangisinin yapılacağını lcd’ye bildirmek için kullanılır.RW=1 ise lcd’den okuma, RW=0 ise lcd’ye yazma işlemi yapılır.

Rs ucu lcd’ye gönderilen veri yolundaki bilginin komut ya da veri olduğunu lcd’ye bildirmek için kullanılır.Lcd’ye gönderilen bilgi RS=1 ise veri, RS=0 ise komut olarak algılanır.

LCD ile Kayan yazı Uygulaması

Bu program “yazi” adli diziye atanmış kelimeleri belirli zaman aralığıyla soldan sağa kaydırır.

#include <18f452.h>
#include 
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE   // lcd yi B portu üzerinden kullanıyoruz
#include  	     // gerekli lcd rutinlerini içeren program


void main()
  {
   
   char yazi[]="Kocaeli Universitesi Elektrik Muhendisliği 040205033";  

   //kaydırılacak metin
   
	
   int a;             //////////////////////
   int git=1;     ////gerekli değişkenler////
   lcd_init();    //////////////////////

   delay_ms(6);

   for (;;)
    				///kaydırma fonksiyonu//
 {

       git=1;			
       delay_ms(200);                  
       for (a=0;a

LCD ile Ekranda Belirli Aralıklarla Farklı Yazılar Yazdırmak

#include <18f452.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include  



   void main()
   {
      lcd_init();
      delay_ms(1);

      while(true)

      {

      printf(LCD_PUTC, "\f");


      lcd_gotoxy(1,1);
      printf(lcd_putc,"1992");
      lcd_gotoxy(1,2);
      printf(lcd_putc,"KOU");
      delay_ms(1500);


       printf(LCD_PUTC, "\f");

       lcd_gotoxy(1,1);
       printf(lcd_putc,"Erdinc Keloglu");
       lcd_gotoxy(1,2);
       printf(lcd_putc,"040205033");
       delay_ms(1500);


       printf(LCD_PUTC, "\f");

       printf(lcd_putc,"Kocaeli");
       lcd_gotoxy(1,2);
       printf(lcd_putc,"Universitesi");
       delay_ms(1500);

            }
            }

PWM’den Okunan Değerin LCD’ye Yazılması

#include <18f452.h>
#device ADC=8
#fuses  XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include  

void pwm(void);

void main() {
lcd_init();


while(true){

output_low(pin_c2); // pwm i açıp kapattıktan sonra çıkış değerinin +5 de kalması    

pwm();


}

    }


   ////////////////// PWM FONKSİYONU ////////////////


void pwm (void) {


int deger;
float lcdx,sonuc;

setup_ccp1(ccp_pwm);
setup_timer_2(t2_div_by_4, 255,1);

setup_adc_ports(RA0_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel(0);

while(true){

deger=read_adc();
set_pwm1_duty(deger);
lcdx=deger;
sonuc=lcdx/51;
printf(lcd_putc,"\f");
printf(lcd_putc,"PWM Cikis Degeri");
lcd_gotoxy(1,2);
printf(lcd_putc,"Cikis : %3.2f ",sonuc);
delay_ms(100);

}
}

Seri Haberleşme Ve Bootloader Uygulamaları

Bu uygulamada ise bilgisayar ve pic arasında haberleşme gerçekleştirildi. Bunu gerçekleyebilemk için 4 adet led ve bir tane 7 segment displayden oluşan bir devre tasarladım.Bilgisayar arayüzünü ile Visual Basic ile programladım.Bu uygulamadaki amaç bilgisayardan veri alıp pic üzerinde işlemek ve pic’den veri gönderip bilgisayarda bu veriyi okumaktı.S

Haberleşmeyi yaparken pic ile seri port arasında rs-232 tampon entegresini kullandım.Bu entegre ile bilgisayardan 13V luk alınan gerilim devresi pic ile uyum sağlayabilmesi açısında 5V TTL seviyesine çekilebilmekte.

Bu uygulumada aynı devre ile birlikte bootloader da kullandım.Bootloader’ı açıklarsak;
Bootloader “In-Curcuit-Programming” tekniğini uygulayabilmek için geliştirilmiş bir mikrodenetleyici yazılımıdır.Bootloader sayesinde seri iletişim noktası ile bilgisayara bağlanmış bir denetleyici ayrıca bir programlama kartına (örn; picallw gibi..) ihtiyaç duymadan programlanabilir.

Bu sayede üzerinde birçok kez değişikliğe gidilmesi gereken bir denetleyici defalarca kullanıldığı devreden çıkartılıp tekrar programala kartına takılması zorluğu ortadan kaldırılmış olur.Uygulama geliştirmede, özellikle programlamaya yeni başlamış kullancılar için büyük kolaylıklar sağlar.

Ben projemde www.microchipc.com sitesinin 16F877 için ücretsiz olarak kullanıcılara sunduğu bootloader’ını kullandım.Şekil 3.3 de seri iletişim ve bootlader için kurulması gereken devre görülmekte.Bu devre sayesinde bilgisayardan seri port ile denetleyici programlanabilir.Ayrıca devrede ledler ve display sayesinde seri iletişim uygulamaları gerçeklenebilir.

Bootloader’ı kullanabilmemiz için minumum şekil 3.4 deki devreye sahip olmamız gerekli. Devremizi kurduktan sonra Microchipc PIC16bootload linkini ziyaret edip bootloader için gerekli dosyaları bilgisarımıza indiriyoruz.

microchip-pic16f877-16f877a-bootloader

Burada bizim için önemli olan dosya şudur: PIC16F87xA_bootloader_v9-50.zip
Bu dosyayı bilgisayarımıza açtıktan sonra dosya içinden uygun işlemci, seri port hızı ve uygun osilatör için kendi hex dosyamızı buluyoruz. Örneğin ben 16F877, 9600 bps iletişim hızı ve 4Mhz osilatör için "60419 - bootldr-v26-16F876-77-04Mhz-9600bps.hex" dosyasını kullandım. Hex dosyasını bir kereye mahsus olmak üzere pic programlayıcı ile denetleyiciye yükledim.CCS de seri iletişim için yazdığım programa sadece

#org 0x1F00, 0x1FFF void loader16F876(void) {}

Satırını ekledim.Ardından microchipc sitesinden indirilen dosyalar içerisinden "PICbootPlus.exe" programını kullandım.Bu program ile denetleyiciye yüklenecek program seçilir.”Write” butonuna basıldığından programda “Searching for bootloader” ibaresi belirecektir.Bundan sonra devremizdeki reset butonuna basılmalıdır.Reset tuşuna basıldıktan sonra denetleyiciye program birkaç saniye içinde yüklenir.Bu şekilde bir programlayıcı karta ihtiyaç duymadan kendi uygulama devremiz üzerinden programlama yapılabilir.

Şekil 3.3 Bootloder ve Seri İletişim Uygulama Devresi

bootloder-seri-iletisim-uygulama-devresi

Şekil 3.3a Temel Bootloader Bağlantı Şeması

temel-bootloader-baglanti-semasi

Uygulamadan programın CCS kodları;

#include<16f877.h>
      #use delay(clock=4000000)
      #fuses   xt, NOWDT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, 
      #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
      #org 0x1F00, 0x1FFF void loader16F876(void) {}
      #use fast_io(c)
      #define led1 pin_a0
      #define led2 pin_a1
      #define led3 pin_a2
      #define led4 pin_a3




//////////////////////////////////////////////////////////////////////
      
 int i,j;
       int veri;
       void yukari_say();
       void asagi_say();
       void yurut();
       void saydir();

/////////////////////////////////////////////////////////////////////

char  const segment[10] = {0b01111110,  // 0
                           0b00001100,  // 1
                           0b10110110,  // 2
                           0b10011110,  // 3
                           0b11001100,  // 4
                           0b11011010,  // 5
                           0b11111010,  // 6
                           0b00001110,  // 7
                           0b11111110,  // 8
                           0b11011110};

char const ledler[4] = { led1,led2,led3,led4};

////////////kesme ile veri al /////////////////////////

#int_RDA
serin()
{
veri=getc();
if(veri=='a'){
printf("Yürüyen Işık");
yurut();
}
else if(veri=='b'){
printf("Aşağı Sayıyor");
asagi_say();
}
else if(veri=='c'){
printf("Yukarı Sayıyor");
yukari_Say();
}
else if(veri=='d'){
printf("A Portu Yandı");
output_a(0xff);
}
else if(veri=='e'){
printf("A Portu Söndü");
output_a(0x00);
}
else if(veri=='f'){
printf("Reset Atıldı");
delay_ms(1000);
reset_cpu();
}
else if(veri=='g'){
saydir();
}
}
////////////////////////////////////////////////////
void main()
{

set_tris_c(0b10000000);
enable_interrupts(int_rda);
enable_interrupts(global);
Printf("Cihaz Çalıştı");

output_a(0x00);
   
while(true){



}
}
//////////////////////////////fonksiyonlar////////////////////////////

////    yukari_say();  ////////////////

void yukari_say(void){
for(i=0;i<10;i++)   
{
output_b(segment[i]);
delay_ms(500);
}
output_b(0x00);
}

//////////     asagi_Say(); //////////////

void asagi_say(void){                                        
for(i=10;i>0;i--)
output_b(segment[i-1]);
delay_ms(500);
}
output_b(0x00);
}


///////////////ledler/////////////


void yurut(void){
j=1;
for(i=0;i<5;i++){
output_a(j);
delay_ms(200);
j=j*2;
}
j=8;
for(i=0;i<5;i++)
{
output_a(j);
delay_ms(200);
j=j/2;
}
}
//////////////////////////////////////
void saydir(void){
for (i=0;i<16;i++){
output_a(i);
printf("%D",i);
delay_ms(400);
}}

//////////////////////////////////////

Seri Haberleşme Bilgisayar Arayüzü

Şekil 3.3b de seri iletişimin bilgisayar tarafından gerçeklenmesini sağlayan Visual Basic’de yazılmış program arayüzü bulunuyor.

visual-basic-program-ara-yuzu

Bilgisayar arayüzünün Visual Basic’de yazılmış program kodları;

Private Sub Command1_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "a"
End If
End Sub

Private Sub Command10_Click()
Combo1.Enabled = True
Command9.Enabled = True
Command10.Enabled = False
seri.PortOpen = False
Shape1.BackColor = &HC0&
Form1.Caption = "Seri Port Kontrol --> Portlar Kapalı"
End Sub

Private Sub Command2_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "b"
End If
End Sub

Private Sub Command3_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "c"
End If
End Sub

Private Sub Command4_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "d"
End If
End Sub

Private Sub Command5_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "e"
End If
End Sub

Private Sub Command6_Click()
If seri.PortOpen = True Then
cikis = MsgBox("Şu an bilgisayarınızda açık port bulunmakta. Portları kapatıp çıkmak ister misiniz?", vbYesNo + vbInformation, "Seri Port Kontrol")
If cikis = vbYes Then
seri.PortOpen = False
Unload Me
End If
If cikis = vbNo Then
Form1.Show
End If
Else
Unload Me
End If
End Sub

Private Sub Command7_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.Output = "f"
End If
End Sub

Private Sub Command8_Click()
If seri.PortOpen = False Then
sonuc = MsgBox("PORT AÇIK DEĞİL", vbOKOnly + vbInformation, "Bir Hata Oluştu")
Else
seri.RThreshold = 1
seri.Output = "g"
End If
End Sub

Private Sub Command9_Click()
If Combo1.ListIndex = 0 Then
seri.CommPort = 1
seri.PortOpen = True
Command9.Enabled = False
Command10.Enabled = True
Combo1.Enabled = False
Form1.Caption = "Seri Port Kontrol --> COM1 Açıldı"
Shape1.BackColor = &HC000&

End If

If Combo1.ListIndex = 1 Then
seri.CommPort = 2
seri.PortOpen = True
Command9.Enabled = False
Command10.Enabled = True
Combo1.Enabled = False
Form1.Caption = "Seri Port Kontrol --> COM2 Açıldı"
Shape1.BackColor = &HC000&
End If
End Sub


Private Sub Form_Load()
Shape1.BackColor = &HC0&
Form1.Caption = "Seri Port Kontrol --> Portlar Kapalı"
Combo1.AddItem "COM1"
Combo1.AddItem "COM2"
Combo1.ListIndex = 0
Command1.Font.Bold = True
Command1.Font.Name = arial
Command2.Font.Bold = True
Command2.Font.Name = arial
Command3.Font.Bold = True
Command3.Font.Name = arial
Command4.Font.Bold = True
Command4.Font.Name = arial
Command5.Font.Bold = True
Command5.Font.Name = arial
Command6.Font.Bold = True
Command6.Font.Name = arial
Command7.Font.Bold = True
Command7.Font.Name = arial
Command8.Font.Bold = True
Command8.Font.Name = arial
    seri.Settings = "9600,N,8,1"
    seri.Handshaking = comNone
    seri.RThreshold = 1
    Command10.Enabled = False

End Sub



Private Sub Form_Unload(Cancel As Integer)
If seri.PortOpen = True Then
cikis = MsgBox("Şu an bilgisayarınızda açık port bulunmakta. Portları kapatıp çıkmak ister misiniz?", vbYesNo + vbInformation, "Seri Port Kontrol")
If cikis = 6 Then
seri.PortOpen = False
Unload Me
ElseIf cikis = 7 Then
Cancel = 1
End If
End If
End Sub


Private Sub seri_OnComm()
    Dim alinan As String
    If (seri.CommEvent = comEvReceive) Then
        alinan = seri.Input
        Label1.Caption = " "
        Label1.Caption = alinan
    End If
End Sub

Kayan Yazı Panosu

Bu uygulamada ise çevremizde de sıklıkla karşılaştığımız pano uygulaması yapıldı.Genelde bilgilendirme amaçlı kullanılan led panolar ile düşük maliyetli, sürekli güncellenebilen reklam, duyuru vs.. gibi işlemler gerçekleştirilebilir.

Ben projemde 8 satır 24 sütünlu bir pano uygulaması gerçekleştirdim.Bu sistemde ortak katod led matris kullanarak, matrisin satırlarını picin B portundan, sütünlarını ise 74154 demux entegresi ile işleme soktum.

İnsan gözü saniyede 40’dan fazla yanıp sönen bir lambayı sürekli yanıyormuş gibi gördüğü için devremde saniye 120 tarama yapılıyorum.Bu göz yanılması ile yazı sürekli kayıyormuş gibi gözükmekte.

Şekil 3.4 Kayan Yazı Panosu Uygulama Devresi

kayan-yazi-panosu-uygulama-devresi

Uygulama ile ilgili kod aşağıdadır;

#include <18f452.h>
#use delay(clock=4000000)
#fuses   xt, nowdt, put, noprotect, nobrownout, nolvp

void main()
{
int b,i,a,x,kayma,b_max; //döngüler için gerekli değişkenler

int yazi_sutun;//yazının sütün sayısı
int matris_sutun; //matris sutun



char metin[]={
0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//boşluk
0xFF,0x89,0x89,0x89,0x81,0x00,   // e
0xff,0x19,0x29,0x49,0x8f,0x00    // r
0xff,0x81,0x81,0x81,0x7e,0x00	 // d
0x84,0xFD,0x84,0x00, 	         // i
0xFF,0x04,0x08,0x10,0xFF,0x00,   // n
0x3f,0xa1,0xa1,0x21,0x00,        // ç
0x00,0x00,0x00,0x00, 	         // boşluk
0xFF,0x18,0x24,0x42,0x81,0x00,  // k
0xFF,0x89,0x89,0x89,0x81,0x00,   // e
0xFF,0x80,0x80,0x80,0x80,0x00,   // l
0x7e,0x81,0x81,0x81,0x7e,0x00    // o
0xfc,0x85,0xa5,0xe4,0x00,	 // ğ
0xFF,0x80,0x80,0x80,0x80,0x00,  // l
0xff,0x80,0x80,0x80,0xff,0x00   //u
};

char kayan[24];


set_tris_b(0x00);
set_tris_c(0x00);


yazi_sutun=100;//yazinin toplam sutun sayısı belirleniyor

matris_sutun=24;//kullanılan matrisin sutun sayısı

while(true){

for(kayma=0;kayma

Sonuç

Yaptığım bu proje çalışması ile “Pic nedir, hangi alanlarda kullanılır, ne gibi kolaylıkları vardır” gibi sorulara cevaplar aranmıştır.Endüstride elektronik kartların halen birçok alanda kullanılması sebebiyle önümüzdeki yıllarda enindiğim bilgilerim dahada değerli olacağına inanıyorum.

Otomatik kontrol sistemlerinin önemli bir kısmını oluşturan mikrodenetleyiciler ve mikroişlemciler hakkında yapılabileceklerin sadece hayal gücüyle sınırlı olmasından dolayı devamlı kişişel gelişimin devam etmesi gerekli.

Bu açıdan proje boyunca C dili ile bir çok çalışma gerçekleştirdim.Bunlar bana donanım üzerinde hakimiyet ve yeni birçok bilgi edindirdi.Pic hakkındaki temel sorunları hallettikten sonra anolog/dijital çevrim, pwm, lcd, seri iletişim ve bootloader gibi denetleyicinin iç ve dış donanımlarını kullanabilir düzeye geldim.

Kaynaklar:

C Dili ile Pic Uygulamaları, Fevzi Sezgin,Musa Şanlı, Birsen Yayınevi, 2006
Mikrodenetleyiciler ve Pic programlama PIC16F84 Orhan Altınbaşak, Atlaş Yayıncılık, 2004
www. ccsinfo.com/forum
www.microchipc.com
www.antrak.com
www.picproje.com
www.microchip.com
www.blitzlogic.com

Yayım tarihi: 2008/12/25 Etiketler: , , , , , , , , ,



6 Yorum “PIC18F452 Hakkında Bilgi C dili PIC Uygulamaları

  1. selim dumluselim dumlu

    Selam
    Arkadaşım rs232 seri haberleşmeyi ISIS üzerinden Virtual port yerine senin yazmış olduğun VB arayüzünden çalıştırmak istiyorum olmuyor kendin denedinmi eğer ISIS te çalıştıysa biraz açıklama yaparmısın nerede hata yapıyorum acaba? Yardımın için şimdiden teşekkürler

    CEVAPLA
  2. emreemre

    sanal rs 232 arayüzü kullan google yaz indir programını aygıt yöneticisinde görürüsün sanal rs-232 com1-com2 diye

    CEVAPLA
  3. mustafamustafa

    rica etsem LCD ile Kayan yazı Uygulamasının hex kodunu ekler misiniz?

    CEVAPLA
  4. FujiFuji

    Allah razı olsun hepinizden dönem ödevm hiç bi yerde bulamamştım

    CEVAPLA
  5. Halil İbrahimHalil İbrahim

    PIC18F452 programlama kartının isisdeki bağlantı şemasını verebilirmisiniz.
    Dönem ödevim için gereklide ödevimde mikro denetleyici programlama kartının açık devre şeması isteniyor.

    CEVAPLA
  6. OguzhanOguzhan

    Merhaba benim sinavda cikan bir soru var. Soru şu ; Bir 18F452 için C dili ile hazırlanmış program (……….) uzantili kayit edilir.Derlendikden sonra (…….)uzantili olarak makine diline cevirilir. ben sinavda (.cc) ikincisi ise (.c) yaptim cevap ne peki

    CEVAPLA

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir