Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.08.2010, 14:08
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Как сделать преобразование данных?
В МК по UART поступают данные в таком формате (пример)- 52 , 102, 61, 54, 51, 57, ….. они же в ANSII формате 4, f, a, 6, 3, 9, ….. Так вот из этого мне нужно получить значения 4f (79) a6(166) 39(57) . Как это можно быстро преобразовать? Это же после обработки данных нужно будет сделать в обратной последовательности.
P.S. На С для AVR
|
|
|
|
30.08.2010, 14:44
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,961
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
2 lvadia - прочтите вопрос топикстартера еще раз, pls
По теме. Такая передача от компа к МК нехороша тем, что нет синхронизации. Допустим, что в последовательности 4, f, a, 6, 3, 9 первый байт куда-то пропал (рассчитывать всегда надо на то, что - если гадость может случиться - она случится). Тогда вы получите 0xFA, 0x63 и ... а с последним вообще непонятно.
Я бы применил что-то типа функции
Код:
|
char tetrada(B:char)
{
if (B ‹=9) return(B-'0');
else return(B-'A'+10);
} |
Ну это упрощенно, без проверок и т.д. Ну и что-то типа
Код:
|
rez = tetrada(getchar())‹‹4 | terada(getchar()); |
Но с протоколом передачи надо что-то придумывать.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
Последний раз редактировалось nml; 30.08.2010 в 14:47.
|
|
|
|
30.08.2010, 14:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
Код:
|
uint8_t Hex2Bin(uint8_t nibble)
{
return ((nibble -'0') - (nibble ›= 'a')*('a'-('9'+1))) & 0x0F;
}
int main(void)
{
uint8_t result;
result = Hex2Bin('4')‹‹4 | Hex2Bin('f');
} |
Если компилятор не IAR, то будет достаточно быстро.
Код:
|
+0000002D: 3681 CPI R24,0x61 Compare with immediate
+0000002E: F010 BRCS PC+0x03 Branch if carry set
+0000002F: E297 LDI R25,0x27 Load immediate
+00000030: C001 RJMP PC+0x0002 Relative jump
+00000031: E090 LDI R25,0x00 Load immediate
+00000032: 1B89 SUB R24,R25 Subtract without carry
+00000033: 708F ANDI R24,0x0F Logical AND with immediate
+00000034: E090 LDI R25,0x00 Load immediate
+00000035: 9508 RET Subroutine return |
Это листинг Hex2Bin
Как обратно преобразовать надеюсь разберетесь самостоятельно.
|
|
|
|
30.08.2010, 14:59
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
Сейчас попробую.
|
|
|
|
30.08.2010, 15:06
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
Сообщение от kison
|
Если компилятор не IAR, то будет достаточно быстро.
|
Не понял,я думал что на IAR наоборот получается самый оптимальный код.
Я пишу СodeVision. Может на оборот, если компилятор IAR то получится достаточно быстро?
Последний раз редактировалось Zemlyanov; 30.08.2010 в 15:08.
|
|
|
|
30.08.2010, 15:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
Сообщение от Zemlyanov
|
я думал что есть готовые функции для данного преобразования.
|
Есть - scanf. Но Вы же хотите быстро. И не на 1,5кБ функцию. Или и такая сойдет?
|
|
|
|
30.08.2010, 15:18
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Re: Преобразование данных. Как сделать?
Сообщение от kison
|
Есть - scanf. Но Вы же хотите быстро. И не на 1,5кБ функцию. Или и такая сойдет?
|
Угу,хочу.На 1,5 кб не пойдет.
|
|
|
|
30.08.2010, 15:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как сделать преобразование данных?
Сообщение от Zemlyanov
|
Может на оборот, если компилятор IAR то получится достаточно быстро
|
Ну в моем варианте исходника IAR умножает Тут где то тема была, я там IAR сравнил с GCC по качеству кода. И момент с умножением меня ввел в ступор. Там умножение на 0 или на 1 возможно, причем умножается константа. GCC это оптимизировал в загрузку результата сразу, а IAR честно перемножил По остальным тестам типа работы с плавучими переменными IAR тоже выглядел бледно.
CV в той теме немного тоже потестирован.
Вот почитайте - https://kazus.ru/forums/showthread.php?t=13936
Хотя этот финт с умножением проверял видимо в другой ветке. Искать лень.
|
|
|
|
30.08.2010, 15:38
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,961
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Как сделать преобразование данных?
Сообщение от lvadia
|
в чём я был не прав nml ?
|
Код:
|
Используйте логическое И с 0F и сдвиг в сторону старших разрядов |
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
30.08.2010, 16:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как сделать преобразование данных?
Сообщение от lvadia
|
Почему?....это класика............
|
Потому что ASCII символ '4' и 0x04 не одно и то же.
И потому что 0x0A-0x04 != 'A'-'4'.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:11.
|
|