değişkeni sfr adresine yerleştirmek ?

Başlatan WrtM, 14 Mart 2016, 20:35:12

WrtM

merhaba, aşağıdaki gibi bir union var.

union
{
unsigned char all;
   
  struct   {
     
         bool bit_1:1;
         bool bit_2:1;
         bool bit_3:1;
         bool bit_4:1;
         bool bit_5:1;
         bool bit_6:1;
         bool bit_7:1;
         bool bit_8:1;
            }klm;

}hepsi;

all değişkenine hepsi.all diyerek ulaşıyorum (içeriğini okuyup yazabiliyorum) , union veri tipi olduğu için değişken içeriği doğal olarak struct içeriğine yansıyor. struct içeriğindeki değişkenleri 1 bit olarak sınırladım onlarada  hepsi.klm.bit_1  olarak ulaşıyorum, buraya  kadar bir sorunum yok gelelim asıl yapmak istediğim şeye;
hepsi.all isimli değişkeni mikronun örnek olarak sfr registerlarından 'PC_ODR' registerına ilişkilendirmek istiyorum.Yani hepsi.klm.bit_1 isimli değişkeni 1 yaptığımda PC_ODR registırının ilgili biti 1 olacak.  all isimli değişkenin adresini PC_ODR adresine atamak istedim ama olmadı. ne yapmam gerek?

yldzelektronik

#1
#define PC_ODR_Addr   (unsigned char*) 0x1234 //Registerin 8 bit olduğu varsayıldı.

union{
 unsigned char val;
  struct  {
         bool bit_1:1;
         bool bit_2:1;
         bool bit_3:1;
         bool bit_4:1;
         bool bit_5:1;
         bool bit_6:1;
         bool bit_7:1;
         bool bit_8:1;
  }bits;

}PC_ODR_Typedef;

PC_ODR_Typedef *PC_ODR = PC_ODR_Addr;


*PC_ODR = 1;
*PC_ODR.bits.bit_8 = 1;


Edit:Düzeltme.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

WrtM

hocam mantık doğru gibi gözüküyor ancak derleyici çok kızdı. sadece PC_ODR_Typedef *PC_ODR = PC_ODR_Addr; satırında bile hata veriyor.
hatta union tanımlayıp PC_ODR_Typedef *PC_ODR; yazsam bile hata veriyor.

Klein

typedef union{
  char x;
  struct{
    char a:1;
    char b:1;
    char c:1;
    char d:1;
    char e:1;
    char f:1;
    char g:1;
    char h:1;
  };
}TPort;

TPort *Port  = (TPort *) GPIOx_BaseAddress + ODR_Offset;

Denemedim ama sıkıntı çıkarmaması gerek.


WrtM

Cevaplar için teşekkürler, dediğiniz gibi yapınca bir sorun olmadı.Değişken içeriklerini değiştirdiğimde çıkış portundaki değişimleri gözlemleyebiliyorum.

değişkenlere tek tek ulaşmak için ;

(*Port).a=0;

ya da

Port->a=0  kullandım.

hepsine birden tek seferde ulaşmak içinde ;

Port->x=0x01;