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?
#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.
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.
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.
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;