|
Преобразвание bin-hex, Из bin на 7-сегментный индикатор |
|
|
|
Apr 29 2008, 22:42
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Проблема следующая. После оцифровки сигнала в АЦП, в регистре имеется 8бит данных. Задача преобразовать этот двоичный регистр в три, к которые будут отображаться на трёх семисегментных индикаторах соответственно. В индикаторах должен отображаться десятичный эквивалент сигнала (0-255). Подскажите, легко ли это реализовать на ассемблере, и где про это можно почитать? Спасибо.
Сообщение отредактировал Kuznec9999 - Apr 29 2008, 22:43
|
|
|
|
|
 |
Ответов
|
Apr 30 2008, 15:30
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Kuznec9999 @ Apr 30 2008, 02:42)  После оцифровки сигнала в АЦП, в регистре имеется 8бит данных. Задача преобразовать этот двоичный регистр в три, Ну вот, такое отдающее "новизной" обсуждение, чуть было не прошло мимо меня  Для одного байта я бы сделал как-нить так: Код ;Input: r16 - 8bit Binary ;Output: r18:r17:r16 unpacked BCD
ldi r18,51 ldi r19,10
mov r17,r16 lsr r17 inc r17 mul r17,r18 mov r17,r1 mul r1,r19 sub r16,r0 mov r1,r17 lsr r1 inc r1 mul r1,r18 mov r18,r1 mul r1,r19 sub r17,r0 16 слов и 20 тактов
|
|
|
|
|
Apr 30 2008, 18:43
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(singlskv @ Apr 30 2008, 19:30)  16 слов и 20 тактов Не, чего-то первый раз не очень получилось, пробуем еще: Код ;Input: r16 - 8bit Binary ;Output: r18:r17:r16 unpacked BCD
ldi r17,41 mul r16,r17 swap r0 swap r1 movw r16,r0 mov r18,r17 andi r18,0x0F andi r17,0xF0 andi r16,0x0F or r17,r16 inc r17 ldi r16,10 mul r16,r17 mov r17,r1 mul r0,r16 mov r16,r1 16 слов 19 тактов, ну и регистров меньше используем Нда..., подумал еще..., все нужно делать по-другому Код ;Input: r16 - 8bit Binary ;Output: r18:r17:r16 unpacked BCD
ldi r17,164 mul r16,r17 clr r18 lsl r0 rol r1 rol r18 lsl r0 rol r1 rol r18 inc r1 ldi r16,10 mul r1,r16 mov r17,r1 mul r0,r16 mov r16,r1 15 слов 18 тактов
|
|
|
|
|
May 2 2008, 15:07
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(singlskv @ Apr 30 2008, 22:43)  Код ;Input: r16 - 8bit Binary ;Output: r18:r17:r16 unpacked BCD
ldi r17,164 mul r16,r17 clr r18 lsl r0 rol r1 rol r18 lsl r0 rol r1 rol r18 inc r1 ldi r16,10 mul r1,r16 mov r17,r1 mul r0,r16 mov r16,r1 А нельзя ли пояснить вкратце? Начало я понял: деление на 100 осуществляется умножением на число 32768/100 и результат оказывается в третьем байте, а дальше? И как получается правильный результат несмотря на то что используется округленное частное - 328.
|
|
|
|
|
May 2 2008, 16:38
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(777777 @ May 2 2008, 19:07)  А нельзя ли пояснить вкратце? Начало я понял: деление на 100 осуществляется умножением на число 32768/100 и результат оказывается в третьем байте, а дальше? И как получается правильный результат несмотря на то что используется округленное частное - 328. после умножения на 164 и 2 сдвигов в r18 получаем количество сотен(X/100) результат для 2 сотен всегда правильный тк нужно было умножить на 163,84 а для всего 2 сотен достаточно округления до 164 после 2 сдвигов в r1:r0 получаем остаток от деления на 100 нормализованный к диапазону 0-65536, столько разрядов нам не нужно, хватит и 8 тк нам нужно получить всего 100 значений (0-99), остается r1 в котором значение 0-99 нормализованное до 0-256 нужно перевести его в десятки и единицы и это делается просто умножением 2 раза на 10, но для этого нужно скоректировать значение в r1, тк полученный остаток при первом делении и последующие умножения на 10 всегда отбрасывают младшие разряды, те принцип примерно как при получении среднего Smed = (Sum(X1,....XN)+N/2)/N для правильного округления в нужную сторону
|
|
|
|
Сообщений в этой теме
Kuznec9999 Преобразвание bin-hex Apr 29 2008, 22:42 rezident Ключевое слово для поиска по форуму - BCD. Вот в т... Apr 29 2008, 22:59 Kuznec9999 Цитата(rezident @ Apr 30 2008, 02:59) Клю... Apr 29 2008, 23:03  Сергей Борщ Цитата(Kuznec9999 @ Apr 30 2008, 02:03) Ж... Apr 29 2008, 23:49  rezident Цитата(Kuznec9999 @ Apr 30 2008, 05:03) С... Apr 29 2008, 23:54  777777 Цитата(Kuznec9999 @ Apr 30 2008, 03:03) С... Apr 30 2008, 04:52 domowoj Есть много методов преобр.
Самый быстрый - табличн... Apr 30 2008, 01:33 MrYuran Цитата(domowoj @ Apr 30 2008, 04:33) Есть... Apr 30 2008, 05:24  777777 Цитата(MrYuran @ Apr 30 2008, 09:24) не п... Apr 30 2008, 05:43 TarasH Смотри сюда http://www.atmel.ru/Articles/Atmel1... Apr 30 2008, 06:26 777777 Цитата(TarasH @ Apr 30 2008, 10:26) Смотр... Apr 30 2008, 06:40  ReAl Цитата(777777 @ Apr 30 2008, 09:40) Че-то... Apr 30 2008, 08:34 blackfin Ещё пару ссылок:
int >> str
itoa на asm, и... Apr 30 2008, 06:58 MrYuran ЦитатаЭто, конечно, быстрее, чем делением на 10
А ... Apr 30 2008, 08:49 ReAl Цитата(MrYuran @ Apr 30 2008, 11:49) А чт... Apr 30 2008, 13:00 Kuznec9999 Попробовал avr204.asm, а именно bin2bcd8... На вых... Apr 30 2008, 12:08  Kuznec9999 Цитата(singlskv @ Apr 30 2008, 22:43) Код... Apr 30 2008, 19:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|