ATMEL PROGRAMLAMA 6- Kod düzenlemesi


    Bir önceki konuda yazdığımız kodlar aşağıdaki gibiydi. Şimdi bu kodlar üzerinde biraz düzenleme yapmak istiyorum. böylece  programımızın  daha kullanışlı , daha az hatalı ve taşınabilir bir hal almasını sağlayacağız.

   Kodların taşınabilir olması  derleyici değiştirdiğimizde kodların o derleyiciye de uygun şekilde yazılmış olmasıdır. Kodları bir derleyicide yazar derlersiniz. Ancak ilerki zamanlarda derleyici değiştirmek durumunda kaldığınızda aynı programı bu derleyicide de derleyebilmeniz işinizi kolaylaştıracaktır. yoksa kodları tekrar düzenlemeniz gerekecektir.



#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=1 yapılarak led yakıldı
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
         _delay_ms(200);
     }

}
    
     Programa ilk baktığımızda ve çalıştırdığımızda programın hatasız bir şekilde çalıştığını görebilirsiniz. Ancak programda bir hata var. bu hata bazı yazım şekillerinden kaynaklanıyor. sadece bir tane led yakıp söndürdüğümüz için hatayı fark edemiyoruz. Daha karmaşık programlarda , mikrodenetleyici portlarının hepsinin veya  çoğunun kullanıldığı durumlarda bu hatalar gün yüzüne çıkacaktır.

   Peki nedir bu hatalar.?
  
  PORTB = 0b00000000   veya  PORTB= 0b00000001 yazım şekli doğrudur.  ancak programda hatalı davranışlara neden olabilir. 
    burada PB0 biti üzerinde değişiklik yapılmak isteniyor. yani tek bir bit değişecek.ancak biz 8 biti birden değiştirdik.  Yani değiştirmeyi istemediğimiz bitleri de değiştiriyoruz. bu bitlere farklı elemanlar bağlı olabilir ve her defasında bunların durumlarını kontrol etmek ve hepsine göre bir çıkış yazmak durumunda kalabliriz. bu da zamanla karmaşıklığa ve hatay neden olacaktır. 
  
  Yapmamız gereken sadece istediğimiz bit üzerinde değişiklik yapmaktır. 

örneğin ;  Herhangi bir pini 1 yapmak istersek 
 
PORTB = 0b00000001  yazmak yerine 
 
PORTB  |= 0b00000001 yazmak daha doğru olacaktır.




Bu şekilde Portb   00000001 sayısı ile bit düzeyinde OR işlemine tabi tutulur. ve 0 ( sıfır)'a denk gelen pinler değiştirilmez 1'e denk gelen pin 1 ile OR işlemi sonucunda 1 yapılmış olur. Böylece sadece istediğimiz pin değiştirilmiş olur.


 bir diğer yöntem pini belirterek yapmak
  
   PORTB |=(1<< PINB0)  yazmak daha doğru olacaktır.


peki 1 yaptığımız PB0'ı 0 (sıfır) yapmak istersek ne yapmalıyız.

PORTB = 0b00000000  yazmak yerine 
 
PORTB  &= 0b11111110 yazmak daha doğru olacaktır.


 Bu şekilde Portb   11111110  sayısı ile bit düzeyinde AND (&) işlemine tabi tutulur. ve 1 'e denk gelen pinler değiştirilmez 0 (sıfır)'a denk gelen pin 0 ile AND işlemi sonucunda 0 yapılmış olur. Böylece sadece istediğimiz pin değiştirilmiş olur.





 



 bir diğer yöntem pini belirterek yapmak
 
    PORTB &=~(1<< PINB0)  yazmak daha doğru olacaktır.


Led'i belli aralıklarla yakıp söndürmek  TOGGLE anlamına gelmektedir


   PORTB |=(1<< PINB0) ;
  _delay_ms(200);
  PORTB &=~(1<< PINB0) ;
  _delay_ms(200);


yazmak yerine


  PORTB ^=(1<< PINB0) ;   // toggle işlemi yapar
_delay_ms(200);

 yazmak daha doğru olacaktır.


Programımızın son hali  


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


int main(void)
{

      PORTB =0x00;
    DDRB |=(1<<PINB0);
  
        while (1)
            {
                PORTB ^=(1<<PORTB0);

                _delay_ms(200);
                _delay_ms(200);
                _delay_ms(200);
                _delay_ms(200);
                _delay_ms(200);
        }
}    


Yorumlar