Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: codevision and i2c
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dspy
доброе время суток!
вот уже второй день роюсь в нете и мануалах и туплю
вот вопрос: есть число размером 2 байта, его нужно передать по i2c, как разбить это число
на старший и младший байт help.gif
заранее благодарен
mempfis_
"доброе время суток!
вот уже второй день роюсь в нете и мануалах и туплю
вот вопрос: есть число размером 2 байта, его нужно передать по i2c, как разбить это число
на старший и младший байт help.gif
заранее благодарен"

попробуй выполнить преобразование типов данных:

//обозначаем двухбайтную переменную для передачи
volatile int var_for_transmission;

//разбивка на младший/старший байты
//send_i2c_data( char Data ) - условная функция пересылки однобайтных данных по и2ц smile.gif

//преобразование к типу char позволит взять младший байт от двухбайтного числа
send_i2c_data( (char) var_for_transmission );

//предварительный сдвиг двухбайтного числа вправо на 8 и
//преобразование к типу char позволит взять старший байт двухбайтного числа
send_i2c_data( (char) (var_for_transmission>>8) );

кстати, параметер функции можно сделать типа int (т.е. send_i2c_data( int Data ) )
и эти преобразования производить внутри функции smile.gif

преобразование типов очень классная штука преобразует любой тип данных в любой
volatile char VAR
(int) VAR //преобразует в int
(long int) VAR //преобразует в long int и т.д.

посмотри в help CVAVR в разделе Type Conversions
dspy
благодарю, щас попробую
CSB
Еще в CV можно было объявить 8-разрядный указатель, присвоить ему адрес 16-разрядной переменной и обращаться к ней как к массиву, но это только для данного компилятора. Да и в текущей версии может не работать, но проверить стоит.

Код
    char ptr;
    int foo;

    ptr = &foo;
    ptr[0] = 0xCD;
    ptr[1] = 0xAB;

    //foo == 0xABCD;


Или можно сделать через объединение.
Код
    union u_tag
    {
        int foo;
        char bar[2];
    } u;

    u.bar[0] = 0x34;
    u.bar[1] = 0x12;

    //u.foo == 0x1234;
Serg79
Можно пойти двумя путями, в зависимости от того что нужно.

Первый, использование препроцессора:
Код
#define LOBYTE(w)         ((uint8_t)((uint16_t)(w)))
#define HIBYTE(w)         ((uint8_t)((uint16_t)(w) >> 8))
#define MAKEWORD(a,b)     ((uint16_t)(((uint8_t)(a)) | ((uint16_t)((uint8_t)(b))) << 8))

Второй, использование объединения:
Код
union
{
    uint16_t val_16;
    uint8_t val_8[2];
} val;
dspy
спасибо вам за ответы!

т.к. я начинающий в этом деле, пожалуйста скинте в каком разделе хелпа находится описания этого:

Первый, использование препроцессора:
Код
#define LOBYTE(w)         ((uint8_t)((uint16_t)(w)))
#define HIBYTE(w)         ((uint8_t)((uint16_t)(w) >> 8))
#define MAKEWORD(a,b)     ((uint16_t)(((uint8_t)(a)) | ((uint16_t)((uint8_t)(b))) << 8))
Serg79
Все нормально, опыт приходи со временем.

Цитата
т.к. я начинающий в этом деле, пожалуйста скинте в каком разделе хелпа находится описания этого:
я не знаю, какой средой разработки ты пользуешся. Но если тебя интересует дока по препроцессору языка С, то вот ссылка http://gcc.gnu.org/onlinedocs/cpp.pdf .

Если тебя смущают типы uint8_t, uint16_t, то вот их определения:
Код
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;

Но если твой компилятор соответствует стандарту ANSI/ISO 1999 то все эти определения содержаться в файле:
Код
#include <stdint.h>
dspy
Serg79 спасибо теперь наконецто все понял smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.