Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => Konuyu başlatan: Gökhan BEKEN - 30 Ağustos 2010, 12:23:37

Başlık: winavr bit_test
Gönderen: Gökhan BEKEN - 30 Ağustos 2010, 12:23:37
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;
}
Başlık: Ynt: winavr bit_test
Gönderen: JKramer - 30 Ağustos 2010, 12:45:41
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.
Başlık: Ynt: winavr bit_test
Gönderen: Gökhan BEKEN - 30 Ağustos 2010, 13:55:40
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.
Başlık: Ynt: winavr bit_test
Gönderen: JKramer - 30 Ağustos 2010, 14:30:39
|, 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.
Başlık: Ynt: winavr bit_test
Gönderen: Gökhan BEKEN - 30 Ağustos 2010, 14:31:17
ş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.
Başlık: Ynt: winavr bit_test
Gönderen: radres - 30 Ağustos 2010, 14:44:40
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.
Başlık: Ynt: winavr bit_test
Gönderen: JKramer - 30 Ağustos 2010, 14:49:16
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.
Başlık: Ynt: winavr bit_test
Gönderen: Gökhan BEKEN - 30 Ağustos 2010, 15:05:57
Çok çok teşekkür ederim Allah razı olsun.
Başlık: Ynt: winavr bit_test
Gönderen: papylon - 30 Ağustos 2010, 16:19:32
@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))