MikroC ile PIC MikroC ile PIC
Programlama Programlama
Mikrodenetleyiciler 1
7.Hafta
7.Hafta
Ö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ı Değişken Tipleri ve Sınırları
Mikrodenetleyiciler 3
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ı.
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)
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ı
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ü
Laboratuarımızdaki Deneme Kartı Laboratuarımızdaki Deneme Kartı
MikroElektronika Easy PIC4
MikroC ile PIC MikroC ile PIC
Uygulamaları Uygulamaları
Mikrodenetleyiciler 12
Mikrodenetleyiciler 13
;====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:
movlw 0xFF
movwf sayac2 ; d'255'=N dongu12:
decfsz sayac2,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)
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 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;
}
RB0/INT KESME OLAYI 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
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 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.
// 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 }
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.
7 segmentli display üzerinde “5” sayısını gösteren 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 ; . end
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
Örnek: PORTBnin 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
}
MikroC ile programlama
Örnek: PORTD nin uçlarına bağlı 7 segment displayde «5» rakamını gösteren 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:
movlw 0xFF
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
Örnek: PORTB nin uçlarına bağlı 7 segment display de 0~F arasında saydıran program.
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
MULTIPLEXING
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
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 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
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 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
}