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.
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.
#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
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
Yorum Gönder