Merhaba;
16f877 için yazdığım programda;
Long int (16 bit) olarak tanımlanan bir değişkenin ikinci bitiini almak istiyorum.
Adres low kısmın : 0x2E
High kısmın : 0x2F
long int sonuc;
int a;
a= *(&sonuc+1)
yazdığımda 16f877 0x2F'in içeriğini a değişkenine kopyalıyor ama
18f452'de a değişkenine 0x30'un içeriğini kopyalıyor.
Burda CCS mi yoksa ben mi hata mı yapıyorum?
Sonuç değişkeninin 2'nci bit değerini a değişkenine aktarmak için yapman gereken;
long int sonuc;
int a;
a=(sonuc & 2);
a=(unsigned int)((sonuc>>2)&1);
yaptığınız yanlış gibi geldi bana adres değerini bir arttırırsanız bildiğim kadarıyla pointer aritmetiğine göre tanımlanan veri türü kadar kaydırır yani long int değişkenin adresine 1 eklemek 16 bit ileri kaydırır ilk yaptığı yanlış sonuç vermemesi gerekir zaten ccs ansi uyumlu değil kolay diye popüler
long int sonuc;
int a;
a= (int)((sonuc & 0xFF00) >> 8);
bu istediğinizi verecektir sanırım
bu arada diğer arkadaşlar ikinci biti okumak istediğiniz yanılgısına nerden kapıldılar anlayamadım :)
kolay gelsin
Alıntı yapılan: SüleymanKaraMerhaba;
16f877 için yazdığım programda;
Long int (16 bit) olarak tanımlanan bir değişkenin ikinci bitiini almak istiyorum.
yanılgıya buradan kapılmışlardır sanırım
Alıntı yapılan: xenitisyaptığınız yanlış gibi geldi bana adres değerini bir arttırırsanız bildiğim kadarıyla pointer aritmetiğine göre tanımlanan veri türü kadar kaydırır yani long int değişkenin adresine 1 eklemek 16 bit ileri kaydırır ilk yaptığı yanlış sonuç vermemesi gerekir zaten ccs ansi uyumlu değil kolay diye popüler
long int sonuc;
int a;
a= (int)((sonuc & 0xFF00) >> 8);
bu istediğinizi verecektir sanırım
bu arada diğer arkadaşlar ikinci biti okumak istediğiniz yanılgısına nerden kapıldılar anlayamadım :)
kolay gelsin
Orada pointer tanımlanmış bir değişken yok ki 1 arttırınca 2 bayt ilerlesin. Yapılan değişken adresinin bir fazlasının içeriğini göster demekten ibaret.
SuleymanKara, iki adet bir baytlık değişkeni sonuc değişkeninle union tanımla. iki adet bir baytlık değişkenlerden ilki sonuc'un düşük değerli, diğeri yüksek değerli baytını verir.
Pardon
2. biti şeklinde yazmışım, en değerli 8 bitini yani 2. byte'ı almak istiyorum.
Union tanımlaması nasıl yapılıyor, örnek içinde gösterebilirmisiniz
Teşekkürler
Alıntı yapılan: ZiyaAlıntı yapılan: xenitisyaptığınız yanlış gibi geldi bana adres değerini bir arttırırsanız bildiğim kadarıyla pointer aritmetiğine göre tanımlanan veri türü kadar kaydırır yani long int değişkenin adresine 1 eklemek 16 bit ileri kaydırır ilk yaptığı yanlış sonuç vermemesi gerekir zaten ccs ansi uyumlu değil kolay diye popüler
long int sonuc;
int a;
a= (int)((sonuc & 0xFF00) >> 8);
bu istediğinizi verecektir sanırım
bu arada diğer arkadaşlar ikinci biti okumak istediğiniz yanılgısına nerden kapıldılar anlayamadım :)
kolay gelsin
Orada pointer tanımlanmış bir değişken yok ki 1 arttırınca 2 bayt ilerlesin. Yapılan değişken adresinin bir fazlasının içeriğini göster demekten ibaret.
SuleymanKara, iki adet bir baytlık değişkeni sonuc değişkeninle union tanımla. iki adet bir baytlık değişkenlerden ilki sonuc'un düşük değerli, diğeri yüksek değerli baytını verir.
pointer tanımlaması gerekmez diziler de pointer olarak tanımlanmaz ama adreslere bir eklemek 1 byte değil tanımlı dizi elemanları boyutunca ilerler burda da aynı şey geçerlidir
#define LOBYTE(x) (*((char *)&x))
#define HIBYTE(x) (*(((char *)&x)+1))
bu iki makroyu kullanabilirsiniz
lByte = IntVal / 256u;
bu kod da tek assembly satırında istediğiniz byte'ı veriyor her ne kadar denemesem de çok hızlı çalıştığını okudum
union konusunda çok fazla tartışma var microchipin sitesinde derleyici bağımlı olduğunu iddia edenler var ve sizin derleyicide çalışıp çalışmayacağı garanti değil o yüzden bu araştırmayı size bırakıyorum
kolay gelsin