Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как 4 байта в unsigned long ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Who_are_you?
Есть ли в WinAVR готовые функции?
Нужно 4 байта всунуть в long и отобразить на LCD.
Готовых решений в Инете не нашел.

Код
// ...
void LCD_WriteText (char font, char * text)   // функция отображения текста
// ...
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  //
unsigned long freeMemSD;
char buffe[11];

RxBuf[8]  =1;     // Highest
RxBuf[9]  =2;     // Higher
RxBuf[10] =3;    // Hi
RxBuf[11] =4;    // Lo

// freeMemSD <-- (Highest, Higher, Hi, Lo );
// buffe <-- freeMemSD;
LCD_WriteText (16,buffe);  // выводит символы на экран
// может можно как-то обойтись без long ?

Realking
Цитата(Who_are_you? @ Jun 21 2018, 14:11) *
Есть ли в WinAVR готовые функции?
Нужно 4 байта всунуть в long и отобразить на LCD.
Готовых решений в Инете не нашел.

Код
// ...
void LCD_WriteText (char font, char * text)   // функция отображения текста
// ...
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  //
unsigned long freeMemSD;
char buffe[11];

RxBuf[8]  =1;     // Highest
RxBuf[9]  =2;     // Higher
RxBuf[10] =3;    // Hi
RxBuf[11] =4;    // Lo

// freeMemSD <-- (Highest, Higher, Hi, Lo );
// buffe <-- freeMemSD;
LCD_WriteText (16,buffe);  // выводит символы на экран
// может можно как-то обойтись без long ?


5ый раз перечитываю
нифига не понимаю че ТС надо )))

может он имел ввиду long в массив char преобразовать?
Who_are_you?
Написано:
Нужно 4 байта всунуть в long и отобразить на LCD.
Код
unsigned int xx,rr;

RxBuf[11] = 0x00;
RxBuf[12] = 0x01;
RxBuf[13] = 0x00;
RxBuf[14] = 0x02;
rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12]; // 0x0001
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // 0x0002
freeMemSD = (rr<<16) | xx; // почему не '65538' (0x00010002), а '2'
Who_are_you?
Так работает:
Код
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  //
unsigned long freeMemSD;
char buffe[11];
unsigned int xx,rr;

RxBuf[11] = 0x00;    // Highest
RxBuf[12] = 0x01;    // Higher
RxBuf[13] = 0x00;    // Hi
RxBuf[14] = 0x02;    // Lo
rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12]; // 0x0001
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // 0x0002
freeMemSD = rr;
freeMemSD = (freeMemSD <<16) | xx;    //  '65538' (0x00010002)
ultoa(freeMemSD, buffe, 10);

LCD_WriteText (16,buffe);  // выводит символы на экран

Но как-то не то и для AVR длинно.
Может можно без long и короче?
piroman
union {
unsigned long freeMemSD;
struct {
unsigned char RxBuf3; // Lo
unsigned char RxBuf2; // Hi
unsigned char RxBuf1; // Higher
unsigned char RxBuf0; // Highest
};
};

А если так?
HardEgor
union {
unsigned long isLong;
unsigned char isCharArr[4]
};
Who_are_you?
Спасибо, работает.
Код
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  //

union {unsigned long isLong;
          unsigned char isCharArr[4];
          } freeMemSD;

char buffe[11];

         // RxBuf[11] ... RxBuf[14] - получаем заранее со всеми 255 байтами
RxBuf[11] = 0x01;    // Highest
RxBuf[12] = 0x01;    // Higher
RxBuf[13] = 0x01;    // Hi
RxBuf[14] = 0x01;    // Lo

freeMemSD.isCharArr[3] = RxBuf[11];
freeMemSD.isCharArr[2] = RxBuf[12];
freeMemSD.isCharArr[1] = RxBuf[13];
freeMemSD.isCharArr[0] = RxBuf[14];
ultoa(freeMemSD.isLong, buffe, 10);

LCD_WriteText (16,buffe);  // выводит символы на экран

[/quote]

Получается
Код
freeMemSD.isCharArr[3] = RxBuf[11];
freeMemSD.isCharArr[2] = RxBuf[12];
freeMemSD.isCharArr[1] = RxBuf[13];
freeMemSD.isCharArr[0] = RxBuf[14];
ultoa(freeMemSD.isLong, buffe, 10);

Вместо
Код
rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12];   // Hi
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // Lo
freeMemSD = rr; //
freeMemSD = (freeMemSD <<16)| xx; //
ultoa (freeMemSD,buffe,10);               // long в char

А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ?
HardEgor
Цитата(Who_are_you? @ Jun 22 2018, 14:47) *
А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ?

Я так и не понял что вы хотите сделать. Много слов и кода, мало смысла.
Напиши кратко что в кого надо превратить.
dimka76
Код
unsigned long freeMemSD;
char buffe[11];

// туда
freeMemSD = *((unsigned long*)&RxBuf[8]);

// Обратно
*((unsigned long*)&RxBuf[8]) = freeMemSD;
Сергей Борщ
QUOTE (dimka76 @ Jun 23 2018, 23:34) *
CODE
// туда
freeMemSD = *((unsigned long*)&RxBuf[8]);

// Обратно
*((unsigned long*)&RxBuf[8]) = freeMemSD;
годится для AVR, не годится для процессоров, не поддерживающих невыровненный доступ. Для исключения сюрпризов при использовании старого отлаженного кода на новых ядрах, лучше уж сразу приучить cебя использовать хотя бы memcpy().
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.