29 Kasım 2021, 15:07:05

Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H


değişkeni sfr adresine yerleştirmek ?

Başlatan WrtM, 14 Mart 2016, 23: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

15 Mart 2016, 00:04:51 #1 Son düzenlenme: 15 Mart 2016, 00:17:06 yldzelektronik

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

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.