Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => IAR => Konuyu başlatan: WrtM - 14 Mart 2016, 20:35:12

Başlık: değişkeni sfr adresine yerleştirmek ?
Gönderen: WrtM - 14 Mart 2016, 20:35:12
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?
Başlık: Ynt: değişkeni sfr adresine yerleştirmek ?
Gönderen: yldzelektronik - 14 Mart 2016, 21:04:51

#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.
Başlık: Ynt: değişkeni sfr adresine yerleştirmek ?
Gönderen: WrtM - 14 Mart 2016, 21:41:37
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.
Başlık: Ynt: değişkeni sfr adresine yerleştirmek ?
Gönderen: Klein - 15 Mart 2016, 19:20:09

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.

Başlık: Ynt: değişkeni sfr adresine yerleştirmek ?
Gönderen: WrtM - 15 Mart 2016, 21:42:56
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;