XC8 Yeni başlayanlar için basit sorular

Başlatan Extreme, 02 Mart 2015, 15:50:54

Tagli

İyi bayramlar.

PIC'in modeli nedir?
Ne iş yapan bir programın içinde geçiyor bu kod?
Bu tek bir satırın altında ne var, üstünde ne var?
Gökçe Tağlıoğlu

OxfordBlue

Hocam internetde gezerken karşıma gelmişti. sadece komut setinde eksiklerim olduğunu düşündüm

while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W))

Burada tahminim SSPCON2= 0x1F ise  veya SSPSTATBİTS.r_w bir olduğu müddetçe burada bekle diye anlıyorum.

sovalye

çok yanlış gelmişsiniz :)

sspcan2 'nin bitleri ile 0x1f in bitleri üzerinde AND işlemini yap daha sonra bunu sspstatbits.r_w ninkiler ile OR la çıkan sonuç sıfırdan farklı ise döngünün içine gir.

baran123

| = or işlemi yap
& = ve işlemi yap
|| = (1. veya 2.)
&& = (1 ve 2)

mesaj birleştirme:: 24 Eylül 2015, 21:29:11

https://gelecegiyazanlar.turkcell.com.tr/konu/ios/egitim/ios-101/mantiksal-operatorler

OxfordBlue

define CHECK_BIT(var,pos)  !!((var) & (1 << (pos)))

merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?

vitruvius

Alıntı yapılan: OxfordBlue - 23 Ocak 2016, 20:53:21
define CHECK_BIT(var,pos)  !!((var) & (1 << (pos)))

merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?

Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.

var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.

int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)

0 değerini döndürecektir.

OxfordBlue

Alıntı yapılan: vitruvius - 23 Ocak 2016, 21:08:52
Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.

var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.

int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)

0 değerini döndürecektir.

teşekkürler hocam , kodun içeriğindende bahsedermisin?

benim bildiğim pos (1 << (pos)) sola kaydırma işlemi yapıyor.
!! hakkında hiç bilgim yok.

vitruvius

Mantık şu; bir bitin 1 mi 0 mı olup olmadığını nasıl anlarsın? O biti 1 ile "and" işlemine tabi tutarsan sana bitin değerini verir.

Yani ilk önce, hangi biti test etmek istiyorsan o bitin altına 1 sayısını yerleştirmek lazım. Diyelim ki çalıştığımız sayı 0x55;

01010101   bizim sayımız
00000001   0x01 (1 şu an 0. bitte)

Biz 6 numaralı biti test etmek istiyorsak alt sayıdaki 1'i altıncı bit hanesine kaydırmamız lazım.

01010101   0x55
01000000   1 << 6 işlemi ile 1'i, 6 bit sola kaydırdık. Böylece istediğimiz yere geldi.

Bundan sonra esas sayımızla bizim hazırladığımız "maske"yi "and" işlemine sokarsak;

01000000 sonucunu elde ederiz. Bu sayı hex olarak 0x40, decimal olarak 64'dür. Yani bu işlemin sonucunu int bir değişkene atarsan 64 olarak saklanır.

Ama bu sayıyı boolean bir değişkenmiş gibi kullanmak isteyebilirsin. Yani sayıyı ya 0'a, yada 1'e dönüştürmek isteyebilirsin. Burada "!" (lojik değil) operatörü devreye giriyor.

Lojik anlamda C dilinde bir sayı "0" değilse "1" olarak kabul edilir. Sayı negatif olsa bile. Yani;

01000000  lojik-1'dir. Bunun tersini alırsan;

!(01000000) lojik-0 elde edersin -> 00000000

Bunun bir daha tersini alırsan;

!(00000000) lojik-1 elde edersin -> 00000001

Yani lojik anlamda sayının değeri değişmemiş oluyor. Tersinin tersini almak sayıyı değiştirmez.

Örnek bir kodla bakarsak;

#include <stdio.h>
#define CHECK_BIT1(var,pos)  ((var) & (1 << (pos)))    // Hicbir lojik ters islemi yapmadan
#define CHECK_BIT2(var,pos)  !((var) & (1 << (pos)))   // Sonucun bir kere tersini alarak
#define CHECK_BIT3(var,pos)  !!((var) & (1 << (pos)))  // Sonucun iki kere tersini alarak

int main()
{
	int temp = 0x55;
	int result1, result2, result3;

	result1 = CHECK_BIT1(temp, 6);
	result2 = CHECK_BIT2(temp, 6);
	result3 = CHECK_BIT3(temp, 6);

	printf("Result 1: %#04x -> %d\n", result1, result1);
	printf("Result 2: %#04x -> %d\n", result2, result2);
	printf("Result 3: %#04x -> %d\n", result3, result3);

	return 0;
}


Bu kodun çıkışı:

Result 1: 0x40 -> 64
Result 2: 0000 -> 0
Result 3: 0x01 -> 1


Gördüğün gibi ilk makro'yu int bir değişkene yazınca 0x40, yani 64 olarak saklanır.
İkinci makro'yu int bir değişkene yazınca, bir kere lojik ters işlemini yaptığımız için kontrol ettiğimiz bitin tersini saklamış olduk. 0x00, yani 0.
Üçüncü makro'yu da int bir değişkene yazınca, kontrol ettiğimiz bitin tersinin tersini yazmış oluyoruz. 0x01, yani 1.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

OxfordBlue

Çok açıklayıcı oldu teşekkürler.

OxfordBlue

Merhaba bit tanımlaması yapmak istiyorum . main .c de kullandığım bir değişkeni örneğin system.c 'dede kullanmak istiyorum.

.c 'de diyorum . header demiyorum çünkü .header lar bit tanımlanamıyorum xc8'de bug olduğunu düşünüyorum

main.c
bit  a=0;

system.c
extern bit a;

bu şekilde çalışmalarda sorun oluyor . uyarı veriyor.
"initializer in extern declaration"

fikri olan var mı ?

Gökhan BEKEN

c dilinde bit diye bir değişken türü yok.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

#57


...
typedef union {
    struct {
        unsigned ADON                   :1;
        unsigned GO_nDONE               :1;
        unsigned CHS                    :5;
    };

...
while (ADCON0bits.GO_nDONE);


şeklinde Microchip biti tanımlamış ve kullanmış.

Gökhan BEKEN

Peki system.c dosyası bunu nerden anlasın? Arkadaşın sorunu bu bence :) bit typedef'inin tanımlı olduğu header'i system.c dosyasına include ederse düzelir sanırım.
Özel mesaj okumuyorum, lütfen göndermeyin.

Tagli

XC8'de bit türü var ve doğrudan kullanılabiliyor. Ancak sanırım bazı kısıtlamalara tabi. Yanlış hatırlamıyorsam ilk değer verilemiyor ama bu çok sorun değil. xc.h dışında bir şey include etmeye gerek de yok.
Gökçe Tağlıoğlu