7 Temmuz 2015 Salı

B portu kesmesi PIC 16F887 Mikro c ile örnek program


PIC 16F887 de B portu değişiklik kesmesi
(b7 b6 b5 b4 pinleri)

b portu kesmesi

b portu kesmesi
 




16f887 de B portu, yani b7 b6 b5 b4 değişiklik kesmesi . Bu pinlerde her hangibibir değişiklik olduğunda pic kesmeye giriyor . Üniversite de hocamin verdiği ödevle kullanmam gerekiyordu nette pic 16f628 işlemcisi için bunun örnegini bulamadım arkadşımla datasheet'inden baktık ve ilgili bitleri aktif etmek gerekiyor . ödevin konusu biraz mantıksız gibi ama öğretici :) Lcd ekran (proteus kodu: lm016) 4 e bölünüyor ve her bölüm için bir buton var her bir buton o blümdeki sayıyı arttırıyor ayrıce bir buton da bütün sayıları sıfırlıyor. Proteusda similasyon yaptım mikro c programıyla yazdım derledim .
Ödev dosyasında da açıklama yaptım .
Program mantığın da da herhangi bir b portun da değişiklik olduğunda kesmeye gidiyor . Mikroc progrtamında LCD custom character özelliğini kullandım .
Kodların her satırı için de ayrıca açıklama yaptım, sorularınız olursa yorum yapın yardımcı olmaya çalışacam.


program  kodları;


sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D4 at RD4_bit;

sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit;

sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit;
                  // lcd pin ayarlama işlemleri yapıldı
 char txt[15];
short say1=11,say2=22,say3=33,say4=44,sifirla=0;

const char cizgi[] = {1,1,1,1,1,1,1,1};
void karakter(char satir, char yeri) {  // LCD custom character özelliği
  char i;
    Lcd_Cmd(64);
    for (i = 0; i<=7; i++) Lcd_Chr_CP(cizgi[i]);
    Lcd_Cmd(_LCD_RETURN_HOME); //ekranı sil komutu imleci oririjinal konumuna getirir
    Lcd_Chr(satir, yeri, 0);
}

 void yazi_yaz()
 {
Lcd_Out(2,1,"   YRD.DOC.DR.  "); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"V.YUSUF SENYUREK"); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"Mikroc Odevi     "); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"  Harun DOGAN      "); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"  2.sinif     "); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"NO: 171212009     "); //2.satır ve 1.sütundan itibaren yazma
delay_ms(1000);
Lcd_Out(2,1,"              "); //2.satır ve 1.sütundan itibaren yazma
 }

void interrupt() // Kesme fonksiyonu
{
     if(INTCON.INTF) { say1=0; say2=0; say3=0; say4=0; INTCON.INTF=0; }
    if(PORTB.B4) {say1++; INTCON.RBIF=0;INTCON.RBIE=0;  }// eğer PORTB'nin
    if(PORTB.B5) {say2++; INTCON.RBIF=0;INTCON.RBIE=0;  } // eğer PORTB'nin
    if(PORTB.B6) { say3++; INTCON.RBIF=0;INTCON.RBIE=0;  } // eğer PORTB'nin
    if(PORTB.B7) {say4++; INTCON.RBIF=0;INTCON.RBIE=0;  } // eğer PORTB'nin
    if(PORTB.B0){ say1=0; say2=0; say3=0; say4=0;  }
        INTCON.RBIF=0;  INTCON.RBIE=0;

 }
void main() {

ansel=0; anselh=0; // portlar dijital olarak tanımlandı
TRISB=0xF1; // PORTB'nin 0 4 5 6 7 pinleri giriş diğerleri çıkış
    PORTB=0; // PORTB'yi sıfırla// OPTION_REG.B7=0; // PORTB dahili pull-up aktif
     INTCON.GIE=1; // bütün kesmelere izin ver  pin çıkışı butona gider sonra ground olur
     INTCON.RBIE=1; // PORTB değişim kesmesine izin ver
     INTCON.INTE=1; //RB0 KESMESİNE İZİN VER
     INTCON.RBIF=0; // RBIF bayrağını temizle
     IOCB.IOCB7=1;
     IOCB.IOCB6=1;  // b portu kesmeleri için
     IOCB.IOCB5=1;
     IOCB.IOCB4=1;
     IOCB.IOCB0=1;
  //OPTION_REG.INTEDG=1; //DÜŞEN KENAR TETİKLEMESİ**** DİKKAT******

Lcd_Init(); // LCD Display hazırlandı
Lcd_Cmd(_LCD_CURSOR_OFF);// LCD display ekranındaki imleci kaldırmak için
Lcd_Cmd(_LCD_CLEAR); //LCD ekranını temizlemek için

yazi_yaz();
karakter(1,4); // 4. 8. 12. sürunlara çizgi çekildı
karakter(1,8); // ekran 4e bölündü
karakter(1,12);//Lcd_Out(1,6,txt3);

while(1){
shortToStr(say1,txt);
Lcd_Out(1,1,txt); //
shortToStr(say2,txt);
Lcd_Out(1,5,txt); //
shortToStr(say3,txt);
Lcd_Out(1,9,txt); //
shortToStr(say4,txt);
Lcd_Out(1,13,txt); //
delay_ms(500);
 // her kesmeye girdiğinde kesme sonunda kesmeyi iptal et
          // sonra yeniden kesmeyi aktif et
        INTCON.RBIE=1; // PORTB değişim kesmesine izin ver
        INTCON.RBIF=0;// RBIF bayrağını temizle
        }  // sonsuz döngüye girildi
}





ödev b portu kesmesi

Teşekkürler.

Harun DOĞAN blog


Hiç yorum yok:

Yorum Gönder