управление семисегментными индикаторами

Обсуждаем цифровые устройства...
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: управление семисегментными индикаторами

Сообщение Jack_A »

diim писал(а):Падение напряжения на базовом переходе транзистора ...


В свое время за "базовый переход" меня препод чуть с зачета не попер. Открою страшную тайну: у биполярного транзистора нет базового перехода! Есть эмиттерный ( эмиттер-база) и соответственно коллекторный ( коллектор-база). Но это так, семечки.
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Здравствуйте, подскажите, пожалуйста, по семисегментным индикаторам. Имеется четырёхразрядный индикатор при круговом переключении разрядов возникает засветка текущего разряда значением предыдущего (засветка фоновая, тусклая, правильное значение при этом горит ярко). Из-за чего может возникать подобное явление? Подобное не наблюдается только при очень медленном переключении, таком что визуально видно как тухнет один разряд и зажигается следующий.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: управление семисегментными индикаторами

Сообщение uldemir »

Телепатический модуль находится в ремонте - перегрелся после предыдущего использования. Может, хоть, схемку приведете?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: управление семисегментными индикаторами

Сообщение pyzhman »

2Серёга_:
1. текущий семисегментник выбирается слишкт рано;
2.сами индикаторы переключаются поздно.
По идее делать так:
1.тушить индиктор
2. выбрать нужный сегмент
3.вывести инфу н индикатор.
Docendo discimus
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

На фотке видно проблему: отображается число 14, но на фоне 1 - 4, а на фоне 4 - 0. В качестве ключа использую транзистор 2N5551, на базе 1 кОм, номинал резистора, ограничивающего ток через сегмент индикатора - 530 Ом.
Вложения
Копия P1030818.JPG
(27.76 КБ) 908 скачиваний
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

pyzh_man, вроде так и делаю, вот кусок прошивки:

ISR(TIMER0_OVF_vect)
{
i++;
if(i>4)
i=1;
if(i==1)
set_segment(i, firstnum);
if(i==2)
set_segment(i, secondnum);
if(i==3)
set_segment(i, thirdnum);
if(i==4)
set_segment(i, fourthnum);
TCNT0 = 253; // = 10M*2/1024
}// код обработки прерываний таймера, обновляющего дисплей, первый параметр функции set_segment задаёт номер разряда, а второй - выводимое число.

Кусок описания функции set_segment:

void set_segment(int position, int number){

if (position == 4) {
PORTD&=~((1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3));
PORTD|=(1<<PD3);
}


PD0, 1, 2, 3 - порты управляюющие разрядами.
Получается всегда сначала происходит отключение портов, а потом включение заданного.
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Может проблема связана с частотой переключения разрядов?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: управление семисегментными индикаторами

Сообщение uldemir »

Надо программу смотреть в купе с выводом на сегменты, что вы не показали. ваша подпрограмма set_segment при вызове должна погасить ВСЕ разряды, потом выдать инфо на сегменты и только тогда активизировать нужный разряд.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

О, установил в правильный порядок включение разрядов с заданием значения сегмента и фон исчёз. Спасибо большое!
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

ПОдскажите, пожалуйста, добавил мигание точки к одному из разрядов, и в результате цифра начала мерцать вместе с точкой (именно мерцать - не мигать), соседние разряды, которые без точки не мерцают.
Алгоритм следующий:
работает два таймера: один обновляет диспелей, а второй считает время, после определённого количества прерываний таймера времени устанавливается флаг, зажигающий точку.


SR(TIMER0_OVF_vect)//Прерывание таймера Т0 обновляющее дисплей
{
clearDisplay();//функция гасящая дисплей

PORTC&=~(1<<DISP_OUT3);//вывод управляющий точкой

i++;//переключение разрядов
if(i>4)
i=1;

if(i==1){
set_segment(firstnum);//функция формирующая число из сегментов дисплея
}

if(i==2){
set_segment(secondnum);
}

if(i==3){
set_segment(thirdnum);
if(setDot) { // зажигание точки
PORTC|=(1<<DISP_OUT3);
}
}

if(i==4){
set_segment(fourthnum);
}

setDisplay(i); //включение разряда
TCNT0 = 253;
}



ISR(TIMER2_OVF_vect)//Прерывания таймера Т2 считающего время
{
Seconds++;
if(Seconds==4)
{
Seconds = 0;
setDot ^= 1; //инвертирование флага точки
}
}

В чём может быть причина или это нормально что он немного мерцает?
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Изменение частоты обновления дисплея на результат не влияет.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: управление семисегментными индикаторами

Сообщение uldemir »

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

PORTC&=~(1<<DISP_OUT3);//вывод управляющий точкой

Что по вашему делает эта строчка? Ну и как обычно телепатический модуль по выходным не работает и не может определить, что у вас написано в подпрограммах.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

DISP_OUT3 - это пин PC0, который включает/выключает точку на дисплее. Для функций я привел краткое описание в комментариях. Сейчас выложу их код (не стал выкладывать весь текст программы полностью потому, что это большая простыня. которую вряд ли кто-то стал бы читать).

Более точная формулировка проблемы: когда включена точка - число, выводмое на разряд сегмента горит тускло, а когда точка выключается - разряд опять горит ярко. Справедливо это для задержки точки на экране на любое время. То есть, если точка горит 2 секунды, а две секунды не горит, то и число в этом разряде соответственно 2 секунды горит тускло, а 2 секунды горит ярко.
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Продолжение программы:

#define DISP_OUT1 PB4
#define DISP_OUT2 PB5
#define DISP_OUT3 PC0
...

//выключение всех разрядов дисплея (очистка дисплея)
void clearDisplay(void){
PORTD&=~((1<<DISP_OUT6)|(1<<DISP_OUT8)|(1<<DISP_OUT9)|(1<<DISP_OUT12));
}

//формирование числа, выводимого на экран
void set_segment(int number){

if (number == 0) {
PORTC&=~(1<<DISP_OUT5);
PORTC|=(1<<DISP_OUT11)|(1<<DISP_OUT10)|(1<<DISP_OUT7)|(1<<DISP_OUT4);
PORTB|=(1<<DISP_OUT1)|(1<<DISP_OUT2);
}
...
//и так ещё для 9 чисел
}

//функция включающая разряд индикатора
void setDisplay(int position){

if (position == 4) {
PORTD|=(1<<DISP_OUT12);
}
if (position == 3) {
PORTD|=(1<<DISP_OUT9);
}
if (position == 2) {
PORTD|=(1<<DISP_OUT8);
}
if (position == 1) {
PORTD|=(1<<DISP_OUT6);
}
}
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: управление семисегментными индикаторами

Сообщение uldemir »

по приведенным листингам криминала не видно. возможно, у вас аппаратная проблема. Осциллографом проверить сигналы не пробовали? кстати, напомните, что за микроконтроллер...
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

микроконтроллер ATmega8. Осциллографом смотреть сигнал не пробовал, да и вряд ли получится в виду отсутствия оного. Попробую помигать не точкой, а одним из сегментов.
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Провел эксперимент: если мигать не точкой, а нижним сегментом нуля, наблюдается тот же эффект. Может это связано в ключами?
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Кажется нашёл где собака зарыта. Каждый сегмент индикатора подключен к выводу микроконтроллера через ограничивающий резистор номиналом 530 Ом, и, следовательно, зажигая точку (подключая дополнительный резистор), мы тем самым увеличиваем общее сопротивление сегмента, а значит ток через него протекает меньший (поэтому и светится число не так ярко). Естественно напрашивается вопрос - как с этим бороться?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: управление семисегментными индикаторами

Сообщение uldemir »

чевой-та вы не того пишете. вы ж писали, что вместо точки пытались включать сегмент D и тоже притухало... короч, пока нет полного и подробного описания, что вы пытаетесь наворотить - просто гадание на кофейной гуще получается. Попробуйте хотя бы для себя составить внятное описанин - иногда тоже помогает найти ошибку.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Серёга_
Открыл глаза
Сообщения: 40
Зарегистрирован: Пт фев 15, 2008 23:08:25

Re: управление семисегментными индикаторами

Сообщение Серёга_ »

Всё правильно пишу, вместо точки в третьем разряде, включаю/выключаю нижнюю планку числа в том же третьем разряде
Ответить

Вернуться в «Цифровая техника»