2015-05-19 3 views
0

Я хочу сделать простой конвертер. Это просто теоретически, но я не могу понять, как его достичь. Итак, вот что я хочу сделать: Сначала я прочитал мое значение GPIO с микроконтроллером, с количеством 8. Теперь у меня есть 8 байт значения GPIO от GPIO 1 до GPIO 8.Значение GPIO для байта

Но, как я мог преобразовать их в байты?

НЕТ: 11111000 (8 байт - ранее), становится 11111000/0xFA (1 байт - после)? Я пытаюсь использовать переключение передач, что-то вроде этого:

a = GPIO1, a = a << 7 | 
b = GPIO2, b = b << 6 | 
. 
. 
h = GPIO8 

uint8_t i = a + b + c + d + e + f + g + h 

К сожалению, это не работает. Я сделал это неправильно? Любое предложение будет оценено по достоинству.

+0

Уточнитните 'GPIO'. Это немного на периферийном порту или 8-битный объект. Если у вас есть 8 GPIO с шириной 8 бит для каждого из них, вы не можете свернуть его в один байт без потери данных. – harper

+1

Лучше всего разместить код, который вы используете для чтения входов, чем попытаться описать их. –

ответ

0

Хорошим способом достижения этой цели было бы использовать комбинацию struct и union. С помощью union вы можете получить доступ к одной и той же памяти двумя разными способами. Например:

union gpio_type { 
    uint8_t data; 
    struct raw { 
     unsigned int b0 :1; 
     unsigned int b1 :1; 
     unsigned int b2 :1; 
     unsigned int b3 :1; 
     unsigned int b4 :1; 
     unsigned int b5 :1; 
     unsigned int b6 :1; 
     unsigned int b7 :1; 
    }; 
}; 

С unsigned int b0 :1; внутри структуры, можно определить b0 быть типа unsigned int, но использовать только 1 бит. Если вы сделаете это для всех 8 бит GPIO b0 ... b7, у вас будет общий размер 8 бит, размер которого равен uint8_t. Теперь data и raw будут использовать одну и ту же память, но вы можете получить доступ к памяти через любую переменную. С этим вы можете записать необработанные значения GPIO в биты структуры и позже получить доступ к байту данных.

Например, давайте создадим создать экземпляр этого союза и доступа либо данных uint8_t, или один бит:

union gpio_type my_gpio_reg; 
my_gpio_reg.data = 0xA0;  % Set whole reg to 0xA0 
my_gpio_reg.raw.b0 = 1;  % Set the last bit to 1 ==> 0xA1 
Смежные вопросы