İşlemcide özel bit ve data alanları oluşturma

Başlatan fractal, 31 Ekim 2012, 10:35:05

fractal

bir işlemciye modbus 485 haberleşme yapacağım.modbus haberleşmede bit okuma ve yazma var.birde data okuma yazma var.şimdi ben işlemcide bu alanları nasıl oluştura bilirim.

örneğin..

m0--------m19 kalı olmayan bit alanı olsun
m20------m40  kalıcı bit alanı olsun

d0--------d19  kalı olmayan 16 bit data alanı
d20------d40 kalıcı olan 16 bit data alanı

modbus 485 ile başka bir cihazdan bu alanlara okuma yazma yapmak istiyorum.
nasıl bir yapı oluşturarak bunu yapabilirim.örnek c kodları olabilir...

Restantum cogniscutur Quantum deligutur

mehmet

C 'de enum komutuyla bitler oluşturmak mümkün ve her bitin
yazma/okuma özelliği var.

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

camby

Alıntı yapılan: fractal - 31 Ekim 2012, 10:35:05
bir işlemciye modbus 485 haberleşme yapacağım.modbus haberleşmede bit okuma ve yazma var.birde data okuma yazma var.şimdi ben işlemcide bu alanları nasıl oluştura bilirim.

örneğin..

m0--------m19 kalı olmayan bit alanı olsun
m20------m40  kalıcı bit alanı olsun

d0--------d19  kalı olmayan 16 bit data alanı
d20------d40 kalıcı olan 16 bit data alanı

modbus 485 ile başka bir cihazdan bu alanlara okuma yazma yapmak istiyorum.
nasıl bir yapı oluşturarak bunu yapabilirim.örnek c kodları olabilir...

Ben şu şekilde yaptım,

Örneğin "5" numaralı fonksiyon olan "Force Single Coil" komutu geldiğinde , fonksiyon yanlızca tanımlamış olduğum m0-m19 arasındaki alana erişebiliyor. 0. adres set edilmiş ise m0 , 19. adres set edilmişse m19 set oluyor. Eğer 20 nolu biti set et komutu gelirse işlem yapılmadan ilgili hata komutu cevap olarak yollanıyor. Fiziksel olarak m0-m19 da ( 20 bit ) toplamda 3 byte'lık yer kaplıyor. Fonksiyon içerisinde bu alanın belirlenmiş olması yeterli. Tabi ben ASM yazıyorum , siz sanırım dizi oluşturacaksınız. Modbus fonksiyonlarım dışında diğer sistem fonksiyonları da bu RAM alanına belirlediğim kurallar dahilinde erişebiliyor.

Diğer komutlar da bu şekilde. Her birinin RAM'de erişebildiği alan aralıkları ve eleman sayısı tanımlı.

fgokcegoz

struct  XXXXXXX 
{    
     unsigned char Bit0       :1;                
     unsigned char Bit1       :1;             
     unsigned char Bit2       :1;                
     unsigned char Bit3       :1;
     unsigned char Bit4       :1;                
     unsigned char Bit5       :1;             
     unsigned char Bit6       :1;                
     unsigned char Bit7       :1;
}sXvars;

#define   X      sXvars.Bit0
#define   Y      sXvars.Bit1
#define   Z      sXvars.Bit2
#define   W    sXvars.Bit3
#define   J      sXvars.Bit4
#define   K      sXvars.Bit5
#define   L      sXvars.Bit6
#define   M     sXvars.Bit7


Bu şekilde C de bit tanımlamaları yapmak mümkündür. X,Y,Z,W,J,K,L,M değişkenlerini yukarıdaki gibi define ettikten sonra bit değişkeni olarak kullanmak mümkündür. Bu arada X,Y,Z,W,J,K,L,M aynı byte ın bitleridir. Yapı içerisinde değişken tipi unsigned int olursa, 16 ya kadar, unsigned long int olursa, 32 bite kadar uzatılabilir. Böyle olursa bir bit için byte bölgesi işgal edilmediğinden ram den tasarruf edilmiş olur...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)