struct/union icinde farklı adreslerde bit tanımlama

Başlatan piedos, 10 Aralık 2006, 23:26:19

piedos

struct/union icinde farklı adreslerde bit tanımlama yapmak istiyorum
struct{
    char anahtar1:1 @ 7*8+1;   //C portunun ikinci pini
    char motorCikis:1 @ 8*8+3;   // D portunun 4. pini
    char portBilgisi    @6*8;//B portu
} myStruct;


yukarıdaki kod hatalı ama nasıl yazılması gerektiğini bulamadım, tabii yazılabiliyorsa, bunu define la da yapabilirim ama benim için önemli olan hepsini struct içinde saklayabilmek şu anda

teşekkürler
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

gsever

struct{
    char anahtar1:1 @  ((unsigned)&PORTC*8)+1;     // C portunun ikinci pini
    char motorCikis:1 @ ((unsigned)&PORTD*8)+3;   // D portunun 4. pini
    char portBilgisi    @ ((unsigned)&PORTB*8);         // B portu
} myStruct;


şeklinde olabilir, ilk kez görüyorum bu tanımlamayı, dil ve hi-tech izin veriyor mu emin değilim, denemek ve sormak gerek.

YESILKOD

Şu anda evde olmadığım için deneyemiyorum ama Bence şu şekilde olması gerek...

struct{
      static volatile bit anahtar1 @ (unsigned)&PORTC*8+1;
      static volatile bit motorCikis1 @ (unsigned)&PORTD*8+3;
      static volatile unsigned char portBilgisi @ 0x06;
}myStruct;


yinede bi denemek lazım...

YESILKOD

Adamım dün gece 2 ye kadar uğraştım beynimi beynim pörtledi ama istediğin şeyi buldum :idea:

Ama bir tek şey dışında: (Yapıyı sadece bir tek port için kullanabiliyosun ve bitlerini istediğin gibi ayarlayabiliyosun) Yani şöle;

* yeni bir tip tanımlıyosun struct yapıda mesela;
typedef struct
      {
         unsigned a : 1   ; //birinci bit
         unsigned b : 2   ; //iki ile üçüncü bit
         unsigned c : 1   ; //dördüncü bit tanımla
         unsigned   : 4   ; //son dört bit tanımla
      }Port;


* Ardından bu oluşturduğun yeni tipten bir tane oluşturup herhangi bir portu göstermesini sağlıyosun mesela;
static volatile Port  PrtB @ (unsigned)&PORTB;


*Artık istediğin gibi kullanabilirsin
PrtB.a=1;  //PORTB'nin birinci biti işler
 PrtB.b=0x03 //PORTB'nin iki le üçüncü bitine 0x03 değeri atar
  ...


Ama yapının içine başka bir portla ilgili komut ekleyemedim. Umarım bu kod işine yarar kolay gelsin... ;)

piedos

Teşekkürler,

ancak önceden de yazdığım gibi istediğim şey bu değil, ancak çözüme biraz yaklaştırdı, şöyle:

PORTA,B,C,D,E değişkenleri memory de ardışık adreste olduğu için
5*8=40 bitlik struct tanımlanır ve başlangıç adresi PORTA verilir. böylece istediğim port elemanına bununla ulaşabilirim

ancak başka SFR bitlerine ulaşmak istersem iş zor
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."