• Sonuç bulunamadı

MikroC ile PIC MikroC ile PIC Programlama Programlama

N/A
N/A
Protected

Academic year: 2021

Share "MikroC ile PIC MikroC ile PIC Programlama Programlama"

Copied!
26
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

MikroC ile PIC MikroC ile PIC

Programlama Programlama

Mikrodenetleyiciler 1

7.Hafta

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 <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ı 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ı.

(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ı Laboratuarımızdaki Deneme Kartı

MikroElektronika Easy PIC4

(11)
(12)

MikroC ile PIC MikroC ile PIC

Uygulamaları Uygulamaları

Mikrodenetleyiciler 12

(13)

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)

(14)

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;

}

(15)

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

(16)

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.

(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 = 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.

(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

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.

(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 = 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.

(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

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.

(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 = 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

}

(24)

MULTIPLEXING

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

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

(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 = 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

}

Referanslar

Benzer Belgeler

Çapraz kesme donatısının farklı eğilme donatı çapları ve akma dayanımı ile kullanımına karşılık gelen parametrik çalışmalar SX200, SX400 ve SX800

Bit 4 EEIE: EEPROM yazma işlem kesmesi geçerlilik biti 0 = EEPROM yazma kesmesine izin verilmez. Bit 3 BCLIE: Çarpışma (Bus collision) kesmesi geçerlilik biti 0 = BUS

1 : ADRESH kaydedicisinin MSB kısmındaki 6 biti 0 kabul edilir ve A/D çevirme sonucunda elde edilen veri ADRESH’ın 2 bitlik LSB kısmına ve ADRESL’ye yazılır. 0 :

Daha açık bir şekilde ifade etmek gerekirse, kesme kuvvetinin değişimini gösteren eğriye kesme kuvveti diyagramı, eğilme momentinin değişimini gösteren eğriye de

2-Zig zag çizgi kesme 3-Eğri çizgiler kesme 4-Köşeli çizgiler kesme 5-Yuvarlak çizgiler kesme 6-Şekiller kesme.

• İlaca bağlı zarar riskini göz önünde bulundurun. • Gelecekteki zarar veya yük

Gök (2014) kemik delme sırasında oluĢan nekrozu engellemek için gizli soğutma kanalları olan matkap uçları ile sığır kemikleri üzerinde gerçekleĢtirdiği

American Singer Belgium Waterslagger German Roller Spanish Timbrado.. Yenilmez / Turkish Journal of Agriculture - Food Science and Technology, 8(4):