|
Преобразование кода АЦП, нужен совет |
|
|
|
 |
Ответов
|
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, 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: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 напряжений и несколько температур). Коэф. задаются делителями, а они разные... Если я правильно понял вопрос.
|
|
|
|
Сообщений в этой теме
novlev Преобразование кода АЦП Mar 24 2008, 11:25   novlev Цитата(Linker @ Mar 24 2008, 17:42) мдя. ... Mar 24 2008, 13:52      Linker Цитата(novlev @ Mar 25 2008, 12:14) Опорн... Mar 25 2008, 16:53       novlev Цитата(Linker @ Mar 25 2008, 20:53) Тогда... Mar 26 2008, 09:27        Linker Цитата(novlev @ Mar 26 2008, 15:27) увы ... Mar 27 2008, 17:59    novlev Цитата(tag @ Mar 24 2008, 18:54) ...геммо... Mar 25 2008, 06:33  @Ark Цитата(novlev @ Mar 24 2008, 16:19) да, п... Mar 27 2008, 23:10 MrYuran а почему на си нельзя? В том же Кейле, к примеру?
... Mar 24 2008, 15:02 novlev Цитата(MrYuran @ Mar 24 2008, 19:02) а по... Mar 24 2008, 15:07 MrYuran А к чему такая спешка, чтобы прям сразу отвечать, ... Mar 25 2008, 06:18 Omen_13 Можно сделать ход конём - умножением результата из... Mar 27 2008, 20:13 Omen_13 Нашел фрагмент, может поможет...
R6R5 - код с АЦП ... Mar 28 2008, 14:51 novlev всем спасибо за советы, забрел сейчас в такие дебр... Apr 2 2008, 08:30 novlev Все... имею на выходе челую и дробную части, загру... Apr 2 2008, 10:18 asm_lock Я так понимю тема про АЦП. В контроллера ADuC841, ... Jul 9 2010, 22:52 asm_lock Я так понимю тема про АЦП. В контроллера ADuC841, ... Jul 10 2010, 08:17 Микрюков Вячеслав Цитата(novlev @ Mar 24 2008, 15:25) Вопро... Sep 6 2010, 08:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|