___ tipo qstnhdr ___ 'bit' para la programación del microcontrolador AVR ______ qstntxt ___

He escrito un código para el microcontrolador 8051, donde utilicé el tipo de bit, algo como esto:

%pre%

Ahora estoy portando esto al controlador AVR ATmega16. Encontré que no hay soporte para
 tipo de bit en AVR.

El manual de usuario de

AVR-lib C dice:

  

Tipos de datos: char es de 8 bits, int es de 16 bits, largo es de 32 bits, largo   largo es de 64 bits, flotante y doble de 32 bits (este es el único   formato de punto flotante admitido), los punteros son 16 bits (función   los punteros son direcciones de palabras, para permitir direccionar hasta 128K programas   espacio de memoria). Hay una opción -mint8 (ver Opciones para la C   compilador avr-gcc) para hacer int 8 bits, pero eso no es compatible con   avr-libc y viola los estándares C (int debe ser de al menos 16 bits). Eso   puede ser eliminado en una versión futura.

Entonces, ¿qué debo hacer ahora?

    
______ answer80616 ___

Puedes usar una estructura como esta:

%pre%

Y para acceder a un bit a la vez solo tienes que

%pre%     
______ answer80632 ___

Como PeterJ ya mencionó en su comentario, sugeriría usar %code% .

Es necesario incluir la biblioteca stdbool.

%pre%

Como ya se señaló, en AVRGCC, %code% es de 8 bits y solo una abstracción de %code% . Si no puedes vivir con eso y necesitas guardar cada bit o tener toneladas de banderas globales de "sí / no" (lo que podría indicar una mala práctica de codificación), puedes considerar lo que Naeriel publicó en su respuesta.

Sin embargo, el uso de bool y la denominación de variable adecuada (usando el prefijo "es") produce un código mucho más limpio. Por ejemplo usar

%pre%

en lugar de "done_flag". De esa manera es más obvio para alguien que no conoce el código lo que exactamente indica el estado.

    
______ answer80615 ___

Utilice unsigned char en su lugar. Sin embargo, esto usará un byte completo en lugar de un poco.

    
______ answer151021 ___

Puedes usar algo como esto:

%code%

Ejemplo de uso:

%code%

establece PB4 como pin de salida.

Fuente: enlace

    
___

7

He escrito un código para el microcontrolador 8051, donde utilicé el tipo de bit, algo como esto:

static bit done_flag = 0;    /* bit variable */

bit testfunc (               /* bit function */
  bit flag1,                 /* bit arguments */
  bit flag2)
{
.
.
.
return (0);                  /* bit return value */
}

Ahora estoy portando esto al controlador AVR ATmega16. Encontré que no hay soporte para
 tipo de bit en AVR.

El manual de usuario de

AVR-lib C dice:

  

Tipos de datos: char es de 8 bits, int es de 16 bits, largo es de 32 bits, largo   largo es de 64 bits, flotante y doble de 32 bits (este es el único   formato de punto flotante admitido), los punteros son 16 bits (función   los punteros son direcciones de palabras, para permitir direccionar hasta 128K programas   espacio de memoria). Hay una opción -mint8 (ver Opciones para la C   compilador avr-gcc) para hacer int 8 bits, pero eso no es compatible con   avr-libc y viola los estándares C (int debe ser de al menos 16 bits). Eso   puede ser eliminado en una versión futura.

Entonces, ¿qué debo hacer ahora?

    
pregunta gpuguy

4 respuestas

4

Puedes usar una estructura como esta:

typedef struct {
    uint8_t bit0:1;
    uint8_t bit1:1;
    uint8_t bit2:1;
    uint8_t bit3:1;
    uint8_t bit4:1;
    uint8_t bit5:1;
    uint8_t bit6:1;
    uint8_t bit7:1;
} BitField;

typedef union {
    BitField asBits;
    uint8_t asByte;
} BitByte;

BitByte mBitField; 

Y para acceder a un bit a la vez solo tienes que

mBitField.asBits.bit3 = 1
    
respondido por el Naeriel
3

Como PeterJ ya mencionó en su comentario, sugeriría usar bool .

Es necesario incluir la biblioteca stdbool.

#include <stdbool.h>

Como ya se señaló, en AVRGCC, bool es de 8 bits y solo una abstracción de uint8_t . Si no puedes vivir con eso y necesitas guardar cada bit o tener toneladas de banderas globales de "sí / no" (lo que podría indicar una mala práctica de codificación), puedes considerar lo que Naeriel publicó en su respuesta.

Sin embargo, el uso de bool y la denominación de variable adecuada (usando el prefijo "es") produce un código mucho más limpio. Por ejemplo usar

bool IsOperationCompleted;

en lugar de "done_flag". De esa manera es más obvio para alguien que no conoce el código lo que exactamente indica el estado.

    
respondido por el Rev1.0
0

Utilice unsigned char en su lugar. Sin embargo, esto usará un byte completo en lugar de un poco.

    
respondido por el miceuz
0

Puedes usar algo como esto:

#define bit_get(p,m) ((p)&(m)) #define bit_set(p,m) ((p)|=(m)) #define bit_clear(p,m) ((p)&=~(m)) #define BIT(x) (0x01<<(x))

Ejemplo de uso:

bit_set(DDRB,BIT(4))

establece PB4 como pin de salida.

Fuente: enlace

    
respondido por el Adithya

Lea otras preguntas en las etiquetas