5 Kasım 2014 Çarşamba

MİKROC PROGRAM ÖRNEKLERİ

BÖLÜM-3 MİKROC PROGRAM ÖRNEKLERİ

Şekil-3.1 Uygulama devresi

Örnek_1 Portd' ye bağlı olan ledleri 0.5 ms aralıklarla yakıp söndüren program
void main() {
  TRISD  = 0;                 // PORTD Çıkış
         while(1)
            
                PORTD=255;               //PORTD'nin bütün ledlerini yak.
                Delay_ms(500);           // 0.5 ms bekle.
                PORTD = 0;               // PORTD'nin bütün ledlerini söndür.
                   Delay_ms(500);        // 0.5 ms bekle.
             }
         }
Örnek_2 RA0 Butonuna basılınca PORTD' deki en değerlikli 4 biti, RA1 butonuna basılınca PORTD' deki değerliksiz 4 biti aktif yapan program.
void main() {
  adcon1=7;                 //Analog girişleri sayısala çevir.
  TRISD=0;                  //PORTD çıkı
  TRISA=255;              //PORTA giriş
  PORTD=0;
  while (1) {                 //Sonsuz döngü
    if (RA0_bit) {                    // RA0 butonuna basılınca
      Delay_ms(40);
      PORTD=0xF0;      // 11110000’ yükle
     }
    if (RA1_bit) {                    // RA1 butonuna basılırsa   
     Delay_ms(40);
      PORTD= 0x0F;         // 00001111’ yükle
     }
  }
  }
Örnek_3 Tek tuş RA0 Butonuna ilk basmada PORTD’ deki en değerlikli  4 ledi ikinci basmada değerliksiz 4 led’i yakan program.
int x;
void main() {
    TRISD=0;
    TRISA=255;
    ADCON1=7;
    x=0;
    PORTD=0;
     while(1)     {
    if ((RA0_bit)&& ( x==0))
        {
        Delay_ms(300);
    PORTD= 0xF0;
    x=2;
    }
    if ((RA0_Bit) && (x==2))
        {
         Delay_ms(300);
    PORTD=0x0F;
   x=0;
    }
   } 
}


Örnek_3  alternatif RA0 Butonuna basılınca PORTD' deki en degerlikli 4 biti, RA0 butonuna tekrar basılınca  PORTD'deki değerliksiz 4 biti aktif yapan program
    int x;
void main() {
  adcon1=7;
  TRISD=0;
  TRISA=0xFF;
  PORTD=0;
    x=0;
  while (1) {
  while (x==0) {
    if (RA0_bit) {                    // RA0 butonuna basılınca
      Delay_ms(200);
      PORTD=0xF0;
      x=1;
     }
      }
    while (x==1)  {
    if (RA0_bit) {                     // RA1    butonuna basılırsa
     Delay_ms(200);
      PORTD=0x0F;
      x=0;
     }
  }
}
Örnek_4 RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki ledleri yakan program.
void main() {
    TRISD=0;
    TRISA0_bit=1;
    TRISA1_BIT=1;
    ADCON1=7;
    PORTD=0;
     while(1)     {
    if ((RA0_bit)&& ( RA1_bit))
        {
        Delay_ms(100);
    PORTD= 0xFF;
    }
   }
}


Örnek_5  RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.
   int x;
void main() {
    TRISD=0;
    TRISA0_bit=1;
    TRISA1_BIT=1;
    ADCON1=7;
    PORTD=0;

     while(1)     {
    if ((RA0_bit)&& ( RA1_bit))
        {
        for  (x=0; x=19; x++) {
        PORTD= 0xFF;
        Delay_ms(300);
        PORTD= 0;
        Delay_ms(300);
        }
    }
   }
    }
 Örnek_5 alternatif çözüm RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.

   int x;
void main() {
    TRISD=0;
    TRISA0_bit=1;
    TRISA1_BIT=1;
    ADCON1=7;
    PORTD=0;
     while(1)     {
         x=0;
    if ((RA0_bit)&& ( RA1_bit))
        {
      while (x<19)   {
        PORTD= 0xFF;
        Delay_ms(300);
        PORTD= 0;
        Delay_ms(300);
        x=x+1;
        }
    }
   }
    }

Örnek_6 RA0 ve RA1 butonlarına sırası ile basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.
int x;
void main() {
    TRISD=0;
    TRISA0_bit=1;
    TRISA1_bit=1;
    ADCON1=7;
    PORTD=0;
     while(1)     {
    if (RA0_bit){
    x=1;
      }
if ((x==1)&&( RA1_bit)){
        x=0;
      while (x<19)   {
        PORTD= 0xFF;
        Delay_ms(300);
        PORTD= 0;
        Delay_ms(300);
        x=x+1;
     }
    }
   }
    }


SEVEN SEGMENT DİSPLEY

Örnek_7 0-9 sayıcı
Conts char  say[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}, int i;
void main() {
                                 TRISA =0;
                                 TRISB=0;
                                 PORTA=1;
                                 PORTB = 0;
        while(1){
        i=0;
while(i<10) {
                                 PORTB = say[i];
                                 Delay_ms(500);
                                 i++ ;
                               }
  }
      }
Örnek_8 99 sayıcı
#define disp1   PORTA.F2
#define disp2   PORTA.F3
#define arttir  PORTA.F0
#define azalt   PORTA.F1

char sayi=0,birler,onlar;

void goster()
{
 onlar=sayi/10;
 birler=sayi%10;

 disp2=1;
 PORTB=onlar;
 disp1=0;
 delay_ms(3);

 disp1=1;
 PORTB=birler;
 disp2=0;
 delay_ms(3);
}

 void kurulum()
{

CMCON=7;    //girişler analog ve karşılaştırma kapalı
 TRISA.f0=1; TRISA.f1=1;  TRISA.f2=0;  TRISA.f3=0;
 TRISB=0; PORTB=0;
 disp1=0; disp2=0;
}


void main()
{
 kurulum();

 while(1)
         {
          if(arttir)
                    {
                     sayi++;
                     if(sayi==100)sayi=0;
                     while(arttir)
                                  {
                                   goster();
                                  }
                    }

         if(azalt)
                    {
                     if(sayi==0)sayi=100;
                     sayi--;
                     while(azalt)
                                  {
                                   goster();
                                  }
                    }

         goster();
        }
}



Step Motor Kontrolü
               


Örnek_9 A0 butonuna her basmada ileri, A1 butonuna her basmada geri adım atacak program yazınız?
int i, char adim[8]={8,12,4,6,2,3,1,6};


void main() {
trisb=0;
trisa=255;
i=0;
portb=0;
while(1)
{
      if (RA_0)     {                   //ileri tam adim
      portb=adim(i);
      delay_ms(300);
i++;
      if (i==7)
      i=0;
    } 
     
      if (RA_1)   {                                 //geri tam adim
      portb=motor(i);
      delay_ms(300);
      i--;
      if (i==0);
      i=7;
      }
}
     

Örnek_10 A0 butonuna basıldığı sürece ileri, A1 butonuna basıldığı sürece geri adım atacak program yazınız?

int i, char adim[8]={8,12,4,6,2,3,1,6};


void main() {
trisb=0;
trisa=255;
i=0;
portb=0;
while(1)
{
      While (RA_0)     {                        //ileri tam adim
      portb=adim(i);
      delay_ms(300);
i++;
      if (i==7)
      i=0;
    } 
     
     While (RA_1)   {                           //geri tam adim
      portb=motor(i);
      delay_ms(300);
      i--;
      if (i==0);
      i=7;
      }
}






          

KESMELER(INTERRUPTS)

Kesme (interrupt) vektörü:  Mikroişlemci program belleğindeki programı çalıştırırken, sırası belirsiz, acilen yapılması gerekli yordamları da çalıştırabilir. Sırası ve ne zamaortaya çıkacağı bilinmeyen bu işleri yapmak için mikroişlemci, bir yolla dışarıdan veya kendi içinden uyarılmadır.
İç içe kullanılan altprogramlar en çok sekiz olabilir. Bunlara kesme bölümleri de dahildir. Kesmeleri dahil etmezsek, yığın taşmasına neden oluruz. Yığın taşması oluştuğunda bizuyaracak, herhangi bir uya (flag) kaydedicisi bulunmamaktadır. 

INTCON REGISTER (KESME KAYDEDİCİSİ)

INTCON kaydedicisi, okunabilir ve yazılabilir bir kaydedicidir. Kapsamında TMR0 / WDT kaydedicisi taşma uyarı bitleri, PORTB değişim ve dış kesme (RB0 / INT pin interrupt) denetim bitleri, TMR0 kesme denetim bitleri bulunur.
7             6             5             4             3             2             1             0

GIE
PEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF

Bit 7: GIE: Bütün kesmeler geçerli (Global Interrupt Enable) biti

1= Maskelenmemiş kesmeleri aktif yapar

0= Kesmeyi kaldırır

Bit 6: PEIE: Çevresel kesmeleri geçerli yapma biti

1= Çevresel kesmeyi aktifleştirir

0= Çevresel kesmeyi kaldırır

Bit 5: TOIE: TMR0 clock taşma kesmesi biti

1= TMR0 kesmesini aktif yapar

0= Kesmeyi kaldırır

Bit 4: INTE: RB0 / INT dış kesme biti

1= RB0 / INT pininden dış kesmeyi aktif yapar

0= Kesmeyi kaldırır

Bit 3: RBIE:  PORTB değişiklik kesme biti

1= RB port değişimini aktif yapar

0= Kesmeyi kaldırır

Bit 2: TOIF: TMR0 taşma uyarısı bayrak biti

1= TMR0 taştı (taştıktan sonra program içinden temizlenir)

0= TMR0 taşmadı

Bit 1: INTF: TMR0 / INT dış kesme uyarı bayrak biti

1= TMR0 dış kesme oldu (program içinden temizlenir)

0= TMR0 dış kesme yok

Bit 0: RBIF: RB Port değişimi kesme uyarı bayrak biti

1= En az bir RB<7..4> pini durum değiştirdi (Programda kontrol edilir)

0= Hiçbir RB<7..4> pini durum değiştirmedi


   OPTION REGISTER(DURUM KAYDEDİCİSİ)


            Bu register değişik kontrol bitlerini içeren özel bir register'dır. B portunun çıkışlarını pull-up yapan, interrupt  sinyalinin tetikleme kenarını seçen, TMR0 ve WDT için frekans bölme sayısını belirten ve TMR0 veya WDT seçme bayrağı bulunduran bir registerdir.
  
7
6
5
4
3
2
1
0
RBPU’
INTEGD
TOCS
TOSE
PSA
PS2
PS1
PS0

  RBPU' : PORTB pull-up aktif etme bayrağı
1 : PORTB pull-up’ lar pasifleştirilir.
            0 : PORTB pull-up’ lar aktifleştirilir.

   INTEGD : Interrupt kenarı seçme biti
             1 :  Interruptlar RB0/INT sinyalin yükselen kenarında oluşur
             0 :  Interruptlar RB0/INT sinyalin düşen kenarında oluşur.
   TOCS : TMR0 clock sinyali kaynağı seçme biti

             1 : RA4/TOCKI pinden alınan clock sinyali
             0 : Komut dizimi ile oluşturulan clock ( CLK0 )

   TOSE : TMR0 harici clock sinyali kenar seçme biti
             1 : Düşen kenarda artış
             0 : Yükselen kenarda artış
   PSA : Frekans bölücü seçme biti
             1 : Prescaler (frekans bölme sayısı) değeri WDT için geçerli
             0 : Prescaler değeri Timer0 için geçerli
   PS2, PS1, PS0 : Prescaler değeri seçme bitleri


PS2  PS1  PS0
 TMR0 Değeri
WDT Değeri 
0
0
0
 1/2
 1/1
0
0
1
 1/4
 1/2
0
1
0
 1/8
1/4
0
1
1
 1/16
 1/8
1
0
0
 1/32
 1/16
1
0
1
 1/64
 1/32
1
1
0
 1/128
 1/64
1
1
1
 1/256
 1/128

Örnek_11 RB0(Harici ) kesme örneği
void interrupt()                       // interrupt alt programı
{
portb=~portb;                          // portb'yi tersle
delay_ms(10000)                    //10 sn bekle
INTCON.INTF=0;                   // RB0 kesmesi bayrağını sıfırla
}
 void main()                                        //Ana program
{
INTCON.GIE=1;           
INTCON.INTE=1;         
OPTION_REG.INTEDG=0;   
trisb=0b00000001;      
portb=0;               
while(1)               
{
portb=0xff;   
}
}

Örnek_12 TMR0 kesme örneği
unsigned cnt;
void interrupt() {
  if (INTCON.TMR0IF) {
    cnt++;                     
    INTCON.TMR0IF = 0;                    //  TMR0IF sıfırla
      }
}


void main() {
  ADCON1=7;             
  TRISB  = 0;             
  PORTB = 0xFF;            
  TMR0 = 0;              
  INTCON.GIE = 1;                
  INTCON.TMR0IE = 1;         
  cnt = 0;                     
  do {
    if (cnt >= 122) {
      PORTB = ~PORTB;           // Toggle PORTB LED
      cnt = 0;                 }
  } while(1);
}


 

LCD

Sıvı kristal displeyler (LCD’ler)  birçok uygulamada kullanılırlar. Bunun nedeni LCD’lerin pek çok sıradan video göstericilere göre okunmaları daha kolaydır ve uzun zaman diliminde onlarla çalışmak daha zevklidir. Sınırlı görüş açısı, parlaklık, kontrast (zıtlık), yüksek imalat maliyeti gibi sınırlandırıcı özellikleri olmakla birlikte, araştırmalar devam ederken bu sınırlamalar yavaş yavaş daha önemsiz olmaya başlamıştır.
Bugünün LCD’leri pasif ve aktif olmak üzere iki tip olarak karşımıza çıkar. Daha az pahalı pasif matrix displeyler imalat maliyeti, cevap verme zamanı, görüş açısı ve resim kalitesi itibariyle ticaret dışıdır. Aktif matrix displeyler süper resim kalitesi ve görüş özelliğine sahiptir. Fakat çalışmaları için daha fazla güce ihtiyaçları vardır ve imalatları çok pahalıdır. Farkına varmasak bile LCD paneller günlük hayatımızın bir parçası gibidir. En basitinden bazı cep telefonlarında, hesap makinalarında ve birçok elektronik eşyada bu teknoloji kullanılmaktadır. LCD paneller hafif ve az yer kaplarlar. Yaptığınız devrelere küçük bir LCD panel bağlayarak devreden, kullanıcıya göndermek istediğiniz mesajları bu ekrana yazdırabilirsiniz.
LCD_Init()

Tanımı
  • LCD_D7: Data bit 7
  • LCD_D6: Data bit 6
  • LCD_D5: Data bit 5
  • LCD_D4: Data bit 4
  • LCD_RS: Register Select (data/instruction) signal pin
  • LCD_EN: Enable signal pin
  • LCD_D7_Direction: Direction of the Data 7 pin
  • LCD_D6_Direction: Direction of the Data 6 pin
  • LCD_D5_Direction: Direction of the Data 5 pin
  • LCD_D4_Direction: Direction of the Data 4 pin
  • LCD_RS_Direction: Direction of the Register Select pin
  • LCD_EN_Direction: Direction of the Enable signal pin

Örnek
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
...



Lcd_out
Tanımı
Metni (text) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) yazar. Hem sabitler ve hem de dizi değişkenlerini bir metin(text) gibi gönderebilir.
Gereklilikleri
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
Örnek
Lcd_Out(1,2,”text”) text yazısını 1 satır 2. karekterden başlatır.
Lcd_out_cp
Örnek                       Lcd_Out_Cp("Here!");
Lcd_Cmd
Tanımı
Komutu lcd’ye yollar. Foksiyona önceden belirtilmiş sabitlerden birini geçebilirsiniz.
Gereklilikleri
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
Örnek
Lcd_cmd(lcd_clear)   Lcd ekranını temizler.
Lcd_Chr
Tanımı
Karakteri(character) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) yazar. Hem sabitler ve hem de dizi değişkenlerini bir character gibi gönderebilir.
Gereklilikleri
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
Örnek
Lcd_chr(1,3,’’i’’)  i  karakteri  1.satır 3.karakterden başlat.
Lcd_Chr_Cp
Tanımı
Karakteri(character) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) başlayarak başlar. Sabitler ve hem de dizi değişkenlerini bir character gibi gönderebilir.
Gereklilikleri
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
Örnek
Lcd_Chr_Cp(‘’i’’) ‘’i’’ yi imlecinin bulunduğu yere yaz

LCD KOMUTU
AMACI
_LCD_FIRST_ROW
İmleci birinci satıra taşı
_LCD_SECOND_ROW
İmleci ikinci satıra taşı
_LCD_THIRD_ROW
İmleci üçüncü satıra taşı
_LCD_FOURTH_ROW
İmleci dördüncü satıra taşı
_LCD_CLEAR
Displeyi temizle
_LCD_RETURN_HOME
İmleci başa dönder
_LCD_CURSOR_OFF
İmleci kapat
_LCD_UNDERLINE_ON
İmlecin altı çizgili
_LCD_BLINK_CURSOR_ON
İmlecin flash yapmasını sağla
_LCD_MOVE_CURSOR_LEFT
İçeriği değiştirmeden verileri sola kaydır
_LCD_MOVE_CURSOR_RIGHT
İçeriği değiştirmeden verileri sağa kaydır
_LCD_TURN_ON
Lcd yi aç
_LCD_TURN_OFF
Lcd’ yi kapat
_LCD_SHIFT_LEFT
Ekrandaki veriyi değiştirmeksizin sola kaydır
_LCD_SHIFT_RIGHT
Ekrandaki veriyi değiştirmeksizin sağa kaydır




Örnek_13 LCD’ ye yazdırma
char a[ ]= “ELEKTRONIK";
char b[ ]= " VE OTOMASYON";

// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

Void main{
Trisb=0;
lcd_init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off);
LCD_OUT(1,1,a);
LCD_OUT(2,1,b);
}
Örnek 14 LCD’ de 0-255 arası sayan program
  İnt t;
  string txt [3];
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

Void main(){
trisb=0;
lcd_init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off)Ü

while (1){
for (t= 0; t = 255; t++){
ByteToStr(t, txt);
lcd_out(1,1,txt);
delay_ms(1000);
}
}
}