Подключение для динамическое отображения 7-сегм. индикатора

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 7
Зарегистрирован: Сб янв 24, 2009 04:12:55

Сообщение Virto »

В обучалке (http://radiokot.ru/start/mcu_fpga/avr/15/) в самом начале показана схема индикатора с общим катодом и анодом, т.е. плюс и минус (я самый начинающий катод/анод уже много лет немогу запомнить что из них что). На следующей анимации тоже всё ясно, сегменты управляются допустим плюсом, а разряды минусом. Но на 3-м рисунке к индикатору подведены все контакты от МК, т.е. все плюсы.
В этом и вопрос как светодиоды светятся только от плюсов?

(я уже купил индикатор 3-хсегментный GNT-5631AG с общим катодом, вот задача как подсоединить его к atmega16, думаю надо три транзистора n-p-n ставить для управления разрядами)
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Может я что-то не понимаю, но мне этот пример показался бестолковым, извините если кого обидел! Попробую обосновать по чему я так считаю. Допусти мне надо вывести число 12, но у меня это не получилось. Почему?! Посмотрите на картинке.
Если я не прав то поправьте меня. Ещё раз искренни прошу прощения, если кого-то обидел!
Вложения
1.jpg
(5.49 КБ) 611 скачиваний
Реклама
Модератор
Аватара пользователя
Сообщения: 10740
Зарегистрирован: Пн июл 07, 2008 10:46:09
Откуда: Россия

Сообщение Света »

Virto писал(а):... на 3-м рисунке к индикатору подведены все контакты от МК, т.е. все плюсы.
Это ошибочное утверждение. Выходы МК, да и выходы других цифровых микросхем не являются "плюсами". Это цифровые выходы.
На таком выходе в разное время может присутствовать или единица (плюс питания) или ноль (корпус, минус питания). То есть на выходе стоит ключ, который коммутирует вывод выхода или к + или к - питания в зависимости от предыдущей схемы управления.
А в МК этой схемой управляет программа в которой можно учесть когда и в какой момент времени нужные выходы подключить к нужному напряжению.
Если хотите, чтобы жизнь улыбалась вам, подарите ей своё хорошее настроение
Родился
Сообщения: 7
Зарегистрирован: Сб янв 24, 2009 04:12:55

Сообщение Virto »

Прилагаю схему.
Допустим с прошивкой всё в порядке. Питание 5 вольт.

На рис.2 распиновка 3х сегментного индикатора с общим катодом (минусом)

На рис.1: катод первого разряда идет на землю (минус); второго и третьего разряда на порт "D" (PD0, PD1).
МК выдает на ножки либо ноль либо единицу т.е. ноль вольт или 5 вольт. В итоге работает только 1й разряд (на землю), остальные независимо 1 или 0 на PD не горят, т.е. это равносильно подключению на рис.3.

Вопрос: как подключить именно этот индикатор.
Вложения
Mega_7segInd.gif
Рис. 1/2/3
(26.08 КБ) 637 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 7
Зарегистрирован: Сб янв 24, 2009 04:12:55

Сообщение Virto »

Sounds писал(а):... Допусти мне надо вывести число 12, но у меня это не получилось. Почему?! ...
У Вас просто неправильно определена двойка: 0x5А (0b01011111), а должно быть 5B (0b01011011). Т.е. на сегмент "C" подается ноль.
Реклама
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Virto писал(а):Прилагаю схему.
Допустим с прошивкой всё в порядке.
...

Видимо это неверное допущение, схема более-менее рабочая только общий вывод первого разряда индикатора не надо на землю сажать, иначе в реальности (вы ведь динамическую индикацию делаете) будет ерунду отображать, луще подключите его к еще одному выводу порта Д. А вообще для обеспечения нормальной яркости я бы транзисторные ключи использовал для управления общими электродами индикаторов.
Реклама
Родился
Сообщения: 7
Зарегистрирован: Сб янв 24, 2009 04:12:55

Сообщение Virto »

Вот пример кода:

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

#define F_CPU 1000000
#include <avr>
#include <util>

int main()
{ unsigned char numlook[16] = {	// Биты для индикатора 0..F
 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111,
 0b01111111, 0b01101111, 0b01110111, 0b01111100, 0b00111001, 0b01011110, 0b01111001, 0b01110001};

 DDRC = 0xFF; 			// C - Вывод сегментов
 DDRD = 0b00000111;		// D - первые 3 бита для 3-х разрядов

unsigned char n; 
 n = 7;					// Семерку выведем на все сегменты

 for (;;){		
	PORTC = numlook[n];
	
	PORTD = 1;			// 3й сегмент
	_delay_ms(300);

	PORTD = 2;			// 2й сегмент
	_delay_ms(300);

	PORTD = 4;			// 1й сегмент (не будет т.к. он на земле в этом примере)
	_delay_ms(300);	
 }
}
И вот что выходит в итоге. (см. прикреплённый GIF). 1й сегмент специально на землю кинул чтобы было видно что работает только так.

Этот индикатор и есть обычный светодиод. Так в примере "Hello World" анод на МК идет, а катод на землю, тогда объясните почему на индикаторе и катод и анод предлагаете подсоеденить к МК?
Вложения
Anim.gif
Proteus ISIS animation
(13.04 КБ) 444 скачивания
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25

Сообщение shtorm »

ИМХО тебе нужно POTRD не 1 а в 0 выставлять.(если у тебя общий катод)

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

PORTD = 0b00000110;         // 3й сегмент 
          _delay_ms(300);
          PORTD = 0b00000101;         // 2й сегмент 
         _delay_ms(300);
Вложения
Безымянный.JPG
(43.39 КБ) 538 скачиваний
Контактная информация:
Родился
Сообщения: 7
Зарегистрирован: Сб янв 24, 2009 04:12:55

Сообщение Virto »

Всем спасибо - разобрался детально благодаря Свете и Шторму.
Управляя нулём мы подаём землю на анод.
Закрыто

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