Problemas con Struct Arduino

Muy buenas, soy nuevo en este foro aunque sigo las respuestas a las preguntas que se realizan. Tengo un problema que no soy capaz de resolver: Si alguno ha trabajado con microcontroladores sabe que programar sus registros es bastante fácil, por ejemplo:
U1STAbits.UTXEN = 0 que hace referencia al bit UTXEN del registro de 16 bits U1STA, pues bien, pretendo hacer algo similar con Arduino valiéndome de una struct de 16 bits, aunque no es para programar sus registros:

struct StructOrdenFPGA {
     uint8_t   SelectorEntrada     :2; //PB0 y PB1
     uint8_t   EntradaSubidaBajada :1; //PB2
     uint8_t   DivisorEntrada      :5; //PB3 a PB7
     uint8_t   CNT                 :2; //PB8 y PB9
     uint8_t   RESContador         :1; //PB11
  };
  StructOrdenFPGA TramaParaFPGA, *DIRTramaParaFPGA;

Con el compilador CCS es muy fácil hacer y recuperar los cambios necesarios modificando los bits, por ejemplo:

  TramaParaFPGA.SelectorEntrada = 0b10;
  TramaParaFPGA.RESContador = 0b1;

(Estos cambios, obviamente Arduino los hace sin problemas)

En CCS los cambios ya se ven reflejados en Variable16 porque el puntero apunta a la primera dirección que ocupa la struct sin importar si es una variable o una struct:

unsigned int16 *Variable16 = &TramaParaFPGA;

En Arduino no soy capaz de obtener una variable que contenga los 16 bits porque los punteros son de tipo struct y no veo la forma de obtener su primera dirección para recuperar la variable modificada.
¿Alguna sugerencia de como se puede hacer? Muchas gracias

const uint32_t SERIAL_SPEED{256000};

struct StructOrdenFPGA {
     uint8_t   SelectorEntrada     :2; //PB0 y PB1
     uint8_t   EntradaSubidaBajada :1; //PB2
     uint8_t   DivisorEntrada      :5; //PB3 a PB7
     uint8_t   CNT                 :2; //PB8 y PB9
     uint8_t   RESContador         :1; //PB11
  };                   //data_record is a structure type
  StructOrdenFPGA TramaParaFPGA, *DIRTramaParaFPGA;

//////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(SERIAL_SPEED);
  while (Serial.available()>0)  Serial.read();
  Serial.println();
  uint16_t Valor16 = 44; 
  uint16_t &DIRValor16 = Valor16;
  Serial.println(DIRValor16);

  TramaParaFPGA.SelectorEntrada = 0b10;
  TramaParaFPGA.RESContador = 0b1;

  DIRTramaParaFPGA = &TramaParaFPGA;        
  Serial.println((*DIRTramaParaFPGA).SelectorEntrada);  //Imprime el valor de los dos primeros bits
}
//////////////////////////////////////////
void loop() {

}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

No estoy seguro si es lo que buscas pero puedes usar una union

const uint32_t SERIAL_SPEED{256000};

struct StructOrdenFPGA {
     uint8_t   SelectorEntrada     :2; //PB0 y PB1
     uint8_t   EntradaSubidaBajada :1; //PB2
     uint8_t   DivisorEntrada      :5; //PB3 a PB7
     uint8_t   CNT                 :2; //PB8 y PB9
     uint8_t   RESContador         :1; //PB11
  };                   //data_record is a structure type
//  StructOrdenFPGA TramaParaFPGA, *DIRTramaParaFPGA;

  union myunion {
    StructOrdenFPGA TramaParaFPGA;
    uint16_t tramaFPGA;
  };

  myunion trama;

//////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(SERIAL_SPEED);
//  while (Serial.available()>0)  Serial.read();

  uint16_t Valor16 = 44; 
  uint16_t &DIRValor16 = Valor16;
  Serial.println(DIRValor16);

  trama.TramaParaFPGA.SelectorEntrada = 0b10;
  trama.TramaParaFPGA.RESContador = 0b1;

  Serial.println(trama.tramaFPGA);  //Imprime el valor de los 16 bits

}
//////////////////////////////////////////
void loop() {

}

Muchísimas gracias por tu ayuda, sin ella no lo habría conseguido..

  uint16_t ValorTrama = trama.tramaFPGA;

Ahora ya tengo en ValorTrama los 16 bits de la struct
Muchas gracias de nuevo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.