Алгоритм кодировки

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ppp
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Ср мар 02, 2011 20:05:39
Откуда: Карельский перешеек

Алгоритм кодировки

Сообщение ppp »

Хочу в своих БП заменить трехразрядные декадные переключатели энкодерами. Помогите составить красивый алгоритм, пожалуйста.

Суть работы схемы заключается в том, энкодером задаем значение переменной Ain. Преобразовываем это значение в соответствии с таблицей перекодировки в 12-битовую переменную Aout и выталкиваем это значение в сдвиговый регистр. Таблица перекодировки и фрагмент схемы на эскизе ниже.

Изображение

Максимальное значение переменной Аin = 1665, т.е. = сумме всех значений первого столбца (все выходы регистра установлены в "1"). Минимальное = 0, т.е. все линии установлены в "0". Любое промежуточное значение равно сумме соответствующих наибольших значений первого столбца. Например, 1283 = 800+400+80+2+1 или 800x1 + 400x1 + 200x0 + 100x0 + 80x1 + 40x0 + 20x0 + 10x0 +8x0 + 4x0 + 2x1 + 1x1.

Первое, что приходит в голову, вычитать из Ain последовательно значения первого столбца, начиная с нижнего (т.е. 800). Если остаток >0, то устанавливать соответствующий бит переменной Aout в "1" и вычитать из остатка следующее (400). И так 12 раз. Может существует более элегантное решение для кодов 1-2-4-8?
Общаться со мной можно, к сожалению, только на СИ. Интересует только алгоритм или код самого преобразования, с выталкиванием в регистр я разберусь.
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Алгоритм кодировки

Сообщение akl »

По мне, имея такой камень можно и без регистров
СпойлерИзображение
TEST_PPP.GIF
Реклама
ppp
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Ср мар 02, 2011 20:05:39
Откуда: Карельский перешеек

Re: Алгоритм кодировки

Сообщение ppp »

Спасибо, akl, что обратили внимание на эту тему. Но такое решение мне не очень подходит. Я привел только фрагмент схемы. На самом деле свободных портов нет. В устройстве таких каналов два (для тока и для напряжения), два энкодера с кнопками переключения шага регулировки (два - потому что место на панели позволяет не жаться и я не сторонник многофункциональных органов управления), кнопки предустановок режимов, кнопка отключения нагрузки, индикатор установленного напряжения и тока, пара светодиодов.

Забыл еще про пищалку :).

Даже если перейти на 40-ногий МК, то все равно не хватит портов, чтобы подключиться напрямую без регистров.
Да и сам алгоритм управления 12-ю ногами не станет от этого проще...

Хотелось бы всё-таки поговорить об алгоритме, а не о железе. С реализацией в железе всё уже проработано.

Изображение
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Алгоритм кодировки

Сообщение a_skr »

Что-то здесь не так. Если переменная равна 100, то что это? 1х100 или 1х80+1х20? Наверное, числа 1,2,4,8,10,20,.. - не в десятичном виде, а в шестнадцатеричном? Тогда вообще ничего преобразовывать не надо.
Реклама
Эиком - электронные компоненты и радиодетали
ppp
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Ср мар 02, 2011 20:05:39
Откуда: Карельский перешеек

Re: Алгоритм кодировки

Сообщение ppp »

Нет, числа десятичные. Увы :). Если переменная 100, то 100x1, преобразуем от больших значений к меньшим. Но это только для однозначности. Схемотехнически результат будет таким же, как и 80x1+20x1, просто зря лишний ток будет потреблять ЦАП самого БП.
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Алгоритм кодировки

Сообщение ibiza11 »

алгоритм прост)
берете свою переменную и последовательно из нее вычитаете свои разряды:
прошу прощения, код был неправильный

Код: Выделить всё

uint16_t value;
uint16_t decode(uint16_t value);
{
	uint16_t result = 0;
	if(value >= 800) {
		value -= 800;
		result |= (1<<11);
	}
	if(value >= 400) {
		value -= 400;
		result |= (1<<10);
	}
	if(value >= 200) {
		value -= 200;
		result |= (1<<9);
	}
	if(value >= 100) {
		value -= 100;
		result |= (1<<8);
	}
	if(value >= 80) {
		value -= 80;
		result |= (1<<7);
	}
	if(value >= 40) {
		value -= 40;
		result |= (1<<6);
	}
	if(value >= 20) {
		value -= 20;
		result |= (1<<5);
	}
	if(value >= 10) {
		value -= 10;
		result |= (1<<4);
	}
	if(value >= 8) {
		value -= 8;
		result |= (1<<3);
	}
	if(value >= 4) {
		value -= 4;
		result |= (1<<2);
	}
	if(value >= 2) {
		value -= 2;
		result |= (1<<1);
	}
	if(value >= 1) {
		result |= (1<<0);
	}
	return result;
}
Последний раз редактировалось ibiza11 Ср окт 30, 2013 10:16:17, всего редактировалось 2 раза.
Ставим плюсы: )
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Алгоритм кодировки

Сообщение a_skr »

для экономии ОЗУ:

Код: Выделить всё

b = 0;
if(a >= 800){ b|=0x800; a-=800; }
if(a >= 400){ b|=0x400; a-=400; }
if(a >= 200){ b|=0x200; a-=200; }
if(a >= 100){ b|=0x100; a-=100; }
if(a >=  80){ b|=0x080; a-= 80; }
if(a >=  40){ b|=0x040; a-= 40; }
if(a >=  20){ b|=0x020; a-= 20; }
if(a >=  10){ b|=0x010; a-= 10; }
if(a >=   8){ b|=0x008; a-=  8; }
if(a >=   4){ b|=0x004; a-=  4; }
if(a >=   2){ b|=0x002; a-=  2; }
if(a       ){ b|=0x001;         }
Для экономии ФЛЕШ:

Код: Выделить всё

uint16_t t[12]={800,400,200,100,80,40,20,10,8,4,2,1};
uint16_t y[12]={0x800,0x400,0x200,0x100,0x80,0x40,0x20,0x10,8,4,2,1};
b = 0;
for(i=0; i<12; i++)
{
  if(a >= t[i]){ b|=y[i]; a-=t[i]; }
}
Последний раз редактировалось a_skr Ср окт 30, 2013 10:27:46, всего редактировалось 1 раз.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Алгоритм кодировки

Сообщение ibiza11 »

да, я поправил пост, но Ваш вариант с табличкой лучше)
Ставим плюсы: )
ppp
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Ср мар 02, 2011 20:05:39
Откуда: Карельский перешеек

Re: Алгоритм кодировки

Сообщение ppp »

ibiza11 писал(а):берете свою переменную и последовательно из нее вычитаете свои разряды:
Собственно, в первом посте о таком алгоритме и говорил, думал известны какие-нибудь не такие прямолинейные решения. Но в ваших с a_skr записях кода всё выглядит весьма красиво. Особенно последнее.

Спасибо a_skr и ibiza11.
Ответить

Вернуться в «Разные вопросы по МК»