Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
1
MikroC ile PIC Programlama
7.Hafta Mikrodenetleyiciler
2
# define MAX = 40 // programda MAX gecen heryere 40 sayısı yazılır.
Ö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 <kutuphane.c> #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ı
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ı. Mikrodenetleyiciler
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
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
Kontrol Yapıları Switch- case kontrol yapısı
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: … default: } if ( case 0 ){ …..} else if ( case 1) { …..,} else if (default _case){
9
Döngü yapıları While döngüsü Do – While döngüsü For 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
12
MikroC ile PIC Uygulamaları
Mikrodenetleyiciler
13
Ö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) ;====karaşimşek.asm====== list p=pic16f877a #include<p16f877a.inc> sayac1 equ 0x20 sayac2 equ 0x21 org 0x000 goto basla basla: clrf PORTB bsf STATUS,RP0 ;bank1 clrf TRISC ;PORTC cikis bcf STATUS,RP0 ;bank0 bcf STATUS,C ;Elde biti sıfırlandı. movlw 0x01 ;ilk değeri yükle ve movwf PORTC ;C portuna gonder sol: call gecikme ;Yeni değer için bekle. rlf PORTC,f ;sola kaydır btfss PORTC,7 ;PORTC<7>=1 mi? goto sol ;hayır.SOL’a dallan. sag: call gecikme ;evet. Yeni değer için bekle. rrf PORTC,f ; sağa kaydır. btfss PORTC,0 ; PORTC<0>=1 mi? goto sag ;hayır.SAG’a dallan. goto sol ;evet.SOL’a dallan, gecikme: movlw 0xFF movwf sayac1 ;d'255'=M dongu11: movwf sayac2 ; d'255'=N dongu12: decfsz sayac2,f goto dongu12 decfsz sayac1,f goto dongu11 return end Mikrodenetleyiciler
14
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 if (deger <128 ) goto sol; sag: Delay_ms(400); //400 ms bekle deger = deger >> 1; // bir kez saga kaydır if (deger > 1) goto sag; goto sol; } Mikrodenetleyiciler
15
RB0/INT KESME OLAYI OPTION INTCON
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
Ö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. list p=pic16f877a #include<p16f877a.inc> __CONFIG _HS_OSC & _WDT_OFF org 0x000 goto basla org 0x004 goto kesme basla: bsf STATUS, RP0 ; Bank 1' gecis movlw 0x01 movwf TRISB ; PortB I/O atama bcf OPTION_REG, INTEDG bsf OPTION_REG, NOT_RBPU ; Pull-up disable bcf STATUS, 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 end
17
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. // 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
18
7 segmentli display üzerinde “5” sayısını gösteren program.
20
Örnek: PORTBnin uçlarına bağlı 7 segment displayde «5» rakamını gösteren program.
list p=pic16f877a #include<p16f877a.inc> org 0x000 goto basla 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 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
21
MikroC ile programlama
Örnek: PORTD nin uçlarına bağlı 7 segment displayde «5» rakamını gösteren 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}; 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 }
22
Örnek: PORTB nin uçlarına bağlı 7 segment display de 0~F arasında saydıran program.
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: movwf sayac2 ; d'255'=N dongu12: decfsz sayac2,f goto dongu12 decfsz sayac1,f goto dongu11 return end list p=pic16f877a #include<p16f877a.inc> sayac1 equ 0x20 sayac2 equ 0x21 say equ 0x22 org 0x000 goto basla 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
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
Ö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 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 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 list p=pic16f877a #include<p16f877a.inc> sayac1 equ 0x20 org 0x000 goto basla 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, ;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 movlw 0x02 ; 2. digit sec movwf PORTC ; 2. digit sec movlw 0x09 ; 2. digit icin 9
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 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 } // sonsuz dongu }
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.