Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: SüleymanKara - 17 Mayıs 2007, 22:19:23

Başlık: Long int'in High 8 bitini alma
Gönderen: SüleymanKara - 17 Mayıs 2007, 22:19:23
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?
Başlık: Long int'in High 8 bitini alma
Gönderen: leblebitozu - 18 Mayıs 2007, 12:13:45
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);
Başlık: Long int'in High 8 bitini alma
Gönderen: aYe - 18 Mayıs 2007, 12:37:01
a=(unsigned int)((sonuc>>2)&1);
Başlık: Long int'in High 8 bitini alma
Gönderen: xenitis - 18 Mayıs 2007, 17:49:02
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
Başlık: Re: Long int'in High 8 bitini alma
Gönderen: CaFFeiNe - 18 Mayıs 2007, 19:38:41
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
Başlık: Long int'in High 8 bitini alma
Gönderen: Ziya - 19 Mayıs 2007, 00:35:10
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.
Başlık: Long int'in High 8 bitini alma
Gönderen: SüleymanKara - 19 Mayıs 2007, 13:48:36
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
Başlık: Long int'in High 8 bitini alma
Gönderen: xenitis - 20 Mayıs 2007, 01:00:56
Alıntı yapılan: Ziya
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.
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