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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Преобразование кода АЦП, нужен совет
novlev
сообщение Mar 24 2008, 11:25
Сообщение #1


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Вопрос такой:
есть код ацп, его надо преобразовать в десятичную форму(1й байт целая часть, 2й - дробная). Как проще всего это сделать. Пишу на асме, контроллер - ADuC841.
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 24 2008, 13:10
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105



Цитата(novlev @ Mar 24 2008, 17:25) *
Вопрос такой:
есть код ацп, его надо преобразовать в десятичную форму(1й байт целая часть, 2й - дробная). Как проще всего это сделать. Пишу на асме, контроллер - ADuC841.

Я так понимаю, Вы хотите потом этот код передать по СОМ-порту в гипертерминал в цифробуквенном виде в кодах ASCII? Или что?


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 24 2008, 13:19
Сообщение #3


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



да, передать по интерфейсу 485, но не в кодеровке, а именно 2 байта, но представление инфы долждно быть как десятичное, те вычитал (например 0А8А) и отправил в первом байте 05, во втором - 12 (условно), и это типа 5,12 вольта.Сижу ломаю головуsad.gif
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 24 2008, 13:42
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105



Цитата(novlev @ Mar 24 2008, 19:19) *
да, передать по интерфейсу 485, но не в кодеровке, а именно 2 байта, но представление инфы долждно быть как десятичное, те вычитал (например 0А8А) и отправил в первом байте 05, во втором - 12 (условно), и это типа 5,12 вольта.Сижу ломаю головуsad.gif

мдя. делать такие преобразования на 8 разрядном ядре на ASM- гимор. Может сделать таблицу коэффициентов? Т.е. каждому возможному отсчету (их всего 4096) присвоить значения, полученные путем деления опорного напряжения на 4096, а потом умноженного на 12-разрядный отсчет. Эти расчеты сделать например в EXELL. Памяти в ADuC 845 для для хранения такой таблицы достаточно. Не элегантно конечно, но зато потом будет быстро работать.

Сообщение отредактировал Linker - Mar 24 2008, 13:44


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 24 2008, 13:52
Сообщение #5


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Цитата(Linker @ Mar 24 2008, 17:42) *
мдя. делать такие преобразования на 8 разрядном ядре на ASM- гимор. Может сделать таблицу коэффициентов? Т.е. каждому возможному отсчету (их всего 4096) присвоить значения, полученные путем деления опорного напряжения на 4096, а потом умноженного на 12-разрядный отсчет. Эти расчеты сделать например в EXELL. Памяти в ADuC 845 для для хранения такой таблицы достаточно. Не элегантно конечно, но зато потом будет быстро работать.


Да я уже думал об этом, просто таких таблиц надо сгородить несколько для одного девайся, а их несколько разных, но спасибо за совет, теперь я уже уверен что так и сделаю. А есть пример реализации? т е механизм работы с таблицей, просто велосипед изобретать не хочется, особенно после написания арифметики с плав запятой, интузиазм на нулеsad.gif
Go to the top of the page
 
+Quote Post
tag
сообщение Mar 24 2008, 14:54
Сообщение #6


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 24 2008, 15:02
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



а почему на си нельзя? В том же Кейле, к примеру?
Тогда никаких геморов ни с плавающей арифметикой, ни с преобразованием типов.
И флеши намного меньше уйдёт, чем на таблицы


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 24 2008, 15:07
Сообщение #8


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Цитата(MrYuran @ Mar 24 2008, 19:02) *
а почему на си нельзя? В том же Кейле, к примеру?
Тогда никаких геморов ни с плавающей арифметикой, ни с преобразованием типов.
И флеши намного меньше уйдёт, чем на таблицы


Потому что после си потом один х что получается, а тут надо знать буквально по тактам что творится, род деятельности обязывает... Да не спасет тут никакое преобразование типов, просто геморный выходной формат данных, плюс ограничения по времени отклика на запрос...
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 24 2008, 15:50
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 25 2008, 06:14
Сообщение #10


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

Группа: Участник
Сообщений: 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 напряжений и несколько температур). Коэф. задаются делителями, а они разные... Если я правильно понял вопрос.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 25 2008, 06:18
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А к чему такая спешка, чтобы прям сразу отвечать, за считанные такты?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 25 2008, 06:33
Сообщение #12


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

Группа: Участник
Сообщений: 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. Дальше все просто.

Спасибо. Суть ясна.smile.gif

Цитата(MrYuran @ Mar 25 2008, 10:18) *
А к чему такая спешка, чтобы прям сразу отвечать, за считанные такты?


Ну не за считанные такты, а за 6 ms, как выяснилось сюда и время передачи инфы по магистрали включеноsad.gif. Просто во главе всего стоит блок с ADSP, когда для него приходилось делать - вопросов не возникало, а с 51 я неделю только к асму привыкал.

В системе много блоков, десятка 2 минимум, всех надо опросить и на преобразования такого типа времени не осталось. По требованиям цикл опроса мал. Собственно вот...
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 25 2008, 16:53
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105



Цитата(novlev @ Mar 25 2008, 12:14) *
Опорное постоянное, а вот коэффициенты разные (5 напряжений и несколько температур). Коэф. задаются делителями, а они разные... Если я правильно понял вопрос.

Тогда все усложняется. Памяти может не хватить. Придется считать. Либо ТЗ переделывать, чтобы уйти от передачи в таком виде и передавать результат в необработанном виде, но с признаками изменнеия условий измерения. А нельзя прогу в месте приема для РС написать? Как бы все упростилось smile.gif .


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post
novlev
сообщение Mar 26 2008, 09:27
Сообщение #14


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Цитата(Linker @ Mar 25 2008, 20:53) *
Тогда все усложняется. Памяти может не хватить. Придется считать. Либо ТЗ переделывать, чтобы уйти от передачи в таком виде и передавать результат в необработанном виде, но с признаками изменнеия условий измерения. А нельзя прогу в месте приема для РС написать? Как бы все упростилось smile.gif .


smile.gifsmile.gif увы ТЗ низя никак переписывать, а принимает это все не персоналкаsad.gifsad.gif а очередная железяка, только на ADSP2191. Впринципе я чото нагородил: перевел во флоад прочитанный код, выполнил деление с коэф. преобразовал результат обратно в 16 разрядный "интеджер" это 5:) получается, потом преобразование в десятичныю систему, на выходе 4, 8 вечные получаются. Вот задумался что просто деление 16разр/16разр все упростит(хотя есть чувство что я сильно ошибаюсь). Надо точность повысить деления, во флоатах я сильно загрубляю результатsad.gif
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 27 2008, 17:59
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105



Цитата(novlev @ Mar 26 2008, 15:27) *
smile.gifsmile.gif увы ТЗ низя никак переписывать, а принимает это все не персоналкаsad.gifsad.gif а очередная железяка, только на ADSP2191. Впринципе я чото нагородил: перевел во флоад прочитанный код, выполнил деление с коэф. преобразовал результат обратно в 16 разрядный "интеджер" это 5:) получается, потом преобразование в десятичныю систему, на выходе 4, 8 вечные получаются. Вот задумался что просто деление 16разр/16разр все упростит(хотя есть чувство что я сильно ошибаюсь). Надо точность повысить деления, во флоатах я сильно загрубляю результатsad.gif

Ну, а если не персоналка, то зачем такой сложный формат передачи? По любому должно быть проще преобразовать в месте приема. А в каком виде эти данные отчуждаются в пункте приема? Почему надо иметь дробь? Ведь явно на дисплей. Или куда? Ну а эти переводы во флоад, умножение, деление и потом обратно... да еще на ассемблере ни к чему хорошему не приведут. Сочуствую.


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 17:43
Рейтинг@Mail.ru


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