Как разложить по разрядам, програмно (Си).

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Так умножить на 0.1 или поделить на 10 - АРИФМЕТИКА школьная !
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Не нада... это... таво...
А вдруг оно помножит "к" с "10" и поделит без остатка?!
Я о синтаксисе, а не об арифметике справедался...
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Дак используйте числа с точкой. Этож Си а не АСМ.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

AAAA

Сообщение MetEl »

НУ всеравно не получается разложить на биты
us это ADCW
массив db[16] глобальный

void d_bit(unsigned int us)
{
for (n=0;n<15;n=n+1){
db[n]=us&1;
us>>=1;
};

А потом нарисовать на экране

}
void set_vol (unsigned char yd )
{
unsigned char x,w,d;

for (x=0;x<15;x=x+1){
d=db[x];
if (!d) {
w = 0x0F;
};
w = 0x03;
DC = 0;
spi(64+yd);
spi(128+x);
DC = 1;
spi(w);
};
}

И такие выражения - wr_symb_LCD(dg,1,dgx,30); и dg=digits[n];
ТОже ни к чему не приводят!
Если вместо dg или dgx пишу 1 или 21, да хоть 5. То всё нормально!
А вот так-
dgx=1;
for (n=0;n<5;n=n+1)
{
dg=digits[n];
wr_symb_LCD(dg,1,dgx,30); // символ, инверсия,x,y
dgx++;
};
Нифига.
В wr_symb-LCD тоже свой массив...
Последний раз редактировалось MetEl Ср ноя 21, 2007 10:31:32, всего редактировалось 4 раза.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ТЫ в переменные выводимые запиши числа и убедись что вывод происходит правильно.

Затем ужет отлаишь часть проги создающей эти числа будучи уверенным в выводе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Мы победим! (наверное...)

Сообщение MetEl »

да, не ассемблер.

for (x=0;x<10;x++){
t=(db[x]&1);
if (t==0){
spi(0x03);
} // не поставил точку с запятой
else {
spi(0x0F);
} // сдесь тожы
};

Определил что if не функионирует (а я думал, что задаю условия не правильно. Ан нет, не в этом дело)
Расширил возможности операции (if) добавил else и тогда компилятор нечал ругатся.
Типа невозможно - if-а нет!

А остальное - глобальные переменные пересмотрел и с утра оно понятней.
Гулять на свежем воздухе нада!
Аватара пользователя
alex2103
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье
Контактная информация:

Сообщение alex2103 »

А зачем там ";" после "}" ???
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

ДОРОГАЯ РЕДАКЦИЯ

Сообщение MetEl »

а я гдето читал , ято её ножно всегда ставить...

А что она значит и зачем ни читал..
(к кпримеру символ перевода каретки, как в текст проц.Word)
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Ребятки у меня тож вопрос назрел....так....чисто подтвердить свои мысли!
Задача - есть число b=0х10
надо в массив a[8] вбить биты составляющие это число причём как можно быстрее и проще ибо тратить ресурсы цп не хочется

грубо говоря просто вывести на экран алфавитный нулики и единички бинарные :)
Аватара пользователя
MOHOXPOM
Встал на лапы
Сообщения: 108
Зарегистрирован: Вт мар 18, 2008 08:25:31
Откуда: Красноярск
Контактная информация:

Сообщение MOHOXPOM »

Может я не в тему, но я немного не понимаю, а зачем на биты раскладывать? Если на вывод на экран надо то есть простая цепочка:
1) Получить результат ADC
2) Воспользоваться формулой из даташа по переводу в милливольты.
3) Домножить результат до нужной запятой (*1000 = вольты)
4) Разложить на «до запятой» и «после запятой»
5) Через sprintf занести сформированную строку в массив и вывести как строку

возможно этот кусок поможет:


char BufferADC[6]; //хранение значения ADC
unsigned int ADC_H, ADC_L, ADC_T;

SIGNAL(SIG_ADC){
while (ADCSRA & _BV(ADSC)) {}
ADC_T = ((double)ADCW*5/1024)*1000;
ADC_H = ADC_T/1000;
ADC_L = ADC_T-ADC_H*1000;
sprintf(BufferADC,"%d,%03dV", ADC_H, ADC_L);
}
Как зачем мне голова?! Я ей ем!!!
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

ладно ставлю конкретную задачу
Есть переменная data = 0b10100101
теперь далее есть две переменных
port_lcd_tact_lo
port_lcd_tact_hi
в них есть некоторые состояния порта в котором один бит поменян(тот который соответствует выводу к которому подключен тактовый вход
примерно вот так
#define SCE 0b00000001
#define D_C 0b00000010
#define SDIN 0b00000100
#define SCLK 0b00001000
#define RES 0b00010000
следовательно
port_lcd_tact_lo = RES|D_C; // это состояние порта для возможности приём с тактом в нуле
port_lcd_tact_hi = RES|SCLK|D_C; // это то же самое состояние но с высоким тактом

нужно теперь выводить в порт д port_lcd_tact_lo если последний бит в данных = 0 или port_lcd_tact_lo|SDIN если старший бит = 1 потом то же самое но с переменной port_lcd_tact_hi
потом port_lcd_tact_lo если 7-й бит в переменной data = 0 и port_lcd_tact_hi|SDIN если 7-й бит в data = 1 и так далее до конца всех битов в data - 8 штук
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

Alexonus писал(а):Есть такая проблемка. Надо вывести цифры на дисплей 7-и сегментный. Но выход на дисплей в особенной кодировке. Пример: 1=0xCO; Числа могут быть больше десятка. Как разбить integer и присвоить цифрам мой код?


Разбивают числа вот так например:

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

int input; //ваше число - допустим 0xC7
int out_l, out_r; //результат - C и 7
out_l=input>>4;
out_r=input&0x0F;

Хотя я не совсем понял зачем вам это нужно, вам нужно просто назначить чтобы, например при 0xC7 выводилась "1" на дисплей? Так? Все правильно? Тогда вообще непонятно в чем проблема.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Для вывода на 7-ми сегментные индикаторы обычно используют таблицы перекодировки.
1. создается таблица кода для отображения в зависимости от подключения к mcu.
2. указатель устанавливается на начало таблицы
3. к указателю добавляется ваше число
4. по значению указателя из таблицы извлекается код и отправляется на индикатор.
все!
зы: числа больше десятка надо привести к BCD виду, разделить на тетрады и пользоваться, хотя... если надо отображать не только цифры 0..9, в общем надо смотреть в контексте конкретной задачи
Чем дальше, тем больше становлюсь занудой...
Изображение
Alexonus
Родился
Сообщения: 13
Зарегистрирован: Ср апр 29, 2009 10:10:42
Откуда: Киев
Контактная информация:

Сообщение Alexonus »

В программе были расчеты и в переменную X (Integer) записано число. Мне надо вывести эти числа на 7-ый индикатор. Кодировка вывода нестандартная 1=С2... 2=A2.... как то так. Я вот думаю разбить число на десятые сотые и тд и через сравнение выводить мой код. Есть ли более простое решение? Просто в контроллере Атмега8 из за занятых битов приходится извращатся с выводом данных ^_^
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Тогда давай по-конкретней,
что за дисп. таблица кодов к нему, диапазон выводимых значений если от отличен от 0..255 ну и т.п.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

что то вы мудрите.
если у вас есть число, которое нужно вывести в переменной, то поступаете так.
в памяти программ записываете с какого то "начального адреса" такую последовательность :х0,х1,х2,х3,х4,х5,х6,х7,х8,х9. где х0 - код цифры ноль на индикаторе, х1-код цифры 1, х2-код цифры 2, х3-код цифры 3.... и т.д.
далее
берете макс число, которое может быть в переменной(например если 16 битное число то макс = 65535, для примера возьмем число 34567) берем оттуда число 10000 (десять тысяч)
и вычитаем несколько раз из нашего исходного числа до тех пор пока результат не станет отрицательным и считаем это количество раз(в нашем примере получим 3), прибавляем к 3 "начальный адрес" - получаем адрес при обращении по которому мы получим код цифры "3", куда нибудь его запоминаем(в какой нить буфер вашего индикатора). потом к переменной прибавляем 10000 один раз, чтобы компенсировать последнее вычитание. в итоге в нашем случае в переменной получим 4567.
далее вычитаем таким же образом 1000, 100, 10 и получаем соответствующие коды цифр. далее выводим из буфера все что мы запомнили на ваш дисплей(семисегментник).

ЗЫ вычитать 1 не нужно. число и так будет храниться в переменной после вычитания 10.
вот как то так. переваривайте пожалуйста.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

в принципе мы с GP1 повторяемся, я просто развернул подробнее понятие "таблица перекодировки"
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Alexonus писал(а):Кодировка вывода нестандартная 1=С2... 2=A2.... как то так.
я думаю вряд ли кто то устанавливал стандарты на коды для семисегментников :)) каждый решает для своей задачи, как удобнее плату развести ну и подобные извороты)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Добавлю еще пару строк.
Если софт на асме то у Atmela есть стандарные библиотеки для конвертации цифирь bin-BCD и обратно, врать не буду наверное там и на Си имеются, апноут толи AVR204, то ли AVR240, давно не пользовался забыл.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
adrenocrome
Потрогал лапой паяльник
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow
Контактная информация:

Сообщение adrenocrome »

А я сделал в своих часах так
Это для двух сегментов.

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

                        
POS1=char_table[h/10];
POS2=char_table[h%10];

соответственно char_table - это массив,в котором каждая цифра перекодирована для семисегментника.
POS1 и POS2 - это первый и второй элементы индикатора.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»