Страница 1 из 1
Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 11:13:19
alexey6522
У меня есть 3-х разрядный 7-ми сегментный индикатор, как подключать я знаю, а вот как им управлять не понимаю? Подключение такое, от индикатора сегменты A B C D E F G подключаю через резюки на 220 Ом к выводам сдвигового регистра 74HC595, можно и напрямую к контроллеру выводов в любом случае хватит! А вот выводы DIG.1 DIG.2 и DIG.3 цепляю на землю и когда на выводах контроллера формирую цифру, эта цифра зажигается на всех трех разрядах, допустим хочу вывести 1, а на индикаторе отображается 111
Я полагаю что выводы DIG.1 DIG.2 и DIG.3 нужно подключать ни к земле, а к контроллеру и при необходимости подавать лог. 1 или 0, при подачи 0 на соответствующий вывод зажигается нужный сегмент, а при подачи 1 он тухнет, но вопрос остается тот же! Если я захочу вывести 123, а все сегменты A B C D E F G всех трех разрядов запараллелены вывести это число не получится?
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 11:29:34
Леонид Иванович
Это называется динамическая индикация. На сегменты A B C D E F G выводите сначала цифру для первого разряда. Подаете на DIG.1 ноль. Горит первая цифра. Затем выключаете DIG.1 и на сегменты выводите цифру для второго разряда. Подаете на DIG.2 ноль. Горит вторая цифра. Затем третья. И так по кругу. При быстрой смене горящих цифр глаз видит все цифры как горящие. Частота сканирования индикатора должна быть не меньше 50 - 100 Гц, иначе будет заметно мерцание. Обычно для сканирования индикатора задействуют прерывание таймера.
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 11:35:09
dosikus
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 11:51:36
alexey6522
а разве если отключить DIG.1 значение не потухнет?
Я понял, там переключение идет на столько быстро, что глаз не успевает заметить мерцание, я прав?
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 17:05:27
Jack_A
alexey6522 писал(а):а разве если отключить DIG.1 значение не потухнет?
Я понял, там переключение идет на столько быстро, что глаз не успевает заметить мерцание, я прав?
В реале потухнет ( можно осциллом убеиться ), а для глаза - нет. Как правильно замечено, из-за инерционности нашего зрения.
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Сб сен 17, 2011 20:56:57
alexey6522
Собрал схему, МК тактируется от внутреннего кварца 4МГц вижу как мерцает 0 потом что-то похожее на 1 с небольшим косяком и цифра 2 похожая на 8 недорисованную, в чем может быть дело? Все цифры искажаются схема верная, проверял в протеусе, за основу взял 9 сегментную индикацию, решил собрать.
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Вс сен 18, 2011 01:07:23
ChipKiller
alexey6522 писал(а):...Все цифры искажаются схема верная, проверял в протеусе...
... такая схема как раз нормально работать не будет. Непонятно к чему такая "экономия" выводов - самоцель для получения проблем?
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Вс сен 18, 2011 07:32:13
alexey6522
Автор этой статьи утверждает что в АОН используется такая схема
http://eldigi.ru/site/periphery/5.php
Схема должна работать и с таким кол-во выводов
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Вс сен 18, 2011 09:48:28
Леонид Иванович
ChipKiller писал(а):alexey6522 писал(а):...Все цифры искажаются схема верная, проверял в протеусе...
... такая схема как раз нормально работать не будет. Непонятно к чему такая "экономия" выводов - самоцель для получения проблем?
Почему работать не будет? Будет. Единственная проблема этой схемы - отсутствие токоограничительных резисторов в цепях сегментов индикатора. Их нужно добавить.
Другое дело, что начинать учиться нужно было с простого подключения индикатора к микроконтроллеру без сдвиговых регистров.
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Вс сен 18, 2011 10:56:12
ChipKiller
Ничегонеработает писал(а):Почему работать не будет? Будет.
...для человека, который спрашивает, что такое динамическая индикация - приведенная схема источник кучи ошибок (засветка сегментов и т.д.)
Ничегонеработает писал(а):Другое дело, что начинать учиться нужно было с простого подключения индикатора к микроконтроллеру без сдвиговых регистров.
... об этом и речь, тем более что схем на форуме полно
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Вт сен 20, 2011 20:56:30
alexey6522
На днях я разобрался как вывести число с помощью одного контроллера, двух сдвиговых регистров 74hc595, на 3 разрядный индикатор с общими сегментами ABCDEFG (думаю понятно что речь идет о динамической индикации), число выводится все в порядке, а что бы организовать посекундный счетчик возникла проблема
Код: Выделить всё
#define N0 (0x3F) //0
#define N1 (0x06) //1
#define N2 (0x5B) //2
#define N3 (0x4F) //3
#define N4 (0x66) //4
#define N5 (0x6D) //5
#define N6 (0x7D) //6
#define N7 (0x07) //7
#define N8 (0x7F) //8
#define N9 (0x6F) //9
#define N10 (0x40) //-
#define N11 (0xFF) // пробел
unsigned char indikator[12]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11};
#define bytes 3
volatile unsigned char cMas[2][bytes]; //значение\разряд
void fnOutByte(unsigned int cByte) //вывод байта на регистр
{
unsigned char mask =0x80; //не менять!!!!
do {
if(mask & cByte)
{
PORTD|=_BV(PD6);
}
else
{
PORTD&=~_BV(PD6);
}
PORTD|=_BV(PD5); //Импульс на SH_CP (запись)
PORTD&=~_BV(PD5);
mask>>=1;
}
while(mask);
}
void ShowDigit(void)
{
unsigned char i;
unsigned char j;
for (j=0; j<3; j++){
for (i=0; i<2; i++)
{
fnOutByte(cMas[i][j]);
}
PORTD|=_BV(PD7); //Импульс на ST_CP (защелка - вывод на индикатор записанных данных)
PORTD&=~_BV(PD7);
}
}
#define D0 (0x7B) //DIG.1
#define D1 (0x7D) //DIG.2
#define D2 (0x7E) //DIG.3
#define D3 (0x00) //DIG.ALL
unsigned char DIG[4]={D0, D1, D2, D3};
int main(void)
{
unsigned char i;
unsigned char ch=0;
//настраиваем порты ввода-вывода
PORTD=0x00;//Первоначально устанавливаем на всех выходах 0
DDRD=0xff; //установить PD0-PD7 как выходы
cMas[0][0]=indikator[5];
cMas[0][1]=indikator[9];
cMas[0][2]=indikator[5];
cMas[1][2]=DIG[0];
cMas[1][1]=DIG[1];
cMas[1][0]=DIG[2];
//-----------------------------
while(1)//Бесконечный цикл
{
ShowDigit();
//cMas[0][2]=indikator[ch++];
//if (ch > 9) ch=0;
}
}
Выводим просто число, пока без счетчика, если уберем "//" в последних 2-х строках, пойдет счет десятичного разряда но что бы увидеть это, нужно добавить еще задержку, но тогда я увижу бегущие разряды, они будут моргать как гирлянда
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Ср сен 21, 2011 09:31:06
ChipKiller
alexey6522 писал(а):На днях я разобрался как вывести число.......
... тогда пора разобраться с прерываниями (в данном случае подойдет переполнение счетчика) и делать вывод на индикатор именно там.
Re: Вопрос по 3-х разрядному 7-ми сегментному индикатору
Добавлено: Ср сен 21, 2011 16:43:23
alexey6522
Вот рабочий пример, тестировал в реале, оцените мою работу, знаю что написано через одно место, но зато делал сам. Конечно можно было поставить sei() и сделать прерывание, но почему-то сделал по своему. Счетчик
число 2000 взял наугад, как подсчитать ровно 1 сек. не знаю, может кто подскажет?!
Код: Выделить всё
#define N0 (0x3F) //0
#define N1 (0x06) //1
#define N2 (0x5B) //2
#define N3 (0x4F) //3
#define N4 (0x66) //4
#define N5 (0x6D) //5
#define N6 (0x7D) //6
#define N7 (0x07) //7
#define N8 (0x7F) //8
#define N9 (0x6F) //9
#define N10 (0x40) //-
#define N11 (0xFF) // пробел
unsigned char indikator[12]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11};
#define bytes 3
volatile unsigned char cMas[2][bytes]; //значение\разряд
void fnOutByte(unsigned int cByte) //вывод байта на регистр
{
unsigned char mask =0x80; //не менять!!!!
do {
if(mask & cByte)
{
PORTD|=_BV(PD6);
}
else
{
PORTD&=~_BV(PD6);
}
PORTD|=_BV(PD5); //Импульс на SH_CP (запись)
PORTD&=~_BV(PD5);
mask>>=1;
}
while(mask);
}
void ShowDigit(void)
{
unsigned char i;
unsigned char j;
for (j=0; j<3; j++){
for (i=0; i<2; i++)
{
fnOutByte(cMas[i][j]);
}
PORTD|=_BV(PD7); //Импульс на ST_CP (защелка - вывод на индикатор записанных данных)
PORTD&=~_BV(PD7);
}
}
#define D0 (0x7B) //DIG.1
#define D1 (0x7D) //DIG.2
#define D2 (0x7E) //DIG.3
unsigned char DIG[4]={D0, D1, D2};
int main(void)
{
unsigned int i=0;
unsigned char ch1=0;
unsigned char ch2=0;
unsigned char ch3=0;
//настраиваем порты ввода-вывода
PORTD=0x00;//Первоначально устанавливаем на всех выходах 0
DDRD=0xff; //установить PD0-PD7 как выходы
cMas[0][0]=indikator[0];
cMas[0][1]=indikator[0];
cMas[0][2]=indikator[0];
cMas[1][2]=DIG[0];
cMas[1][1]=DIG[1];
cMas[1][0]=DIG[2];
//-----------------------------
while(1)//Бесконечный цикл
{
while(i++<500){
ShowDigit();
}
i=0;
ch1++;
if (ch1 > 9){
ch1=0;
ch2++;
if(ch2 > 9){
ch2=0;
ch3++;
if(ch3 > 9) ch3=0;
}
}
cMas[0][2]=indikator[ch1];
cMas[0][1]=indikator[ch2];
cMas[0][0]=indikator[ch3];
}
}