Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

winavr bit_test

Başlatan Gökhan BEKEN, 30 Ağustos 2010, 12:23:37

Gökhan BEKEN

s.a
öncelikle winavr ile ilgili bir bölüm olmadığı için buraya açmak zorunda kaldım avr kullanıpta winavr siz program yapan azdır çok azdır diye düşünüyorum.

Neyse soruna gelelim
pic mcu larla ccs c dilinde kullandığım
if(bit_test (degisken,bit)==1){ 
   komutlar 
}

bu komutları winavr için nasıl uyarlayabilirim?
Bu fonksiyon ile yapılan şey şu
örneğin bit_test (0xFA,3); yazarsak FA sayısının 3. biti olan 1 değerini gönderir (0xfa=0b11111010)

avr de şu geldi aklıma ama çalıştıramadım.
if((bit<<degisken)==1){ 
   komutlar; 
}
Özel mesaj okumuyorum, lütfen göndermeyin.

JKramer

0xFA'nın 3.bitinin 1 olup olmadığını test eder dersek daha doğru olur. Ccs'in yardım dosyasında bu fonksiyonun aşağıdakiyle aynı olduğu yazılmış:
var & (1<<bit)) != 0)

Yani
if((0xFA & (1<<3))

için 0b11111010 & 0b00001000.

Gökhan BEKEN

teşekkürler çalıştı.
Bu arada forumda birisi
PORTD=(1<<PIND7);
yazarak portb nin 7. biti 1 olur ve diğer pinler etkilenmez demişti. Bu komut yüzünden çok uğraştım
deneye deneye şöyle hallettim
PORTD|=(1<<PIND7);
bunu yapınca diğer pinler olduğu gibi kalıyor sadece istediğimiz pinlerin 1 veya 0 yapabiliyoruz.
Özel mesaj okumuyorum, lütfen göndermeyin.

JKramer

|, veya yani toplama işlemi olduğundan PORTD | (0b10000000) işleminin sonucu 7.bit 0 ise 0|1=1 olacak, 1 ise 1|1=1 olacak. Diğer bitler de 0 ile veya işlemine girdiklerinden 1|0=1, 0|0=0 olacak, yani değişmeyecekler.

Gökhan BEKEN

şimdi bir deneme daha yaptım
PORTD|=(1<<PIND7);
PORTD|=(0<<PIND7);
yaptığımda ikinci komut portd7 yi 0 yapamıyor?
Sadece 1 için işliyor ve ben diğer pinleri etkilemeden değer vermeyi hala yapamadım.
İnternette şu yöntemleri gördüm
1.yöntem:       PORTB&=~_BV(7);
2.yöntem:       bitset(PORTB, 0); ve  bitclr(SREG, 1);    (SREG ne anlama geliyor anlamadım)   
3.yöntem:       PORTD=(1<<7);
Bu yöntemleri internettte yazanlar diğer pinleri etkilemediğini söylüyor ama denedim hiç biri işimi göremedi.
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

PORTA |= (1<<PA3) ifadesi A portunun 3. bitini "lojik-1" yapar. PORTA'nın diğer pinlerinin durumu ise değişmez.

PORTA &= ~(1<<PA3) ifadesi A portunun 3. bitini "lojik-0" yapar. PORTA'nın diğer pinlerinin durumu değişmez.

_BV(x), ifadesi WinAVR'da tanımlı bir makrodur. Örneğin (1<<PA3) ifadesi yerine _BV(3) demen yeterli. Yani yukarıda verdiğim

PORTA |= (1<<PA3) ifadesi yerine PORTA |= _BV(3)'de yazabilirsin. Aynı işi yapar.

PORTA &= ~(1<<PA3) ifadesi yerine de PORTA &= ~(_BV(4)); şeklinde kullanabilirsin.

Yukarıdaki kodlar ile sadece istediğin pinin değeri değişir. Diğer pinler etkilenmez. Sende etkileniyorsa başka bir durum vardır. Belki pinlerin giriş çıkış durumlarını yanlış tanımlamışsındır.

JKramer

PORTD&=~(1<<PIND7)
          PORTD=0b11111010
  (1<<PIND7)=0b10000000
~(1<<PIND7)=0b01111111

&, çarpma sonucu=0b01111010

Ek:radres cevaplamış.

http://kineticsandelectronics.com/node/104

En altta avr ile ilgili makrolar var.

Gökhan BEKEN

Çok çok teşekkür ederim Allah razı olsun.
Özel mesaj okumuyorum, lütfen göndermeyin.

papylon

@meftun,
CCS C'de kullandığın gibi bitsel sorgulama yapabileceğin makroları, AVR'de aşağıdaki gibi kullanabilirsin, bu makrolar #include <avr/io.h> dosyasında tanımlanmışlardır.

if(bit_is_set(PINB, 0))

if(bit_is_clear(PINB, 5))