|
Преобразование кода АЦП, нужен совет |
|
|
|
Mar 24 2008, 13:10
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(novlev @ Mar 24 2008, 17:25)  Вопрос такой: есть код ацп, его надо преобразовать в десятичную форму(1й байт целая часть, 2й - дробная). Как проще всего это сделать. Пишу на асме, контроллер - ADuC841. Я так понимаю, Вы хотите потом этот код передать по СОМ-порту в гипертерминал в цифробуквенном виде в кодах ASCII? Или что?
--------------------
Я здесь и сейчас...
|
|
|
|
|
Mar 24 2008, 13:42
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(novlev @ Mar 24 2008, 19:19)  да, передать по интерфейсу 485, но не в кодеровке, а именно 2 байта, но представление инфы долждно быть как десятичное, те вычитал (например 0А8А) и отправил в первом байте 05, во втором - 12 (условно), и это типа 5,12 вольта.Сижу ломаю голову  мдя. делать такие преобразования на 8 разрядном ядре на ASM- гимор. Может сделать таблицу коэффициентов? Т.е. каждому возможному отсчету (их всего 4096) присвоить значения, полученные путем деления опорного напряжения на 4096, а потом умноженного на 12-разрядный отсчет. Эти расчеты сделать например в EXELL. Памяти в ADuC 845 для для хранения такой таблицы достаточно. Не элегантно конечно, но зато потом будет быстро работать.
Сообщение отредактировал Linker - Mar 24 2008, 13:44
--------------------
Я здесь и сейчас...
|
|
|
|
|
Mar 24 2008, 13:52
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(Linker @ Mar 24 2008, 17:42)  мдя. делать такие преобразования на 8 разрядном ядре на ASM- гимор. Может сделать таблицу коэффициентов? Т.е. каждому возможному отсчету (их всего 4096) присвоить значения, полученные путем деления опорного напряжения на 4096, а потом умноженного на 12-разрядный отсчет. Эти расчеты сделать например в EXELL. Памяти в ADuC 845 для для хранения такой таблицы достаточно. Не элегантно конечно, но зато потом будет быстро работать. Да я уже думал об этом, просто таких таблиц надо сгородить несколько для одного девайся, а их несколько разных, но спасибо за совет, теперь я уже уверен что так и сделаю. А есть пример реализации? т е механизм работы с таблицей, просто велосипед изобретать не хочется, особенно после написания арифметики с плав запятой, интузиазм на нуле
|
|
|
|
|
Mar 24 2008, 14:54
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Linker @ Mar 24 2008, 16:42)  мдя. делать такие преобразования на 8 разрядном ядре на ASM- гимор. ...геммороя здесь нет, книги читать надо. Вот этот фрагмент кода выполняет преобразование 12-разрядного числа в упакованное BCD-число из 2-х байт. В регистры R2 и R3 загружаете соответственно младшую и старшую часть искомого числа, на выходе в регистре R0 две младшие цифры числа, в R1 старшие цифры числа. Например R2 = FFh R3= 0Fh -> R0 = 95h R1 = 40h. Дальше все просто. Код mov R0,#0 mov R1,#0 mov R2,A mov R3,B mov R4,#0
loop: mov A,R0 add A,R0 da A mov R0,A mov A,R1 addc A,R1 da A mov R1,A
mov A,R2 rlc A mov R2,A
mov A,R3 rlc A mov R3,A
mov C,ACC.4
mov A,R0 addc A,#0 da A mov R0,A mov A,R1 addc A,#0 da A mov R1,A
inc R4 cjne R4,#12,loop
|
|
|
|
|
Mar 24 2008, 15:07
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(MrYuran @ Mar 24 2008, 19:02)  а почему на си нельзя? В том же Кейле, к примеру? Тогда никаких геморов ни с плавающей арифметикой, ни с преобразованием типов. И флеши намного меньше уйдёт, чем на таблицы Потому что после си потом один х что получается, а тут надо знать буквально по тактам что творится, род деятельности обязывает... Да не спасет тут никакое преобразование типов, просто геморный выходной формат данных, плюс ограничения по времени отклика на запрос...
|
|
|
|
|
Mar 24 2008, 15:50
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(tag @ Mar 24 2008, 20:54)  ...геммороя здесь нет, книги читать надо. Вот этот фрагмент кода выполняет преобразование 12-разрядного числа в упакованное BCD-число из 2-х байт. Тут гимор в том, нужно получить результат в вольтах, а не просто преобразвать в BCD упаковку. Ну и потом, приведенный фрагмент кода вы считаете эффективным? Цитата(novlev @ Mar 24 2008, 19:52)  Да я уже думал об этом, просто таких таблиц надо сгородить несколько для одного девайся, а их несколько разных, но спасибо за совет, теперь я уже уверен что так и сделаю. А есть пример реализации? т е механизм работы с таблицей А почему несколько таблиц? Что, опора будет меняться? Или коэфф. усиления? Примера к сожалению нет. А механизм работы с таблицей прост: адрес соответствующего коэффициента в вольтах соответствует полученному значению преобразования, который загружается в DPTR. Далее командой "MOVC A,@A+DPTR" извлекается младшая часть результата. Используя теневой DPTR(такой есть в ADuC - Dual Data Pointer) извлекаешь старшую часть. Либо без теневого DPTR просто меняешь соответсвующий разряд в текущем DPTR.
Сообщение отредактировал Linker - Mar 24 2008, 15:33
--------------------
Я здесь и сейчас...
|
|
|
|
|
Mar 25 2008, 06:14
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(Linker @ Mar 24 2008, 19:50)  Тут гимор в том, нужно получить результат в вольтах, а не просто преобразвать в BCD упаковку. Ну и потом, приведенный фрагмент кода вы считаете эффективным? А почему несколько таблиц? Что, опора будет меняться? Или коэфф. усиления? Примера к сожалению нет. А механизм работы с таблицей прост: адрес соответствующего коэффициента в вольтах соответствует полученному значению преобразования, который загружается в DPTR. Далее командой "MOVC A,@A+DPTR" извлекается младшая часть результата. Используя теневой DPTR(такой есть в ADuC - Dual Data Pointer) извлекаешь старшую часть. Либо без теневого DPTR просто меняешь соответсвующий разряд в текущем DPTR. Опорное постоянное, а вот коэффициенты разные (5 напряжений и несколько температур). Коэф. задаются делителями, а они разные... Если я правильно понял вопрос.
|
|
|
|
|
Mar 25 2008, 06:33
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(tag @ Mar 24 2008, 18:54)  ...геммороя здесь нет, книги читать надо. Вот этот фрагмент кода выполняет преобразование 12-разрядного числа в упакованное BCD-число из 2-х байт. В регистры R2 и R3 загружаете соответственно младшую и старшую часть искомого числа, на выходе в регистре R0 две младшие цифры числа, в R1 старшие цифры числа. Например R2 = FFh R3= 0Fh -> R0 = 95h R1 = 40h. Дальше все просто. Спасибо. Суть ясна.  Цитата(MrYuran @ Mar 25 2008, 10:18)  А к чему такая спешка, чтобы прям сразу отвечать, за считанные такты? Ну не за считанные такты, а за 6 ms, как выяснилось сюда и время передачи инфы по магистрали включено  . Просто во главе всего стоит блок с ADSP, когда для него приходилось делать - вопросов не возникало, а с 51 я неделю только к асму привыкал. В системе много блоков, десятка 2 минимум, всех надо опросить и на преобразования такого типа времени не осталось. По требованиям цикл опроса мал. Собственно вот...
|
|
|
|
|
Mar 25 2008, 16:53
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(novlev @ Mar 25 2008, 12:14)  Опорное постоянное, а вот коэффициенты разные (5 напряжений и несколько температур). Коэф. задаются делителями, а они разные... Если я правильно понял вопрос. Тогда все усложняется. Памяти может не хватить. Придется считать. Либо ТЗ переделывать, чтобы уйти от передачи в таком виде и передавать результат в необработанном виде, но с признаками изменнеия условий измерения. А нельзя прогу в месте приема для РС написать? Как бы все упростилось  .
--------------------
Я здесь и сейчас...
|
|
|
|
|
Mar 26 2008, 09:27
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(Linker @ Mar 25 2008, 20:53)  Тогда все усложняется. Памяти может не хватить. Придется считать. Либо ТЗ переделывать, чтобы уйти от передачи в таком виде и передавать результат в необработанном виде, но с признаками изменнеия условий измерения. А нельзя прогу в месте приема для РС написать? Как бы все упростилось  .   увы ТЗ низя никак переписывать, а принимает это все не персоналка   а очередная железяка, только на ADSP2191. Впринципе я чото нагородил: перевел во флоад прочитанный код, выполнил деление с коэф. преобразовал результат обратно в 16 разрядный "интеджер" это 5:) получается, потом преобразование в десятичныю систему, на выходе 4, 8 вечные получаются. Вот задумался что просто деление 16разр/16разр все упростит(хотя есть чувство что я сильно ошибаюсь). Надо точность повысить деления, во флоатах я сильно загрубляю результат
|
|
|
|
|
Mar 27 2008, 17:59
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(novlev @ Mar 26 2008, 15:27)  Ну, а если не персоналка, то зачем такой сложный формат передачи? По любому должно быть проще преобразовать в месте приема. А в каком виде эти данные отчуждаются в пункте приема? Почему надо иметь дробь? Ведь явно на дисплей. Или куда? Ну а эти переводы во флоад, умножение, деление и потом обратно... да еще на ассемблере ни к чему хорошему не приведут. Сочуствую.
--------------------
Я здесь и сейчас...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|