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;
}
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.
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.
|, 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.
ş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.
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.
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.
Çok çok teşekkür ederim Allah razı olsun.
@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))