MPLABX XC8 Union/Struct?

Hola. Estoy recién yendo un poco mas a fondo con XC8 y un PIC16F628A .
Tengo el siguiente problema, ya tengo los pines de salida asignados a mitad del puerto A y la otra del B.
Lo que quiero es utilizar un solo byte para el estado de las salidas.
Pensé aplicar un método similar al que aplica las librerías de microchip en la definición de los registros del micro, porque quiero enviar por serie mas adelante el estado de las salidas.
C:
unsigned char QOUT @0x021;    //  Registro QOUT "que e creado"

typedef union {

    struct {                                     // Bit a Bit del registro QOUT

        unsigned Q1                    :1;

        unsigned Q2                    :1;

        unsigned Q3                    :1;

        unsigned Q4                    :1;

        unsigned Q5                    :1;

        unsigned Q6                    :1;

        unsigned Q7                    :1;

        unsigned Q8                    :1;

    };

}  QOUTbits_t;

QOUTbits_t QOUTbits @0x021;
Este método asigna los estados a las salidas que corresponde.
C:
void PrintQout(void) {                   // Metodo para aplicar a las salidas correspondientes

    PORTAbits.RA0 = QOUTbits.Q1;

    PORTAbits.RA1 = QOUTbits.Q2;

    PORTAbits.RA6 = QOUTbits.Q3;

    PORTAbits.RA7 = QOUTbits.Q4;

    PORTBbits.RB4 = QOUTbits.Q5;

    PORTBbits.RB5 = QOUTbits.Q6;

    PORTBbits.RB6 = QOUTbits.Q7;             

    PORTBbits.RB7 = QOUTbits.Q8;

}


void SecOne(void) {                    // Metodo para Prueba

    __delay_ms(100);

    Qout = 1;

    PrintQout();

    __delay_ms(100);

    Qout = 0;

    PrintQout();

}
El resto del código está funcionando.
Tengo un método SecTwo() que funciona correctamente.
Usé SecOne() para aplicar estos cambios y no lo puedo hacer funcionar.
Mis dudas son:
¿No puedo usar el registro @0x021?
¿Hace falta asignar un registro, si no, cómo relaciono el QOUT con QOUTbits?
 
Última edición por un moderador:
En teoría, sí, sí que se puede usar 0x021 pero... ¿estamos seguros de que esa posición no esté siendo utilizada por otra variable?

Deberías consultar el archivo .map del resultado de la compilación para ver dónde ha colocado el compilador cada variable.
 
En teoría, sí, sí que se puede usar 0x021 pero... ¿estamos seguros de que esa posición no esté siendo utilizada por otra variable?

Deberías consultar el archivo .map del resultado de la compilación para ver dónde ha colocado el compilador cada variable.

En el .map es bien asignado, por las dudas lo cambie a lo posicion siguiente 0x022. No se vuelve a repetir en ninguna otra funcion.
Ahora quedo de esta forma: Pero no funciona como quiero todavia. si le asigno bit a bit cada QOUTbits.Qx = 1 o 0 funciona pero no si le asigno a QOUT = 1 o 0. No se que es lo que falla no me doy cuenta.

C:
extern volatile unsigned char QOUT @0x022;
typedef union {
    struct {
        unsigned Q1                    :1;
        unsigned Q2                    :1;
        unsigned Q3                    :1;
        unsigned Q4                    :1;
        unsigned Q5                    :1;
        unsigned Q6                    :1;
        unsigned Q7                    :1;
        unsigned Q8                    :1;
    };
}  QOUTbits_t;
extern volatile QOUTbits_t QOUTbits @0x022;

void PrintQout(void){
    PORTAbits.RA0 = QOUTbits.Q1;
    PORTAbits.RA1 = QOUTbits.Q2;
    PORTAbits.RA6 = QOUTbits.Q3;
    PORTAbits.RA7 = QOUTbits.Q4;
    PORTBbits.RB4 = QOUTbits.Q5;
    PORTBbits.RB5 = QOUTbits.Q6;
    PORTBbits.RB6 = QOUTbits.Q7;
    PORTBbits.RB7 = QOUTbits.Q8;
}

void SecOne(void) {                 // Metodo para Prueba
    __delay_ms(100);
    QOUT = 1;                            // No funciona y es lo que quiero
    QOUTbits.Q6 = 1;               // Si funciona activando uno por uno.
    PrintQout();
    __delay_ms(100);
    QOUT = 0;                            // No funciona
    QOUTbits.Q6 = 0;               // Si funciona
    PrintQout();
}
 
A ver si explicas que significa "no funciona"...por que hay pocas ganas de adivinar...

En al rutina TestOne comento las lineas QOUT = 1; y QOUT = 0; y dejo solo las lineas QOUTbits.Q6 = 1; y QOUTbits.Q6 = 0; compilo y cargo el micro, a la salida veo que el led parpadea.
Cuando cambio descomento las lineas QOUT y comento las QOUTbits.Q6 el led no parpadea mas.
Ahora mientras redactaba me di cuenta de que un typo char son 2^8=256 combinaciones si a QOUT lo cargo con 255 puso todas las salidas en alto. (Esta funcionando) El error era mio

Gracias por responder con inmediatez.
 
Atrás
Arriba