В свое время за "базовый переход" меня препод чуть с зачета не попер. Открою страшную тайну: у биполярного транзистора нет базового перехода! Есть эмиттерный ( эмиттер-база) и соответственно коллекторный ( коллектор-база). Но это так, семечки.diim писал(а):Падение напряжения на базовом переходе транзистора ...
управление семисегментными индикаторами
Re: управление семисегментными индикаторами
- Реклама
Re: управление семисегментными индикаторами
Здравствуйте, подскажите, пожалуйста, по семисегментным индикаторам. Имеется четырёхразрядный индикатор при круговом переключении разрядов возникает засветка текущего разряда значением предыдущего (засветка фоновая, тусклая, правильное значение при этом горит ярко). Из-за чего может возникать подобное явление? Подобное не наблюдается только при очень медленном переключении, таком что визуально видно как тухнет один разряд и зажигается следующий.
Re: управление семисегментными индикаторами
Телепатический модуль находится в ремонте - перегрелся после предыдущего использования. Может, хоть, схемку приведете?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: управление семисегментными индикаторами
2Серёга_:
1. текущий семисегментник выбирается слишкт рано;
2.сами индикаторы переключаются поздно.
По идее делать так:
1.тушить индиктор
2. выбрать нужный сегмент
3.вывести инфу н индикатор.
1. текущий семисегментник выбирается слишкт рано;
2.сами индикаторы переключаются поздно.
По идее делать так:
1.тушить индиктор
2. выбрать нужный сегмент
3.вывести инфу н индикатор.
Docendo discimus
Re: управление семисегментными индикаторами
На фотке видно проблему: отображается число 14, но на фоне 1 - 4, а на фоне 4 - 0. В качестве ключа использую транзистор 2N5551, на базе 1 кОм, номинал резистора, ограничивающего ток через сегмент индикатора - 530 Ом.
- Вложения
-
- Копия P1030818.JPG
- (27.76 КБ) 908 скачиваний
- Реклама
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 - порты управляюющие разрядами.
Получается всегда сначала происходит отключение портов, а потом включение заданного.
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 - порты управляюющие разрядами.
Получается всегда сначала происходит отключение портов, а потом включение заданного.
Re: управление семисегментными индикаторами
Может проблема связана с частотой переключения разрядов?
Re: управление семисегментными индикаторами
Надо программу смотреть в купе с выводом на сегменты, что вы не показали. ваша подпрограмма set_segment при вызове должна погасить ВСЕ разряды, потом выдать инфо на сегменты и только тогда активизировать нужный разряд.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: управление семисегментными индикаторами
О, установил в правильный порядок включение разрядов с заданием значения сегмента и фон исчёз. Спасибо большое!
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; //инвертирование флага точки
}
}
В чём может быть причина или это нормально что он немного мерцает?
Алгоритм следующий:
работает два таймера: один обновляет диспелей, а второй считает время, после определённого количества прерываний таймера времени устанавливается флаг, зажигающий точку.
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; //инвертирование флага точки
}
}
В чём может быть причина или это нормально что он немного мерцает?
Re: управление семисегментными индикаторами
Изменение частоты обновления дисплея на результат не влияет.
Re: управление семисегментными индикаторами
Код: Выделить всё
PORTC&=~(1<<DISP_OUT3);//вывод управляющий точкойА люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: управление семисегментными индикаторами
DISP_OUT3 - это пин PC0, который включает/выключает точку на дисплее. Для функций я привел краткое описание в комментариях. Сейчас выложу их код (не стал выкладывать весь текст программы полностью потому, что это большая простыня. которую вряд ли кто-то стал бы читать).
Более точная формулировка проблемы: когда включена точка - число, выводмое на разряд сегмента горит тускло, а когда точка выключается - разряд опять горит ярко. Справедливо это для задержки точки на экране на любое время. То есть, если точка горит 2 секунды, а две секунды не горит, то и число в этом разряде соответственно 2 секунды горит тускло, а 2 секунды горит ярко.
Более точная формулировка проблемы: когда включена точка - число, выводмое на разряд сегмента горит тускло, а когда точка выключается - разряд опять горит ярко. Справедливо это для задержки точки на экране на любое время. То есть, если точка горит 2 секунды, а две секунды не горит, то и число в этом разряде соответственно 2 секунды горит тускло, а 2 секунды горит ярко.
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);
}
}
#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);
}
}
Re: управление семисегментными индикаторами
по приведенным листингам криминала не видно. возможно, у вас аппаратная проблема. Осциллографом проверить сигналы не пробовали? кстати, напомните, что за микроконтроллер...
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: управление семисегментными индикаторами
микроконтроллер ATmega8. Осциллографом смотреть сигнал не пробовал, да и вряд ли получится в виду отсутствия оного. Попробую помигать не точкой, а одним из сегментов.
Re: управление семисегментными индикаторами
Провел эксперимент: если мигать не точкой, а нижним сегментом нуля, наблюдается тот же эффект. Может это связано в ключами?
Re: управление семисегментными индикаторами
Кажется нашёл где собака зарыта. Каждый сегмент индикатора подключен к выводу микроконтроллера через ограничивающий резистор номиналом 530 Ом, и, следовательно, зажигая точку (подключая дополнительный резистор), мы тем самым увеличиваем общее сопротивление сегмента, а значит ток через него протекает меньший (поэтому и светится число не так ярко). Естественно напрашивается вопрос - как с этим бороться?
Re: управление семисегментными индикаторами
чевой-та вы не того пишете. вы ж писали, что вместо точки пытались включать сегмент D и тоже притухало... короч, пока нет полного и подробного описания, что вы пытаетесь наворотить - просто гадание на кофейной гуще получается. Попробуйте хотя бы для себя составить внятное описанин - иногда тоже помогает найти ошибку.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: управление семисегментными индикаторами
Всё правильно пишу, вместо точки в третьем разряде, включаю/выключаю нижнюю планку числа в том же третьем разряде


