Transcript 7. Hafta

MikroC ile PIC
Programlama
7.Hafta
Mikrodenetleyiciler
1
Ö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 */
Mikrodenetleyiciler
short A [3] = {0b01111111, // 0x7F
0b10011101, // 0x9D
0b01011010}; // 0x5A
// A sayisi bit olarak atama yapıldı.
3
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
Ana program
int fonksiyonum ( int x, int y)
{
….
….
return degisken ;
}
void main()
{
….
….
….
}
Değer Döndürmeyen Fonksiyonlar
Kesme Alt programı
void fonksiyonum () yada void fonksiyonum (short x)
{
….
….
}
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:
…
break;
default:
…
}
if ( case 0 ){
…..}
else if ( case 1) {
…..,}
else if (default _case){
…..}
8
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ı
MikroElektronika Easy PIC4
MikroC ile PIC
Uygulamaları
Mikrodenetleyiciler
12
Ö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
clrf
TRISC
bcf
STATUS,RP0
bcf
STATUS,C
movlw
0x01
movwf
PORTC
sol:
call
gecikme
rlf
PORTC,f
btfss
PORTC,7
goto
sol
sag:
call
gecikme
bekle.
rrf
PORTC,f
btfss
PORTC,0
goto
sag
goto
sol
Mikrodenetleyiciler
;bank1
;PORTC cikis
;bank0
;Elde biti sıfırlandı.
;ilk değeri yükle ve
;C portuna gonder
gecikme:
movlw
movwf
dongu11:
movlw
movwf
dongu12:
decfsz
goto
decfsz
goto
return
end
0xFF
sayac1 ;d'255'=M
0xFF
sayac2 ; d'255'=N
sayac2,f
dongu12
sayac1,f
dongu11
;Yeni değer için bekle.
;sola kaydır
;PORTC<7>=1 mi?
;hayır.SOL’a dallan.
;evet. Yeni değer için
; sağa kaydır.
; PORTC<0>=1 mi?
;hayır.SAG’a dallan.
;evet.SOL’a dallan,
13
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;
STATUS.C= 0;
// C portu cikis olarak tanitildi.
// Carry biti sifirlanir.
deger = 0x01;
PORTC=deger;
// Carry biti sifirlanir.
// 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);
deger = deger >> 1;
PORTC=deger;
if (deger > 1) goto sag;
//400 ms bekle
// bir kez saga kaydır
// deger PortC ye yazılır.
goto sol;
}
Mikrodenetleyiciler
14
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
Ö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
movlw0x01
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
retfie
end
; RB7 lojik1 ata
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(){
INTF_bit=0;
led = ~led;
// kesme servis rutini
// Kesme bayragi temizleniyor.
// Led in durumu tersleniyor.
}
void main(){
ADCON1 = 0x07;
TRISB = 0b01111111;
NOT_RBPU_bit=1;
INTEDG_bit=1;
INTE_bit=1;
GIE_bit=1;
led = 1;
while(1){ }
}
// A portu digital I/O olarak tanımlaniyor.
// B portunun girisi ve cikis lari ayarlandi.
// Pull-up direcleri pasif
// Harici kesme kenar secim biti
// Harici kesme etkin
// Global kesmeler etkin
// led in ilk durumu
// 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
bsf STATUS,5
clrf TRISB
bcf STATUS,5
movlw 0x05
call tablo
movwf PORTB
dongu:
goto dongu
; PortB ye bağlı ledleri söndür
; Bank1‟e geç
; PortB‟nin uçlarını çıkış yap
;Bank0‟a geç
tablo:
addwf PCL,f
retlw 0x3F
retlw 0x06
retlw 0x5B
retlw 0x4F
retlw 0x66
retlw 0x6D
retlw 0x7D
retlw 0x07
retlw 0x7F
retlw 0x6F
retlw 0x77
retlw 0x7C
retlw 0x39
retlw 0x5E
retlw 0x79
retlw 0x71
retlw 0x80
end
; PCL + W = PCL
;0
;1
;2
;3
;4
;5
;6
;7
;8
;9
;A
;B
;C
;D
;E
;F
;.
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;
TRISA = 0b11111110;
TRISD = 0x00;
sec0 = 1;
// A portu digital I/O olarak tanımlaniyor.
// A portunun girisi ve cikis lari ayarlandi.
// D portunun girisi ve cikis lari ayarlandi.
// 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.
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
call tablo
movwf PORTB
call gecikme
incf say
btfsc say,4
clrf say
goto dongu
; sayaci w ye tasi
; 7 segment karsiligini bul
; displaye yolla
; gorulebilmesi icin bekle
; sayaci arttir
; 4. bit (t) sifirsa bir komut atla
; 000t xxxx
; sayaci sifirla
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
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;
TRISA = 0b11111110;
TRISD = 0x00;
sec0 = 1;
say = 0;
// A portu digital I/O olarak tanımlaniyor.
// A portunun girisi ve cikis lari ayarlandi.
// D portunun girisi ve cikis lari ayarlandi.
// display1 secildi
// say degeri sifirlandi.
for (;;) {
PORTD = g_tablo[say];
Delay_ms(800);
say++;
if (say>15) say=0;
}
}
// displaya say degiskeni yazildi
// 800 ms bekle
// say i arttir.
// 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
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ç
movlw 0x04
movwf PORTC
movlw 0x0A
call tablo
movwf PORTB
call gecikme
clrf PORTB
movlw 0x08
movwf PORTC
movlw 0x02
call tablo
movwf PORTB
call gecikme
clrf PORTB
goto dongu
dongu: ; 2A9C
movlw 0x01
movwf PORTC
movlw 0x0C
call tablo
movwf PORTB
call gecikme
clrf PORTB
; 1. digit sec
; 1. digit sec
; 1. digit icin C
; 7 segment karsiligini bul
; displaye yolla
; gorulebilmesi icin bekle
; Segmentte yana led yok
tablo:
addwf PCL,f
retlw 0x3F
retlw 0x06
….
retlw 0x71 ;F
retlw 0x80
movlw 0x02
movwf PORTC
movlw 0x09
call tablo
movwf PORTB
call gecikme
clrf PORTB
; 2. digit sec
; 2. digit sec
; 2. digit icin 9
; 7 segment karsiligini bul
; displaye yolla
; gorulebilmesi icin bekle
; Segmentte yana led yok
gecikme:
movlw
movwf
dongu11:
decfsz
goto
return
end
; 3. digit sec
; 3. digit sec
; 3. digit icin A
; 7 segment karsiligini bul
; displaye yolla
; gorulebilmesi icin bekle
; Segmentte yana led yok
; 4. digit sec
; 4. digit sec
; 4. digit icin 2
; 7 segment karsiligini bul
; displaye yolla
; gorulebilmesi icin bekle
; Segmentte yana led yok
; PCL + W = PCL
;0
;1
;.
0x30
sayac1 ;d'255'=M
sayac1,f
dongu11
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
#define
#define
#define
sec0
sec1
sec2
sec3
PORTA.RA0
PORTA.RA1
PORTA.RA2
PORTA.RA3
//PortA.0 ile display1 icin secim ucu.
//PortA.1 ile display2 icin secim ucu.
//PortA.2 ile display3 icin secim ucu.
//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};
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
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
}
}
// sonsuz dongu