Вопрос по 3-х разрядному 7-ми сегментному индикатору

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение 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 всех трех разрядов запараллелены вывести это число не получится?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Это называется динамическая индикация. На сегменты A B C D E F G выводите сначала цифру для первого разряда. Подаете на DIG.1 ноль. Горит первая цифра. Затем выключаете DIG.1 и на сегменты выводите цифру для второго разряда. Подаете на DIG.2 ноль. Горит вторая цифра. Затем третья. И так по кругу. При быстрой смене горящих цифр глаз видит все цифры как горящие. Частота сканирования индикатора должна быть не меньше 50 - 100 Гц, иначе будет заметно мерцание. Обычно для сканирования индикатора задействуют прерывание таймера.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

alexey6522, изучите основы http://arv.radioliga.com/content/view/172/49/
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение alexey6522 »

а разве если отключить DIG.1 значение не потухнет?
Я понял, там переключение идет на столько быстро, что глаз не успевает заметить мерцание, я прав?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

alexey6522 писал(а):а разве если отключить DIG.1 значение не потухнет?
Я понял, там переключение идет на столько быстро, что глаз не успевает заметить мерцание, я прав?
В реале потухнет ( можно осциллом убеиться ), а для глаза - нет. Как правильно замечено, из-за инерционности нашего зрения.
Реклама
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение alexey6522 »

Собрал схему, МК тактируется от внутреннего кварца 4МГц вижу как мерцает 0 потом что-то похожее на 1 с небольшим косяком и цифра 2 похожая на 8 недорисованную, в чем может быть дело? Все цифры искажаются схема верная, проверял в протеусе, за основу взял 9 сегментную индикацию, решил собрать.
Вложения
Безымянный.JPG
(61.12 КБ) 863 скачивания
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

alexey6522 писал(а):...Все цифры искажаются схема верная, проверял в протеусе...
... такая схема как раз нормально работать не будет. Непонятно к чему такая "экономия" выводов - самоцель для получения проблем?
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение alexey6522 »

Автор этой статьи утверждает что в АОН используется такая схема http://eldigi.ru/site/periphery/5.php
Схема должна работать и с таким кол-во выводов
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

ChipKiller писал(а):
alexey6522 писал(а):...Все цифры искажаются схема верная, проверял в протеусе...
... такая схема как раз нормально работать не будет. Непонятно к чему такая "экономия" выводов - самоцель для получения проблем?
Почему работать не будет? Будет. Единственная проблема этой схемы - отсутствие токоограничительных резисторов в цепях сегментов индикатора. Их нужно добавить.

Другое дело, что начинать учиться нужно было с простого подключения индикатора к микроконтроллеру без сдвиговых регистров.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Ничегонеработает писал(а):Почему работать не будет? Будет.
...для человека, который спрашивает, что такое динамическая индикация - приведенная схема источник кучи ошибок (засветка сегментов и т.д.)
Ничегонеработает писал(а):Другое дело, что начинать учиться нужно было с простого подключения индикатора к микроконтроллеру без сдвиговых регистров.
... об этом и речь, тем более что схем на форуме полно
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение 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-х строках, пойдет счет десятичного разряда но что бы увидеть это, нужно добавить еще задержку, но тогда я увижу бегущие разряды, они будут моргать как гирлянда
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

alexey6522 писал(а):На днях я разобрался как вывести число.......
... тогда пора разобраться с прерываниями (в данном случае подойдет переполнение счетчика) и делать вывод на индикатор именно там.
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Сообщение alexey6522 »

Вот рабочий пример, тестировал в реале, оцените мою работу, знаю что написано через одно место, но зато делал сам. Конечно можно было поставить sei() и сделать прерывание, но почему-то сделал по своему. Счетчик

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

 while(i++<2000 
число 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];	    
}
}
Закрыто

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