реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> codevision and i2c, туплю
dspy
сообщение May 29 2007, 05:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 5-03-07
Пользователь №: 25 880



доброе время суток!
вот уже второй день роюсь в нете и мануалах и туплю
вот вопрос: есть число размером 2 байта, его нужно передать по i2c, как разбить это число
на старший и младший байт help.gif
заранее благодарен
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 29 2007, 06:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



"доброе время суток!
вот уже второй день роюсь в нете и мануалах и туплю
вот вопрос: есть число размером 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
Go to the top of the page
 
+Quote Post
dspy
сообщение May 29 2007, 06:31
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 5-03-07
Пользователь №: 25 880



благодарю, щас попробую
Go to the top of the page
 
+Quote Post
CSB
сообщение May 29 2007, 20:58
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Еще в 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;
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение May 30 2007, 04:02
Сообщение #5





Guests






Можно пойти двумя путями, в зависимости от того что нужно.

Первый, использование препроцессора:
Код
#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;
Go to the top of the page
 
+Quote Post
dspy
сообщение May 30 2007, 04:11
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 5-03-07
Пользователь №: 25 880



спасибо вам за ответы!

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

Первый, использование препроцессора:
Код
#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))
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение May 30 2007, 04:35
Сообщение #7





Guests






Все нормально, опыт приходи со временем.

Цитата
т.к. я начинающий в этом деле, пожалуйста скинте в каком разделе хелпа находится описания этого:
я не знаю, какой средой разработки ты пользуешся. Но если тебя интересует дока по препроцессору языка С, то вот ссылка 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>


Сообщение отредактировал Serg79 - May 30 2007, 04:36
Go to the top of the page
 
+Quote Post
dspy
сообщение May 30 2007, 13:29
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 5-03-07
Пользователь №: 25 880



Serg79 спасибо теперь наконецто все понял smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016