AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.04.2016, 00:40
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,087
Сказал спасибо: 2,565
Сказали Спасибо 11,899 раз(а) в 5,972 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Сообщение от begun
|
одинаковые строки
|
они не одинаковые.
Сообщение от Paul74s
|
dec1-'0';
|
Сообщение от Paul74s
|
dec2-'0';
|
Выходная переменная - одна hex, а входные - decx
В каждой строке идет преобразование байта из ASCII в BCD-цифру и суммирование ее с содержимым переменной. Потом (если цифра не последняя), умножение переменной на 10.
В Вашем случае будет цикл с одной входной переменной - результатом чтения из УАРТа.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 25.04.2016 в 09:54.
|
|
|
|
25.04.2016, 01:14
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 875
Сказал спасибо: 234
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
спасибо akegor
будем разбиратся
|
|
|
|
25.04.2016, 09:52
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Сообщение от begun
|
в ПРОТЕУС -е в регистр записывается в виде
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'9'
|
Добрый день!
Судя по всему Вы как раз строку и отправляете.
Да действительно можно воспользоваться atoi(). Но я ею стараюсь меньше пользоваться, жрет много памяти. Но имейте в виду строка 1234567899 преобразуется к типу uint32_t, а вот 9987654321 уже не получится, будет переполнение, в CV тип uint64_t не поддерживается.
Ниже текст функции:
//Перевод из строки символов в двоичное число ф-ция возвращает результат типа unsigned lond int
// lgth - Требуемая длинна маcсива ка правило 10 но не длиннее и не 0 !!!
// *b - указатель на маcсив где должна быть строка
uint32_t bcd_bin (uint8_t lgth, uint8_t *b)
{
uint8_t i; //
uint32_t result=0; //
b=b+(lgth-1); // переместим указатель на конец масcива
result = result+((*b--)&0x0f) ; // прибавим старший разряд
for (i = lgth-1; i!=0; i--)
{
result = result*10; //
result = result+((*b--)&0x0f) ; // прибавить очередное число
}
return (result);
}
|
|
|
|
25.04.2016, 10:49
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 875
Сказал спасибо: 234
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
AlexPi большое за отзыв но я немного растерялся .
разрешите попытатся яснне выразить задачу а не в общих чертах.
с одного микроконтроллера avr через uart посылается информация на другой в виде:
(к примеру 3-х значное десятичное -999)
putchar(0x39);
putchar(0x39);
putchar(0x39);
на"avr data memory" другого (приемного) коттроллера в протеусе получаем следующую запись по ячейкам
39 39 39
HEX эквивалент числа по калькулятору XP равно 3E7.
------------------------------------------------------------------------
если передать из первого микроконтроллера число 3E7 в виде:
putchar(0x33);
putchar(0x45);
putchar(0x37)
то в дата мемори получаем:
39 45 37
--------------------------------
вот нужно преобразовать
39 39 39 в 39 45 37 на приемной стороне.
может на этом примере легче будет мне понятно если проясните?
|
|
|
|
25.04.2016, 10:53
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Всем, кому не нравится данный метод, можно посоветовать написать свой велосипед, который будет выглядеть так:
uint64_t Value;
uint8_t text[20]; // Обязательно, нуль-терминированая строка
uint8_t i = 0;
Value = 0;
while (text[i]) {
Value = Value * 10 + (text[i] - '0');
i++;
};
Как бы... Всё. Долго. Без оптимизации. Надёжно как чугунный утюг.
После этого в Value будет точное значение. Всевозможные исключения типа отрицательных чисел и точки не обрабатываются, а приводят к очень весёлым последствиям.
|
|
|
|
25.04.2016, 11:20
|
|
Прописка
Регистрация: 20.08.2008
Сообщений: 260
Сказал спасибо: 305
Сказали Спасибо 76 раз(а) в 42 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Принятое число помещаете в массив (младшие цифры - в младшие элементы массива), например char M[10], число в формате HEX формируете в int X и ещё одна локальная переменная int a.
I=0;
a=1;
for (n=0; n‹10; n++)
{
I=I+(M[n]-0x30)*a;
a=a*10;
}
|
|
|
|
25.04.2016, 11:37
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,087
Сказал спасибо: 2,565
Сказали Спасибо 11,899 раз(а) в 5,972 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
shyub, Вы бы прошли по шагам, просчитали свой алгоритм, хотя бы, для двух - трех разрядов.
Зачем так завернули и навернули?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
25.04.2016, 11:50
|
|
Прописка
Регистрация: 20.08.2008
Сообщений: 260
Сказал спасибо: 305
Сказали Спасибо 76 раз(а) в 42 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Допустим число 1234, следовательно M[0]=0x34, M[1]=0x33, M[2]=0x32, M[3]=0x31.
После 1-го цикла: I=0x00 00 00 04;
После 2-го цикла: I=0x00 00 00 22;
После 3-го цикла: I=0x00 00 00 EA;
После 4-го цикла: I=0x00 00 04 D2;
Если M[4]-M[9]=0x30, т.е. нули (это я упустил) или количество циклов ограничивать кол-вом принятых знаков, то итоговое число не изменитс: 0x00 00 04 D2 = 1234.
|
|
|
|
25.04.2016, 12:00
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,087
Сказал спасибо: 2,565
Сказали Спасибо 11,899 раз(а) в 5,972 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Может, что-то и недосмотрел...
Гораздо проще результат умножать на десять и прибавлять к нему очередную цифру.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
25.04.2016, 12:27
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: нужна программа перевода DEC. в HEX в CVAVR
Сообщение от akegor
|
Может, что-то и недосмотрел...
Гораздо проще результат умножать на десять и прибавлять к нему очередную цифру.
|
Собственно, то же, что я и написал. Умножаем, прибавляем.
ТС: Между прочим, именно так число и будет выглядеть в памяти. Если нужно будет его куда-то ЕЩЁ передать в HEX-формате, то потом проходитесь по байтам и передаёте их куда-то ещё.
Вот таким видом:
Код:
|
// v - переменная байт, в ней хранится тот байт, который сейчас нужно перевести в HEX-строку.
char rs[3];
// В начале - верхний ниббл
if ((v ›› 4) › 9) {
rs[0] = ('7' + (s ›› 4));
} else {
rs[0] = ('0' + (s ›› 4));
};
// Затем - нижний
if ((v & 0x0F) › 9) {
rs[1] = ('7' + (s & 0x0F));
} else {
rs[1] = ('0' + (s & 0x0F));
};
rs[2] = 0; // Нуль-терминированая строка. |
У меня лично вот таким образом преобразовывает побайтно любые данные и выводит их в консоль.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:46.
|
|