Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

MikroC ile PIC Programlama Mikrodenetleyiciler1 7.Hafta.

Benzer bir sunumlar


... konulu sunumlar: "MikroC ile PIC Programlama Mikrodenetleyiciler1 7.Hafta."— Sunum transkripti:

1 MikroC ile PIC Programlama Mikrodenetleyiciler1 7.Hafta

2 ÖNİŞLEMCİ KOMUTLARI # define kullanımı Ana programın dışında en üstte tanımlanır. # define MAX = 40 // programda MAX gecen heryere 40 sayısı yazılır. # define arttir PORTB.RB0 # define azalt PORTB.RB1 // PortB nin 0.biti arttir ucu 1. biti azalt ucu olarak tanımlandı. buton uygulamasında tercih edilebilir. ( ; ile satır sonlanmaz) # define motor PORTC.RC2 # define fan PORTD.RD1 // PortC nin 2. biti motor olarak, PortD nin 1.biti fan olarak tanımlandı. # include kullanımı #include #include “ degisken.h” ifadesi sistem (kütüphane) dosyalarında, “ ” ifadesi de kullanıcı tarafından yazılan dosyalarda kullanılarak programa eklenir. Diğer komutlar Assembly dillindeki ile benzer şekilde #if, #else, #elif, #endif, # ifdef, #ifndef,.. vs

3 Değişken Tipleri ve Sınırları Mikrodenetleyiciler3 Bazı örnekler; unsigned short i, j; // i ve j 8 bit işaretsiz sayı int sicaklik; // 16 bitlik sicaklik değişkeni long toplam; // 32 bit toplam integer sayısı char yazi; // yazi karakter değişkeni (8 bit yer kaplar) float hiz; // hiz değişkeni ondalıklı kayar nokta sayıdır 32bit yer kaplar. Değişkenlere ilk değer atama short i =0; // işaretli i değişkeninin değeri 0. Array (dizi) tanımlama const char display[3] = { 0x3F, 0x06, 0x5B}; /* tip tanımının başına const ekleyerek sabitlerin ataması yapılır. Display karakter değişkeni 3 elemanlıdır. Değerleri hex olarak girilmiştir */ short A [3] = {0b , // 0x7F 0b , // 0x9D 0b }; // 0x5A // A sayisi bit olarak atama yapıldı.

4 Bazı örnekler; (devam) char msg1[] = "Merhaba" // msg1 karakter dizisi değişkeni oluşturur, Merhaba metni bu değişkene yüklenir. int sayi1 [2] [3] = { {1, 2, 3}, {1, 2, 3} } // sayi1 isimli 16 bitlik ve 2 satir 3 sütunlu bir dizi (matris) tanımlanarak atama yapıldı. Pointer kullanımı short * deger; // deger değişkeni tanımlandı * deger = 5; // deger degişkenin adresine 5 degeri yüklendi Yapılar (Structures) Önce yapı oluşturulur. struct ogrenci_yapi { char isim[20]; char soyad[20]; int numara; }; Ardından değişken tanımlanır. struct ogrenci_yapi ogrenci; Kullanım : ogrenci.numara= 125;

5 Fonksiyon ve Alt programlar Değer Döndüren Fonksiyonlar int fonksiyonum ( int x, int y) { …. return degisken ; } Değer Döndürmeyen Fonksiyonlar void fonksiyonum () yada void fonksiyonum (short x) { …. } Ana program void main() { …. } Kesme Alt programı void interrupt () { …. } // Baska bir isimle kullanılmaz

6

7 Kontrol Yapıları If – else kontrol yapısı if ( koşul1 ){ …..} else if ( koşul2 ) { …..,} else { …..} Örnek: İki şartı da sağlıyorsa; if ( a >= 1 && b <= 5) İki şarttan birini bile sağlıyorsa; if ( a >= 1 || b <= 5)

8 Değişken veya ifadenin alabileceği bütün durumların test edilmesi her bir durum için farklı komutların yürütülmesinin gerektiği durumlarda tercih edilir. switch ( durum){ case 0: …. break; case 1: … break; default: … } if ( case 0 ){ …..} else if ( case 1) { …..,} else if (default _case){ …..} 8 Kontrol Yapıları Switch- case kontrol yapısı

9 Döngü yapıları While döngüsü Koşul doğru oldu sürece parantezler arasındaki program parçası işletilir. while ( koşul ) { … } Do – While döngüsü while komutuna benzer. Bu döngü yapısında döngü içindeki blok en az bir defa çalışır. do { … } while( koşul) For döngüsü

10 Laboratuarımızdaki Deneme Kartı MikroElektronika Easy PIC4

11

12 MikroC ile PIC Uygulamaları Mikrodenetleyiciler12

13 Mikrodenetleyiciler13 ;====karaşimşek.asm====== listp=pic16f877a #include sayac1 equ 0x20 sayac2 equ 0x21 org0x000 gotobasla basla: clrf PORTB bsf STATUS,RP0 ;bank1 clrfTRISC ;PORTC cikis bcf STATUS,RP0;bank0 bcf STATUS,C ;Elde biti sıfırlandı. movlw 0x01 ;ilk değeri yükle ve movwfPORTC ;C portuna gonder sol: call gecikme ;Yeni değer için bekle. rlf PORTC,f ;sola kaydır btfssPORTC,7 ;PORTC =1 mi? gotosol;hayır.SOL’a dallan. sag: callgecikme;evet. Yeni değer için bekle. rrfPORTC,f ; sağa kaydır. btfssPORTC,0 ; PORTC =1 mi? gotosag;hayır.SAG’a dallan. gotosol;evet.SOL’a dallan, gecikme: movlw 0xFF movwf sayac1 ;d'255'=M dongu11: movlw 0xFF movwfsayac2 ; d'255'=N dongu12: decfszsayac2,f goto dongu12 decfsz sayac1,f goto dongu11 return end Örnek: PortC ye bağlı LED ler baştan sona kadar teker teker yanıp sönen sonra geriye doğru devam eden devre tasarlanacaktır. LED geçişlerinin görülebilmesi için gecikme yazılımı yapılmalıdır. (Karaşimşek devresi)

14 Mikrodenetleyiciler14 MikroC ile programlama Örnek: PortC ye bağlı LED ler baştan sona kadar teker teker yanıp sönen sonra geriye doğru devam eden devre tasarlanacaktır. LED geçişlerinin görülebilmesi için gecikme yazılımı yapılmalıdır. (Karaşimşek devresi) // MikroC ile Karasimsek devresi unsigned short deger; void main(){ ADCON1 = 0x07; TRISC = 0; // C portu cikis olarak tanitildi. STATUS.C= 0; // Carry biti sifirlanir. deger = 0x01; // Carry biti sifirlanir. PORTC=deger; // deger PortC ye yazılır. sol:Delay_ms(400); //400 ms bekle deger = deger << 1; // bir kez sola kaydır PORTC=deger; // deger PortC ye yazılır. if (deger <128 ) goto sol; sag:Delay_ms(400); //400 ms bekle deger = deger >> 1; // bir kez saga kaydır PORTC=deger; // deger PortC ye yazılır. if (deger > 1) goto sag; goto sol; }

15 RB0/INT KESME OLAYI RB0/INT girişinden harici olarak kesme oluşturulur. Bu girişe uygulanan interrupt sinyalinin hangi kenarda olacağı OPTION 6. biti ile belirlenir. INTCON 7.biti GIE ile kesmelerine izin verilir. INTCON 4. biti INTE ile kesmeye izin verilir. INTCON 1. biti INTF bitinin 1 olması kesme oluştuğunu 0 olursa harici kesme oluşmadığının bildirir. OPTION INTCON

16 listp=pic16f877a #include __CONFIG_HS_OSC & _WDT_OFF org0x000 goto basla org0x004 goto kesme basla: bsfSTATUS, RP0; Bank 1' gecis movlw0x01 movwfTRISB; PortB I/O atama bcf OPTION_REG, INTEDG bsf OPTION_REG, NOT_RBPU ; Pull-up disable bcfSTATUS, RP0; Bank 0'a gecis clrf PORTB; Portu temizle bsf PORTB, 7; RB7 çıkış lojik1 bsf INTCON, INTE ; RB/INT enable bsf INTCON, GIE ; Global Interrupt Enable git: goto git; sonsuz dongu kesme: ; Interrupt altprogrami bcf INTCON, INTF; bayragi temizle btfss PORTB, 7; RB7 lojik1 mi goto alt_prg bcf PORTB, 7; RB7 lojik0 ata retfie alt_prg: bsf PORTB,7; RB7 lojik1 ata retfie end Örnek: RB0 girişine bağlı buton ile harici kesme;Başlangıçta ON durumunda olan RB7 ye bağlı LED, RB0 dan kaynaklanan kesme olayında LED OFF konumuna alınmakta yeni bir kesme ile yeniden ON konumuna alınması istenmektedir.

17 // MikroC ile Harici kesme #define led PORTB.RB7//PortB.7 de led tanimlandi. void interrupt(){// kesme servis rutini INTF_bit=0;// Kesme bayragi temizleniyor. led = ~led;// Led in durumu tersleniyor. } void main(){ ADCON1 = 0x07;// A portu digital I/O olarak tanımlaniyor. TRISB = 0b ; // B portunun girisi ve cikis lari ayarlandi. NOT_RBPU_bit=1;// Pull-up direcleri pasif INTEDG_bit=1; // Harici kesme kenar secim biti INTE_bit=1; // Harici kesme etkin GIE_bit=1; // Global kesmeler etkin led = 1; // led in ilk durumu while(1){ } // sonsuz dongu } MikroC ile programlama Örnek: RB0 girişine bağlı buton ile harici kesme; Başlangıçta ON durumunda olan RB7 ye bağlı LED, RB0 dan kaynaklanan kesme olayında LED OFF konumuna alınmakta yeni bir kesme ile yeniden ON konumuna alınması istenmektedir.

18 7 segmentli display üzerinde “5” sayısını gösteren program.

19

20 tablo: addwf PCL,f ; PCL + W = PCL retlw 0x3F ;0 retlw 0x06 ;1 retlw 0x5B ;2 retlw 0x4F ;3 retlw 0x66 ;4 retlw 0x6D ;5 retlw 0x7D ;6 retlw 0x07 ;7 retlw 0x7F ;8 retlw 0x6F ;9 retlw 0x77 ;A retlw 0x7C;B retlw 0x39 ;C retlw 0x5E;D retlw 0x79 ;E retlw 0x71 ;F retlw 0x80 ;. end listp=pic16f877a #include org0x000 gotobasla basla: clrf PORTB ; PortB ye bağlı ledleri söndür bsf STATUS,5 ; Bank1 ‟ e geç clrf TRISB ; PortB ‟ nin uçlarını çıkış yap bcf STATUS,5 ;Bank0 ‟ a geç movlw 0x05 call tablo movwf PORTB dongu: goto dongu Örnek: PORTBnin uçlarına bağlı 7 segment displayde «5» rakamını gösteren program.

21 // MikroC ile 7 Segment display uygulaması #define sec0 PORTA.RA0//PortA.0 ile display1 icin secim ucu. unsigned short g_tablo [16] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; void main(){ ADCON1 |= 0x0F;// A portu digital I/O olarak tanımlaniyor. TRISA = 0b ; // A portunun girisi ve cikis lari ayarlandi. TRISD = 0x00; // D portunun girisi ve cikis lari ayarlandi. sec0 = 1;// display1 secildi PORTD = g_tablo[5];// displaya 5 yazildi for (;;) { } // sonsuz dongu } MikroC ile programlama Örnek: PORTD nin uçlarına bağlı 7 segment displayde «5» rakamını gösteren program.

22 tablo: addwf PCL,f ; PCL + W = PCL retlw 0x3F ;0 retlw 0x06 ;1 retlw 0x5B ;2 retlw 0x4F ;3 retlw 0x66 ;4 retlw 0x6D ;5 retlw 0x7D ;6 retlw 0x07 ;7 retlw 0x7F ;8 retlw 0x6F ;9 retlw 0x77 ;A retlw 0x7C;B retlw 0x39 ;C retlw 0x5E;D retlw 0x79 ;E retlw 0x71 ;F retlw 0x80 ;. gecikme: movlw 0xFF movwf sayac1 ;d'255'=M dongu11: movlw 0xFF movwfsayac2 ; d'255'=N dongu12: decfszsayac2,f goto dongu12 decfsz sayac1,f goto dongu11 return end listp=pic16f877a #include sayac1 equ 0x20 sayac2 equ 0x21 say equ 0x22 org0x000 gotobasla basla: clrf say ; sayaci sifirla clrf PORTB ; PortB ye bagli ledleri söndür bsf STATUS,5 ; Bank1 e geç clrf TRISB ; PortB nin uçlarini cikis yap bcf STATUS,5 ;Bank0 a geç dongu: movf say,w; sayaci w ye tasi call tablo; 7 segment karsiligini bul movwf PORTB; displaye yolla call gecikme; gorulebilmesi icin bekle incf say; sayaci arttir btfsc say,4; 4. bit (t) sifirsa bir komut atla ; 000t xxxx clrf say; sayaci sifirla goto dongu Örnek: PORTB nin uçlarına bağlı 7 segment display de 0~F arasında saydıran program.

23 MikroC ile programlama Örnek: PORTD nin uçlarına bağlı 7 segment display de 0~F arasında saydıran program. // MikroC ile 7 Segment display uygulaması #define sec0 PORTA.RA0//PortA.0 ile display1 icin secim ucu. unsigned short g_tablo [16] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; unsigned short say; void main(){ ADCON1 = 0x07;// A portu digital I/O olarak tanımlaniyor. TRISA = 0b ; // A portunun girisi ve cikis lari ayarlandi. TRISD = 0x00; // D portunun girisi ve cikis lari ayarlandi. sec0 = 1;// display1 secildi say = 0;// say degeri sifirlandi. for (;;) { PORTD = g_tablo[say];// displaya say degiskeni yazildi Delay_ms(800);// 800 ms bekle say++;// say i arttir. if (say>15) say=0;// say degeri F ten sonra sifirlanir. } // sonsuz dongu }

24 MULTIPLEXING

25 movlw 0x04; 3. digit sec movwf PORTC; 3. digit sec movlw 0x0A; 3. digit icin A call tablo; 7 segment karsiligini bul movwf PORTB; displaye yolla call gecikme; gorulebilmesi icin bekle clrf PORTB ; Segmentte yana led yok movlw 0x08; 4. digit sec movwf PORTC; 4. digit sec movlw 0x02; 4. digit icin 2 call tablo; 7 segment karsiligini bul movwf PORTB; displaye yolla call gecikme; gorulebilmesi icin bekle clrf PORTB ; Segmentte yana led yok goto dongu tablo: addwf PCL,f ; PCL + W = PCL retlw 0x3F ;0 retlw 0x06 ;1 …. retlw 0x71 ;F retlw 0x80 ;. gecikme: movlw 0x30 movwf sayac1 ;d'255'=M dongu11: decfsz sayac1,f goto dongu11 return end listp=pic16f877a #include sayac1 equ 0x20 org0x000 gotobasla basla: clrf PORTB ; Segmentte yana led yok clrf PORTC ; PortC de digit secilmedi bsf STATUS,5 ; Bank1 e geç clrf TRISB ; PortB nin uçlarini cikis yap clrf TRISC ; PortC nin uçlarini cikis yap bcf STATUS,5 ;Bank0 a geç dongu: ; 2A9C movlw 0x01; 1. digit sec movwf PORTC; 1. digit sec movlw 0x0C; 1. digit icin C call tablo; 7 segment karsiligini bul movwf PORTB; displaye yolla call gecikme; gorulebilmesi icin bekle clrf PORTB ; Segmentte yana led yok movlw 0x02; 2. digit sec movwf PORTC; 2. digit sec movlw 0x09; 2. digit icin 9 call tablo; 7 segment karsiligini bul movwf PORTB; displaye yolla call gecikme; gorulebilmesi icin bekle clrf PORTB ; Segmentte yana led yok Örnek: PORTB nin uçlarına bağlı 7 segment display e «2A9C» sayısını gösteren program. C0-C3 e Digit secim bitleri

26 MikroC ile programlama Örnek: PORTD nin uçlarına bağlı 7 segment display e «2A9C» sayısını gösteren program. A0-A3 e Digit secim bitleri // MikroC ile 7 Segment display uygulaması #define sec0 PORTA.RA0 //PortA.0 ile display1 icin secim ucu. #define sec1 PORTA.RA1 //PortA.1 ile display2 icin secim ucu. #define sec2 PORTA.RA2 //PortA.2 ile display3 icin secim ucu. #define sec3 PORTA.RA3 //PortA.3 ile display4 icin secim ucu. unsigned short g_tablo [16] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; void main(){ ADCON1 = 0x07;// A portu digital I/O olarak tanımlaniyor. TRISA = 0b ; // A portunun girisi ve cikis lari ayarlandi. TRISD = 0x00; // D portunun girisi ve cikis lari ayarlandi. sec0 = 0; sec1 = 0; sec2 = 0; sec3 = 0; for (;;) { sec0 = 1; sec1 = 0; sec2 = 0; sec3 = 0; PORTD = g_tablo[0x0C]; // 1. display yazildi Delay_ms(1);// 1 ms bekle PORTD = 0x00;// displaya sifir yazildi sec0 = 0; sec1 = 1; sec2 = 0; sec3 = 0; PORTD = g_tablo[0x09]; // 2. display yazildi Delay_ms(1);// 1 ms bekle PORTD = 0x00;// displaya sifir yazildi sec0 = 0; sec1 = 0; sec2 = 1; sec3 = 0; PORTD = g_tablo[0x0A]; // 3. display yazildi Delay_ms(1);// 1 ms bekle PORTD = 0x00;// displaya sifir yazildi sec0 = 0; sec1 = 0; sec2 = 0; sec3 = 1; PORTD = g_tablo[0x02];// 4. display yazildi Delay_ms(1);// 1 ms bekle PORTD = 0x00;// displaya sifir yazildi } // sonsuz dongu }


"MikroC ile PIC Programlama Mikrodenetleyiciler1 7.Hafta." indir ppt

Benzer bir sunumlar


Google Reklamları