Haberler:

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

Ana Menü

Long int'in High 8 bitini alma

Başlatan SüleymanKara, 17 Mayıs 2007, 22:19:23

SüleymanKara

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?

leblebitozu

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);

aYe

a=(unsigned int)((sonuc>>2)&1);
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

xenitis

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

CaFFeiNe

Alıntı yapılan: "SüleymanKara"Merhaba;

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

Ziya

Alıntı yapılan: "xenitis"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
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.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

SüleymanKara

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

xenitis

Alıntı yapılan: "Ziya"
Alıntı yapılan: "xenitis"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
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