Подключение семисегментных индикаторов

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж

Сообщение pirotehnick »

Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже :) .
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

делить.... А вообще в обучалке написано.
Today fine night...
Реклама
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж

Сообщение pirotehnick »

А можно по конкретнее, ссылочку дать например :)
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

http://www.radiokot.ru/start/mcu_fpga/avr/15/, например...
можно делить:
первая цифра (4): 42357 / 10000
вторая (2): 42357 % 10000 / 1000
ну и т.д.
было уже, ищите по форуму.
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 487
Зарегистрирован: Чт ноя 23, 2006 22:47:35

Сообщение Pahan »

А если проц не поддерживает хардварно команды деления, то вычитать в цикле :)))
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

pirotehnick писал(а):Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже :) .
вот, может, поможет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 119
Зарегистрирован: Вт апр 17, 2007 15:24:47
Откуда: Новосиб

Сообщение Artem333 »

Если пишется на асме АВР то на их сайте есть подпрограммы 16ти битного деления/умножения и BCD перевод чисел. Ими я и пользуюсь до сих пор.
Всё просто как самогонный аппарат
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Можно также сделать цикл и отнимать например по 100 и с каждым циклом прибавлять к ещё одной переменной 1, потом цикл в котором отнимается по 10 и прибавлять к другой переменной 1, а всё что осталось это первая цифра числа.
Например цикл для третий цифры, число например 125:

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

a=125;
while(a>=100){
    a=a-100;
    sot++;       //тут определяем первою цифру (в примере тут будет 1)
}
while(a>=10){   
    a=a-10;        
    des++;        //тут определяем вторую цифру (в примере тут будет 2)
}
edi=a;           //тут определяем третию цифру (в примере тут будет 5)
Хотя можно и просто делить. Кому как больше нравится. :)
Изображение
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Неплохой пример на асме по переводу из hex в bcd есть на atmel.ru. Довольно юзаьбельный. Причём легко можно подогнать разрядность.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 255
Зарегистрирован: Пн фев 11, 2008 20:32:45
Откуда: Краснодарский край

Сообщение knyaz* »

Мой вариант таков

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

int seg[3];
temp=123;
seg[0]=temp%10;
temp=temp/10;
seg[1]=temp%10;
seg[2]=temp/10;
for(int i=0;i<=3;i++)
printf("&i\n",seg[i]);
При выполнении проги получим результат
3
2
1
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж

Сообщение pirotehnick »

Большое спасибо всем за помощь. :)
Вспользовался по принципу ступенчатого вычитания.
Контактная информация:
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Сообщение Александр 2677 »

Подскажите пожалуйста , можно ли по такой схеме подключить семисегментный индикатор с общим анодом через полевой транзистор IRF7311, к микроконтроллеру? А то я видел схему с общим катодом, проверьте правильно ли я её переделал?
Снимок.JPG
(19.37 КБ) 752 скачивания
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

так вывожу на lcd частоту в герцах из лонга(32бит)

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

 void print_longint (unsigned long int s)   
 {
     c9=0;c8=0;c7=0;c6=0;c5=0;c4=0;c3=0;c2=0;c1=0;   
while (s>=1000000000){s-=1000000000;c9++;}   
while (s>=100000000){s-=100000000;c8++;}    
while (s>=10000000){s-=10000000;c7++;}   
while (s>=1000000){s-=1000000;c6++;}   
while (s>=100000){s-=100000;c5++;}     
while (s>=10000){s-=10000;c4++;}
while (s>=1000){s-=1000;c3++;}
while (s>=100){s-=100;c2++;}
while (s>=10){s-=10;c1++;}
c0=s;      
            print_char(c9+16);
            print_char(c8+16);
            print_char(c7+16);
            print_char(c6+16);
            print_char(c5+16);
            print_char(c4+16);
            print_char(c3+16);  
            print_char(c2+16);
            print_char(c1+16);
            print_char(c0+16);
         }
ух ты.... показывает
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

pirotehnick, поищи в нете по ключевому слову bin2bcd - должно быть много решений. На AVR для преобразования 1байт -> 3 bcd разряда пользую такую рутину:

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

сырой код удален по просьбам трудящихся
Есть и более эффективные алгоритмы, там используется сложение-вычитание-сравнение с волшебными цифрами 3 и 7, но я с ними так и не разобрался, описание алгоритма было в древней советской книжке по цифровой технике, и еще был пример с его использованием на PIC, но в том примере диапазон значений был от 0 до 99, чтоб влезало в один байт в упакованном виде.
Последний раз редактировалось stas00n Чт мар 25, 2010 12:49:15, всего редактировалось 2 раза.
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

Кстати, сейчас решил в кои-то веки соптимизировать свою bin2bcd рутину - получилось чуть более компактно, правда в скорости выполнения выиграть не получилось, но и так вроде неплохо - максимум 90 тактов (для числа 0хС7 = 199):

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

сырой код удален по просьбам трудящихся
Последний раз редактировалось stas00n Чт мар 25, 2010 12:50:10, всего редактировалось 1 раз.
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

И модификация для преобразования 16 бит -> 5 десятичных разрядов; вход - r16,r17, выход - r18-r22. Максимум 217 тактов для числа 59999:

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

сырой код удален по просьбам трудящихся
Последний раз редактировалось stas00n Чт мар 25, 2010 12:50:51, всего редактировалось 1 раз.
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

P.P.S.: Немного протупил - ведь единицы в конце получаются сами собой, их считать не надо. Теперь преобразование выполняется за 51 и 179 тактов соответственно для 8- и 16-битного вариантов (для чисел 199 и 59999):

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

_bin2bcd:
	ldi		r17,255
	ldi		r18,255
_calc_hundreds:
	inc		r17
	subi	r16,100
	brbc	sreg_c,_calc_hundreds
	subi	r16,156
 _calc_tens:
	inc		r18
	subi	r16,10
	brbc	sreg_c,_calc_tens
	subi	r16,246
;	mov	r19,r16	;не обязательно, чисто для удобства просмотра в дебугере.
	ret

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

_bin2bcd16:
	
	ldi		r18,255
	ldi		r19,255
	ldi		r20,255
	ldi		r21,255
_calc_tens_of_thousands:
	inc		r18
	subi	r17,0x10
	sbci	r16,0x27
	brbc	sreg_c,_calc_tens_of_thousands
	subi	r17,0xF0
	sbci	r16,0xD8
_calc_thousands:
	inc		r19
	subi	r17,0xE8
	sbci	r16,0x03
	brbc	sreg_c,_calc_thousands
	subi	r17,0x18
	sbci	r16,0xFC
_calc_hundreds:
	inc		r20
	subi	r17,100
	sbci	r16,0
	brbc	sreg_c,_calc_hundreds
	subi	r17,0x9C
	sbci	r16,0xFF
 _calc_tens:
	inc		r21
	subi	r17,10
	brbc	sreg_c,_calc_tens
	subi	r17,246
	mov		r22,r17	;не обязательно, чисто для удобства просмотра в дебугере.
	ret
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

тематические ответы только в форуме, в приват не пишите
Закрыто

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