MikroC ile PIC Programlama

Slides:



Advertisements
Benzer bir sunumlar
STRİNG FONKSİYONLARI.
Advertisements

Bölüm 12 ÜST DÜZEY KONULAR Dinamik Bellek Ayırma Önişlemci
Nesnelerin Özellikleri. - Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar.
Nöbetçi Kontrollü Döngü
DERS 7 PIC 16F84 PROGRAMLAMA.
TEMEL C PROGRAMLAMA DERSİ - 1
void medyan(int cevap[]) { int j; siralama(cevap);
Bölüm 2 C Dilinin Temelleri
Değişken Tanımlamaları
PIC Mikrodenetleyiciler
Atama ve Girdi/Çıktı Komutları
SQL de Değişken Tanımlama
MikroC ile PIC Programlama
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
String Kütüphanesindeki Arama Fonksiyonları
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
ORT – 104 Hoş Geldiniz.
Bölüm 10 Yapılar ve Birleşimler
MikroC ile PIC Programlama
PIC MIKRODENETLEYICILER-3: GECİKME ve KESME PROGRAMLARI
Öğr.Gör.Bülent Çobanoğlu
DERS 6 PIC 16F84 PROGRAMLAMA.
PIC Mikrodenetleyiciler
Bilgisayar Programlama (Yrd. Doç. Dr. İbrahim ASRİ)
C Programlama Dili ve Gömülü Sistemler için MikroC
DERS 6 PIC 16F84 PROGRAMLAMA.
DERS 12 PIC 16F84 ile KESME (INTERRUPT) KULLANIMI
PROGRAMLAMA VE ASSEMBLY DİLİ
5. EGITIM Mikrodenetleyiciler PIC16F628 – PIC16F877
DERS 8 PIC 16F84 PROGRAMLAMA.
PROGRAMLAMA VE ASSEMBLY DİLİ
Mikroişlemci (μP) Mikroişlemci çoğu zaman bilgisayarların beyni olarak adlandırılır. Bilgisayar yazılımındaki tüm işlemleri yapmakla sorumludur ve merkezi.
SQL de Değişken Tanımlama
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
DERS 5 PIC 16F84 PROGRAMLAMA.
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
KESMELER (Interrupts)
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
JAVA’DA DİZİLER Dr.Galip AYDIN.
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri Dizgi Çıktı İşlemleri Dizgi Fonksiyonları Karakter Fonksiyonları Gösterge Dizgileri.
JAVA PROGRAMLAMA ORNEKLER
Dijital Çıkış Mantığı.
2. HAFTA 2. Hafta.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Algoritmalar ve Programlama I Ders 5: Operatörler
3. HAFTA 3. Hafta.
4. Hafta1 4. HAFTA. 4. Hafta2 Fonksiyonlar  Büyük problemler, küçük parçalara bölünerek kolay çözülür  Yazılımlar benzer modüller içerirler  Hata ayıklama.
SAYISAL ANALİZ Doç.Dr. Cüneyt BAYILMIŞ.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
//UART KULLANIMI #define YLED_ON PORTD.B0=1 #define YLED_OFF PORTD.B0=0 + #define KLED_ON PORTD.B1=1 #define KLED_OFF PORTD.B1=0 unsigned short i; char.
Mikroişlemciler ve Mikrodenetleyiciler: PIC Programlama
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
C Programlama Dili Bilgisayar Mühendisliği.
DERS 10 PIC 16F84 ile ZAMAN GECİKME DÖNGÜLERİ
DERS 6 PIC 16F84 PROGRAMLAMA.
ELT205 MİKRODENETLEYİCİLER DERSİ
MİkroİŞlemcİler ve programlanmasI Mekatronik Mühendisliği Bölümü
DERS 12 PIC 16F84 ile KESME (INTERRUPT) KULLANIMI
PROGRAM KONTROL KOMUTLARI 1. if koşulu 2. if else koşulu
INTERCONNECTION PROTOCOLS
YAPISAL PROGRAMLAMA Hafta-6
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
YAPISAL PROGRAMLAMA Hafta-7
C ile Programlamaya Giriş
Sunum transkripti:

MikroC ile PIC Programlama 7.Hafta Mikrodenetleyiciler

# 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

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] = {0b01111111, // 0x7F 0b10011101, // 0x9D 0b01011010}; // 0x5A // A sayisi bit olarak atama yapıldı. Mikrodenetleyiciler

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;

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

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)

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){

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ü

Laboratuarımızdaki Deneme Kartı MikroElektronika Easy PIC4

MikroC ile PIC Uygulamaları Mikrodenetleyiciler

Ö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

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

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

Ö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

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 = 0b01111111; // 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

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

Ö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

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 = 0b11111110; // 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 }

Ö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

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 = 0b11111110; // 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 }

MULTIPLEXING

Ö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,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 movlw 0x02 ; 2. digit sec movwf PORTC ; 2. digit sec movlw 0x09 ; 2. digit icin 9

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 = 0b11110000; // 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 }