ATMEL PROGRAMLAMA 5- led yakma & _delay_ms()

   Bir önceki yazımızda Atmega328p'ye led'in nasıl bağlanacağını , led'e seri bağlanacak direnç değerinin nasıl belirleneceğini ve Atmega328p'de port işlemlerinin nasıl yapılacağından bahsettik. mikrodenetleyicimizin PB0 pinine bağladığımız led'i yakan programı Atmel studio 7.0 programında  yazıp derelemeyi öğrendik.



    programımız şu şekildeydi.

/*
 * ilk.c
 *
 * Created: 28.12.2015 13:10:51
 * Author : kermit
 */ 

#include <avr/io.h>
  
int main(void)
{

   PORTB = 0b00000000 ;    // ilk an için PORTB nin tüm çıkışları sıfır yapılıyor.
   DDRB  =  0b11111111   ;  // PORTB tüm bitleri çıkış yapıldı

   
   PORTB= 0b00000001  ;    //  PB0=1 yapılarak led yakıldı.
    while (1)
    {

          ;
    }
}



Bu konumuzda ise Led'imizi belli süre aralıklarıyla yakıp söndürmeyi göstereceğim. böylece _delay_ms()  fonksiyonunun nasıl kullanılacağını öğrenmiş olacağız.

Programımız basitçe şöyle olacak

sonsuz döngü
    {
        led_yak;
        bir süre bekle;
        led_sondur ;
        bir süre bekle;
   }

Led'i yakıp bir süre beklemeliyiz ,yoksa led'in yandığını göremeyiz .Çünkü mikrodenetleyici programları çok hızlı (mikrosaniye seviyesinde) bir şekilde  işler ve hemen led_sondur  işlemine geçer led'in yandığını göremeyiz.

"bir süre bekleme" işlemini _delay_ms(x) fonksiyonu ile yapabiliriz . burada x beklemek istediğimiz süreyi temsil ediyor ve milisaniye cinsindendir.. örneğin 1sn beklemek için şöyle yazmalıyız

1sn=1000msn  olduğuna göre _delay_ms(1000)  .

bu yazım şekli doğrudur ancak _delay_ms() fonksiyonu ile bir defada bu kadar uzun bekleme sureleri yapmak  doğru değildir. çünkü bu bekleme suresi çok hassas olarak 1000msn beklemez. az veya çok olabilir. Çünkü bu hesaba denetleyicimizin komut işleme sürelerini de katmamız gerekir.

_delay_ms() fonksiyonuna en fazla 200msn civarı bir süre yazmak daha uygun olacaktır. 

1000 msn lik bir bekleme suresi için 5 defa arka arkaya    _delay_ms(200) yazabiliriz. ve bu daha az hata yapmamızı sağlar.
 
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);


   _delay_ms() bir fonksiyondur ve tanımlanması gerekir. bu fonksiyon   "util/delay.h" veya "avr/delay.h"  dosyasında tanımlanmıştır. Fonksiyonu kullanabilmemiz için bu header dosyalarını programın en  başında projemize dahil etmemiz gerekir. Aksi taktirde derleme işlemi sırasında derleyicimiz hata verecektir.    

    Bekleme süresi  CPU çalışma frekansına bağlı olarak ayarlanır. bu nedenle  CPU çalışma frekansını da programın en başında derleyiciye bildirmemiz gerekmektedir. bu değerde şimdilik 1MHz'dir. (neden 1Mhz ?-  bir önceki konuda anlatılmıştı )

şimdi programımızı baştan yazacak olursak


#define  F_CPU 1000000ul   
#include <avr/io.h>
#include <util/delay.h>


int main(void)
{

   PORTB = 0b00000000 ;    // ilk an için PORTB nin tüm çıkışları sıfır yapılıyor.
   DDRB  =  0b11111111   ;  // PORTB tüm bitleri çıkış yapıldı

   
 
    while (1)
    {

        
           PORTB= 0b00000001  ;    //  PB0=1 yapılarak led yakıldı
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
         _delay_ms(200);

           PORTB= 0b00000000 ;    //  PB0=0 yapılarak led söndürüldü
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
         _delay_ms(200);
     }
}




     


Yorumlar

  1. Hocam elinize sağlık.
    Atmel programlama ile ilgili oldukça güzel bir arşiv oluşturmuşsunuz.

    YanıtlaSil

Yorum Gönder