bit tanımlama

Başlatan chaconne, 01 Haziran 2009, 15:43:50

chaconne

Merhaba.

hitech derleyiciyi yeni kullanmaya başladım da şu işi bi yapamadım:

char degisken;

diye bir değişken tanımlıyorum ve bunun her bir bitini isimlendirmek istiyorum. Nasıl yapılır?

arslan74

Alıntı yapılan: "chaconne"Merhaba.

hitech derleyiciyi yeni kullanmaya başladım da şu işi bi yapamadım:

char degisken;

diye bir değişken tanımlıyorum ve bunun her bir bitini isimlendirmek istiyorum. Nasıl yapılır?

Örnek kod:

typedef union 
{ 
    unsigned char _byte; 
    struct 
    { 
        unsigned BIT0:1; 
        unsigned BIT1:1; 
        unsigned BIT2:1; 
        unsigned BIT3:1; 
        unsigned BIT4:1; 
        unsigned BIT5:1; 
        unsigned BIT6:1; 
        unsigned BIT7:1; 
    }bits; 
} BITS;


Kullanacağım zaman tanımlaman gerek.

BITS cevap;


sonra ub şekilde erişebilirsin.


   cevap.bits.BIT3 = 1;
    cevap.bits.BIT0 = 1;

 
    n_data = cevap._byte;


Şeklinde kullanabilirsiniz.

Selamlar

chaconne

Teşekkürler.

Şunu da yapabilirim heralde

Alıntı yapılan: "kod"
#define    x     cevap.bits.BIT0

x = 1;

gibi.

arslan74

Alıntı yapılan: "chaconne"Teşekkürler.

Şunu da yapabilirim heralde

Alıntı yapılan: "kod"
#define    x     cevap.bits.BIT0

x = 1;

gibi.

Onu ancak tanımladıktan sonra kullanabilirsin. Pekte mantıklı gibi  birşey gibi durmuyor.

Eğer sadece tek bir bit kullanacaksan o zaman bit değişken tanımla ve kullan.

chaconne

Yok tabi ki senin yazdıklarını yazdıktan sonra yapılır.

Senin yazdıklarından sonra

Alıntı yapılan: "Kod:"

#define a cevap.bits.BIT0
#define b cevap.bits.BIT0
#define c cevap.bits.BIT0
#define d cevap.bits.BIT0

bit u,v,w,x;

....

cevap = disaridanGelenBirVeri;

....

u = a;
v = b;

....

w = d;

....




cevap değişkeninin her bir biti farklı bir işlem için kullanılıyor ve cevap değişkeninin değerleri dışarıdan gelen herhangi bir veriyi bütün halinde alıyorsa işe yarar. Ayrıca bit tanımladığım takdirde gelen veriyi tek tek bu bitlere aktarmakla uğraşmam gerekir. Başka kullanımlar da olabilir tabi.

CCS derleyicisinde şu şekilde yapılıyordu:

Alıntı yapılan: "Kod"
#BIT    x    cevap.0
#BIT    y    cevap.1
#BIT    z    cevap.2

Teşekkürler.

MURSEL

typedef union 
{ 
    unsigned char _byte; 
    struct 
    { 
        unsigned x:1; 
        unsigned y:1; 
        unsigned z:1; 
        unsigned f:1; 
       int  adress:4;
    }bits; 
} BITS; 

BITS cevap;



cevap.y=1;
cevap.x=cevap.y;
if(cevap.x==1);
output_bit(pin_a0,cevap.x);

bu şekildede işini görebilirsin

cevap değişkeninin değerleri dışarıdan gelen herhangi bir veriyi bütün halinde alıyorsa işe yarar


bütün halinde alıyor
yukarıdaki yapılandırma
cevap degişkenin son 4 bitini gelen adress olarak düşünmüşüm  cevap degişkeni hangi degeri alırsa ona göre de adress degerim ve digerleri degişiyor kolay gelsin iyi calışamar

arslan74

CCS, C nin kurallarının dışına cıkmış. O yüzden onu baz almak doğru değil. Ayrıca verdiğin örnekte sorumu soruyorsun yoksa cevapmı veriyorsun anlamadım.

Eğer soru soruyorsan. cevap birliğine(union) doğrudan atama yapamasın. Ancak içindeki bir değere atama yapabilirsin.

cevap._byte = disaridanGelenBirVeri;


Şeklinde olursa doğru olur. Senin gösterdiğinde hata var.

MURSEL

sizin verdiginiz örnekten yola cıkıp acıklama yapayım dedim ama beceremedim sanırım

char disardan_aldigim_veri  ;
struct microcell
{
      boolean  motor;
      boolean  fan;
      boolean  lamba;
      boolean  ok;
      int  adress:4; 

}gelen;

#byte   gelen= disardan_aldigim_veri    //


ana programda da

 if(gelen.lamba==1)
 {
 lcd_putc("lamba yaniyor");
 }

output_bit(pin_e0,gelen.ok);
output_bit(pin_e1,~gelen.ok);

printf(lcd_putc,"\f%d",tus.adress); bu sekilde bit ve bayt ları degerlendirebilrsin

ccs derleyicisinde bu şekilde kullanbiliyorum  


arslan74 hocamızın "CCS, C nin kurallarının dışına cıkmış" sözünü dikkate alırsak hi_tech için gecerli olmayabilr.

papylon

Peki, aşağıda ki gibi bir tanımlama yapmak mümkün değimli?
typedef union 
{ 
	unsigned int integer;
    struct 
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned byte:8; // veya unsigned char byte;  	
    } bitlerinden;
} pire;
pire x;

Yani bir int değişkeninin ilk 10-bit'ini bu şekilde kullanmak istesem,  ilk ikisini bit olarak sonraki 8'ini byte olarak kullanmak mümkün değimli?

Aslında yaptım ama istediğim olmadı. byte olarak tanımladığım değişkene bir değer yazdığımda veya okuduğumda, int değişkeninin yüksek veya düşük byte'ına erişebiliyorum. Bu da benim istediğim şey değil. Yani ben arada kalan byte'a ulaşmak istiyorum.

M_B

struct lcd_pin_map {                 // This structure is overlayed
   int    data     : 4;              // be pin B0.
   int    rs       : 1;
   int    enable   : 1;
   int    rw       : 1;
   int    en       : 1;      
} lcd;


Yukardaki yapıyı direkt olarak herhangi bir porta yonlendirmek
ve
lcd.rs=1;  dediğimde ise PORTB nin RB4 nolu aktif olsun.
lcd.en=1; dediğimde ise PORTB nin RB7 nolu aktif olsun.
veya lcd.data=9; dediğimde ise PORTB nin RB0-RB3 çıkışlarında gözüksün.
Yalnız yazdıgım pin çıkış verecek diğer pinler bundan etkilenmiyecek
unsigned int *temp;

temp=&lcd;
PORTB = *temp;
dediğimde atama yapabiliyorum ama  diğer pinlerin de durumu değişiyor.
Bu konuda bilgisi olan arkadaşlardan yardım istiyorum.

Teşekkürler

Not: kısaca işin özeti PORTB nin LSB kısmı nı butun olarak kontrol edecem.
MSB kısmını ise bit bazında kontrol etmek istiyorum.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

arslan74

Merhaba,

Aslında bu işin başka çözümleride var illa öyle yapılmak zorunda değil. örneğin kendim buna benzer bir uygulamayı şöyle yapmıştım.

//#define	LCD_RW RB7
#define	LCD_EN RB7
#define	LCD_RS RB6

#define	LCD_DB4 RA0
#define	LCD_DB5 RA3
#define	LCD_DB6 RA1
#define	LCD_DB7 RA2

/////////////////////////////

#define	TRIS_EN		TRISA3
#define	TRIS_RS 	TRISA2

#define	TRIS_DB4 	TRISA7
#define	TRIS_DB5 	TRISA6
#define	TRIS_DB6 	TRISA1
#define	TRIS_DB7 	TRISA0


Sadece en başta bütün pinleri başta tımladım ondan sonra bu tanımladığımı kullandım. En özemli özelliği isteiğin pini kullanabiliryorsun ve diğer pinler etkilenmiyor.

Sonrasında init ve write kodunda ufak değişklikler yaprak oluyor.

/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
	char init_value;

	init_value = 0x3;	// RB4=1, RB5=1, RB6=0, RB7=0;

	LCD_RS = 0;
	LCD_EN = 0;

	
	TRIS_DB4 = 0;	// INPUT
	TRIS_DB5 = 0;	// INPUT
	TRIS_DB6 = 0;	// INPUT
	TRIS_DB7 = 0;	// INPUT
	
	TRIS_RS = 0;	// INPUT
	TRIS_EN = 0;	// INPUT


	LCD_RS = 0;
	LCD_EN = 0;
	
	DelayMs(35);	// wait 15mSec after power applied,
	
	//LCD_DATA = init_value; //  0X3
	LCD_DB4 = 1;
	LCD_DB5 = 1;
	LCD_DB6 = 0;
	LCD_DB7 = 0;
	
	LCD_STROBE();
	DelayMs(25);	// 5
	LCD_STROBE();
	DelayUs(200);	// 200
	DelayUs(200);	
	LCD_STROBE();
	DelayUs(200);	// 200
	DelayUs(200);	
	
	//LCD_DATA = 2;	// Four bit mode
	LCD_DB4 = 0;
	LCD_DB5 = 1;
	LCD_DB6 = 0;
	LCD_DB7 = 0;
	
	
	LCD_STROBE();

	lcd_write(0b00011100); // Set interface length

//	lcd_write(0xF); // Display On, Cursor On, Cursor Blink
	
	lcd_write(0b00101000); // function set 4 bits, 2 lines, font set # 1
	lcd_write(0b00001100); // display on, cursor off, blink off
	lcd_write(0b00000110); // increment - no display shift
		
	lcd_write(0x6); // Set entry Mode
	lcd_clear();	// Clear screen
}


void
lcd_write(unsigned char c)
{
	DelayUs(40);
	
	//LCD_DATA = ( ( c >> 4 ) & 0x0F );
	if ( c & 0b00010000 )
		LCD_DB4 = 1;
	else
		LCD_DB4 = 0;

	if ( c & 0b00100000 )
		LCD_DB5 = 1;
	else
		LCD_DB5 = 0;

	if ( c & 0b01000000 )
		LCD_DB6 = 1;
	else
		LCD_DB6 = 0;

	if ( c & 0b10000000 )
		LCD_DB7 = 1;
	else
		LCD_DB7 = 0;
		
	
	LCD_STROBE();
	
	//LCD_DATA = ( c & 0x0F );
	if ( c & 0b00000001 )
		LCD_DB4 = 1;
	else
		LCD_DB4 = 0;

	if ( c & 0b00000010 )
		LCD_DB5 = 1;
	else
		LCD_DB5 = 0;

	if ( c & 0b00000100 )
		LCD_DB6 = 1;
	else
		LCD_DB6 = 0;

	if ( c & 0b00001000 )
		LCD_DB7 = 1;
	else
		LCD_DB7 = 0;
	
	
	LCD_STROBE();
}

/*
 * 	Clear and home the LCD
 */

void
lcd_clear(void)
{
	LCD_RS = 0;
	lcd_write(0x1);
	DelayMs(20);
}


Selamlar