Bit tanımlama, Bank değiştirme vs vs..

Başlatan Seferi, 31 Aralık 2011, 20:27:47

Seferi

İyi günler. Biraz önce hortlatmış olduğum konudan alıntı yaparak sorumu yenilemek hemde aklıma takılan yeni soruları sormak için konu açmak istedim..
ilk olarak Aşağıdaki kodla ilgili sorum olacak.
#ifndef  _REG16F628A_H_
#define  _REG16F628A_H_


typedef struct tagREG {
   int1 p0:1;
   int1 p1:1;
   int1 p2:1;
   int1 p3:1;
   int1 p4:1;
   int1 p5:1;
   int1 p6:1;
   int1 p7:1;
} REG;

REG PORTBbit;
REG PORTAbit;

REG TRISBbit;
REG TRISAbit;

#byte TRISAbit = 0x85
#byte TRISBbit = 0x86
#byte PORTBbit = 0x06
#byte PORTAbit = 0x05

#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte PORTA = 0x05
#endif


1.SORU:
Buradaki  REG, tagREG türünde bir değişken değil midir? O halde REG bir değişkense , "REG PORTAbit; " ne anlama geliyor?

2.SORU:
int1 p0:1;

Buradaki " : " ne işe yaramaktadır? Bu p0'ın 1bit olacağını mı gösteriyor? Eğer öyleyse "    int x:8;  " x'in 8 bitlik olacağı mı anlaşılıyor? Ve Yine eğer öyleyse zaten "int1" ifadesi bu işi görmüyor mu?
3.SORU:
#byte PORTA=5
#bit RA0=PORTA.0

şeklinde saklayıcılara direkt erişmek için tanımlamayı düşünüyorum, bu şekilde yaptığımda ram de ekstradan yer kaplar mı yoksa özel saklayıcıları kullanacağım için bir etkisi olmaz mı?
4.SORU:
Örneğin 16F628A için,
#byte OPTION=81

diye tanımladığımızda  Sadece OPTION un BANK2 deki adresini tanımlıyoruz, BANK4 deki 181'inci adreste de OPTION var(Bunun gibi diğer saklayıcılar da var), Bu durumun programa ne gibi bir etkisi olur? Sadece tanımladığımız adresi kullanacağından derleme sırasında boş yere bank değiştirerek  fazladan kod mu üretir?

Yardımcı olan herkesin, küçüklerimin gözlerinden, büyülerimin ellerinden öper saygılar sunarım..

Seferi


SpeedyX

Aslında tüm cevaplar herhangi bir C kitabında veya CCS nin help inde var.

1- REG bir tip tanımlamasıdır (type definition), PORTAbit ise REG tipinde bir değişkendir.

2- 1 bit olacağını gösteriyor, heryerde yazmak zorunlu değil, derleyiciye göre değişiyor, doğrusu :1 şeklinde yazmak. :8; de 8 bit olacağını gösteriyor.

3- RAM de yer kaplamaz hatta en doğru yol budur, sadece CCS için değil tüm işlemciler ve embedded derleyiciler için aynı tanımlamalar direkt adresi isimlendirme şeklinde yapılır.

4- Evet, derleyicide buna önlem alınmadıysa boş yere bank değiştirir. ASM kodlarından bunu yapıp yapmadığını izlemelisin.
Tam da bu konuda CCS nin güzel bir yanı var, getenv kullanarak adres atamasını derleyiciye bırakabilirsin, böylece örneğin birçok işlemcide çalışan kod yazabilirsin, işlemciyi değiştirdikçe derleyici de o işlemcinin OPTION registerının adresini OPTION byteına tanımlayacaktır. Kullanımı: #byte OPTION = getenv("SFR:OPTION")