Autor Tema: Problema con estucturas y uniones  (Leído 2071 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gaby_chispas

  • PIC10
  • *
  • Mensajes: 4
Problema con estucturas y uniones
« en: 12 de Marzo de 2005, 05:33:00 »
Buenas al foro, tengo un problema con estructuras y uniones, estoy utilizando un PIC 18F452 y la versión CCS 3.207.

En mi primer programa en C utilizo flags para el flujo de programa, estos flags o banderas debo de guardarlos en EEPROM por si se reinicia el sistema por watch dog o por corte de tensión y viceversa, poder recuperar estas banderas de tipo 1bits desde la eeprom a la memoria.

He leido el hilo "MANEJO DE ESTRUCTURAS CON C30", pero no me funciona.

Os adjunto la estructura que he realizado:



typedef union BANDERAS{

int reg;           //el registro es de 8bits para poder guardarlo en EEPROM

    struct {

         int1 flag_1 :1;    //compuesta por 8 bits.
         int1 flag_2 :1;
         int1 flag_3 :1;
         int1 flag_4 :1;
         int1 flag_5 :1;
         int1 flag_6 :1;
         int1 flag_7 :1;
         int1 flag_8 :1;
};
}  estructura_1;

void main(){

estructura_1 registro;    //renombramos con registro la estructura
int variable = 15;           //creamos una variable con el valor de 15
registro.neg = variable;   //Cargamos toda la estructura el valor de 15
registro.flag_1 = 1;         //Le asignamos 1 a un bit de la estructura
}

La úlitma instrucción, "registro.flag_1 = 1", es donde tengo el problema.
El compilador aparece "ELEMENT IS NOT A MEMBER"
Osea la asignación de un bit no me la realiza, pero la asignación de todo el byte si.

Gracias





Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Problema con estucturas y uniones
« Respuesta #1 en: 12 de Marzo de 2005, 06:51:00 »
Prueba a ponerle un nombre a la estructura formada por los flags y usarlo a la hora de asignar:

struct {
int1 flag_1 :1; //compuesta por 8 bits.
int1 flag_2 :1;
int1 flag_3 :1;
int1 flag_4 :1;
int1 flag_5 :1;
int1 flag_6 :1;
int1 flag_7 :1;
int1 flag_8 :1;
}flags;

registro.flags.flag_1 = 1;

Desconectado gaby_chispas

  • PIC10
  • *
  • Mensajes: 4
RE: Problema con estucturas y uniones
« Respuesta #2 en: 12 de Marzo de 2005, 09:34:00 »
Ante todo, gracias por interesarte, pero no funciona.

Creo que la declaración es correcta.

Estoy empeñado en grabar los flags tipo bit en grupos de 8 bits (1 byte) para memorizarlos en la eeprom.

¿Existe alguna otra forma que no sea con estructuras?

Saludos

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Problema con estucturas y uniones
« Respuesta #3 en: 12 de Marzo de 2005, 10:36:00 »
Hola, he copiado tu codigo y compilado con el visualC ( el compilador que tenia a mano) y compila perfectamente tu codigo.

La unica diferencia con tu codigo, es que he puesto char, en lugar de int1, que no se lo que es (supongo que sera como char en ese compilador)

Como no conozco el C30, no te puedo ayudar, pero el codigo es correcto.

Un saludo.

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Problema con estucturas y uniones
« Respuesta #4 en: 12 de Marzo de 2005, 11:04:00 »
Como no he podido dar una solucion, he seguido pensando un poco aer que mas podiamos hacer. Desde luego, si solucionas el tema de los campos de bits, es la mejor opcion, si no aer que te parece algo asi.

#include <stdio.h>

#define Setflag_1 flag|=0x01
#define Clrflag_1 flag&=(~0x01)
#define Setflag_2 flag|=0x02
#define Clrflag_2 flag&=(~0x20)
#define Setflag_3 flag|=0x04
#define Clrflag_3 flag&=(~0x04)
#define Setflag_4 flag|=0x08
#define Clrflag_4 flag&=(~0x08)
#define Setflag_5 flag|=0x10
#define Clrflag_5 flag&=(~0x10)
#define Setflag_6 flag|=0x20
#define Clrflag_6 flag&=(~0x20)
#define Setflag_7 flag|=0x40
#define Clrflag_7 flag&=(~0x40)
#define Setflag_8 flag|=0x80
#define Clrflag_8 flag&=(~0x80)

typedef union BANDERAS{

int reg; //el registro es de 8bits para poder guardarlo en EEPROM
char flag;
} estructura_1;

void main(){

estructura_1 registro; //renombramos con registro la estructura
int variable = 15; //creamos una variable con el valor de 15

registro.reg = variable; //Cargamos toda la estructura el valor de 15
registro.Setflag_4; //Le asignamos 1 a un bit de la estructura

}

Con macros, mediante una mascara, tocas el bit que te hace falta.

Un saludo.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Problema con estucturas y uniones
« Respuesta #5 en: 12 de Marzo de 2005, 11:34:00 »
lo q dice modulay es correto,
no se compliquen con mas cosas
ponele un nombre a la estructura interior y asignalo segun lo indicado,
eso es C estandard..

Desconectado gauchosuizo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 457
RE: Problema con estucturas y uniones
« Respuesta #6 en: 14 de Marzo de 2005, 00:51:00 »
hola

porque no hacen algo mas sencillo y que funciona con todos los compilers:
Codigo:

static int8 intFlags;
#bit NewData = intFlags.0
#bit NewCalRef = intFlags.1
#bit NewCalMessZero = intFlags.2
#bit NewCalMessFull = intFlags.3
#bit NewMeas = intFlags.4
#bit NewADCMeas = intFlags.5
#bit DataCalOK = intFlags.6



Ejemplo:
Codigo:

NewData = true;
NewCalRef = false;



Para inicialisar las banderas:
Codigo:

intFlags = false;


De esta manera se ponen todos los bits a "0".
Aloha
Saludos desde Suiza, Pablo.

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Problema con estucturas y uniones
« Respuesta #7 en: 19 de Marzo de 2005, 05:50:00 »
la forma mas elegante es la que te apunta modulay, habitualmente uso estructuras anidadas sin mayor problema..
claro que otras opciones son validas, como la de gaucho.

algo asi

typedef struct
{
int1 flag_1 :1; //compuesta por 8 bits.
int1 flag_2 :1;
int1 flag_3 :1;
int1 flag_4 :1;
int1 flag_5 :1;
int1 flag_6 :1;
int1 flag_7 :1;
int1 flag_8 :1;
}_banderas;

struct
{
int reg; //el registro es de 8bits para poder guardarlo en EEPROM
_banderas banderas;
} registro;

void main(){

//estructura_1 registro; //renombramos con registro la estructura
int variable = 15; //creamos una variable con el valor de 15
registro.reg = variable; //Cargamos toda la estructura el valor de 15
registro.banderas.flag_1 = 1; //Le asignamos 1 a un bit de la estructura
}


 

anything