Семи сегментний індикатор і avr

Для відображення букв використовуються більш складні багато сегментні і матричні індикатори. Але тут мова піде про семи сегментних. Також розглянемо динамічну індикацію. як спосіб миттєвого відображення вимірюваної величини. Для цього в програмі розглянемо використання переривань.

Отже слід знати, що індикатори бувають із загальним анодом і катодом як на малюнку нижче. У мене під руками був індикатор із загальним катодом (нижня частина малюнка), керуючий висновок якого підключають до мінуса. Ось з ним ми і будемо працювати.

Семи сегментний індикатор і avr
Якщо індикаторів кілька, отже і управляються катоди декількома ніжками МК. Але завжди використовуйте транзистори, тому що порти введення-виведення можуть згоріти через відносно великого струму. Я використовував звичайні 315 транзистори. На малюнку нижче я відобразив зразкову підключення, через них, керуючого виведення індикатора і контролера. Для монтажу нам буде потрібно 11 ніжок мікроконтролера, тобто для відображення інформації на сегментах 8 ніжок (7 + точка) і по одній ніжки на кожен індикатор для його управління, у мене їх три, тому і ніжки управління теж три. Нижче я навів і описав програму. Для управління сегментами будемо використовувати Піни одного порту, що б не плутатися. Писав під мікроконтроллерATmega8. Якщо Ви хочете відв'язатися від "каменю" то це не проблема, наприклад в статті №21 я розбив код на бібліотеки, де без проблем можна змінити налаштування під інший "камінь", в основному це номера пинов і портів. Там же описані загальні правила універсальності і перенесення.

Малюнок підключення транзистора до МК і індикатору.

Перейдемо до програми. У цій невеликій програмі (на Сі) я навів приклад включення трьох елементів індикатора і висновок числа з комою. Використання таймера і переривання для виведення на індикатор. В ході написання програми ми повинні визначитися який пін порту повинен відповідати сегменту на індикаторі. Сам елемент індикатора приведений на малюнку нижче. Збоку опис підключення висновків до сегментів елемента індикатора (пін порту - номер ніжки елемента (рис. Вище) - буква сегмента - число в масиві, що відповідає за включення сегментів на елементі).

Семи сегментний індикатор і avr

PB0 - 12 - керування першим елементом

#include
#include
#include
/ * Визначимо кожному піну порту елемент семи сегментніка (ріунок вище) * /
Display (i);
> / * Закриває дужка нескінченного циклу * /
> / * Закриває дужка основної програми * /

Наступним кроком ми додамо функцію переривання, яка буде спрацьовувати за спеціальним вектору TIMER0_OVF_vect. який відповідає за переривання по переповнення Т0. Для цього ми використовуємо апаратний таймер / лічильник Т 0. Вище, в програмі ми з Вами прописали настройки таймера, там же порахували частоту, з якою буде відбуватися динамічна індикація. Тобто коли переповнюється регістр рахунки в лічильнику. зупиняється загальна програма і виконується функція нижче, після виходу з неї пролжается виконання основної програми.

ISR (TIMER0_OVF_vect)
<
PORTB = 0x3e; // Очищення PB7, PB6, PB0
_for (j = 0; j<=30; j++) <> // Затримка для виключення транзистора
(K == 3). k = 0. k ++; / * Змінна, яка відповідає за черговість загоряння Трьохелементний індикатора, 0,1 і 2. При певній цифрі, на певній ніжці усатнавлівается 1, далі відкривається транзистор і загоряється сегменти індикатора, відповідні змінної Elemn * /
switch (k)
<
case 0: PORTB | = (1 < PORTD = Elem3;
break;
case 1: PORTB | = (1 < PORTD = Elem2;
break;
case 2: PORTB | = (1 < PORTD = Elem1;
>
>

Вище наведена програма випробувана в залозі і в симуляторі. Нижче викладені малюнки відповідно. У залозі я все спаяв навісом, на швидку руку. Як бачите три елементи індикатора відповідно три транзистора (обведено кружечком). У симуляторі (Proteus) транзистори нам не потрібні. Так само одна істотна відмінність в програмі, а саме в перериванні, де відбувається з адержка для виключення транзистора - в симуляторі пропишіть 50 тактів. Все повинно працювати.

Семи сегментний індикатор і avr
Семи сегментний індикатор і avr

Нижче вихідні і проект по вище наведеним матеріалу.

На цьому все. У наступній статті я опишу підключення датчиків температури і виведемо інфорацію на індикатор. До скорої зустрічі!

/ * Ці макроси містять числа, відповідні двійці, яка була зведена в ступінь, рівний номеру «ніжки» того порту, до якого підключений сегмент індикатора содноіменним макросу назвою. * /

Для чого зводили в ступінь?

Вітаю! Ступінь - це число, номер Піна (ніжки). Пінів на порте у нас 8. Порт це байт, максимальне значення якого 256. Ось і виходить кожна ніжка це 2 в n-го ступеня (даного порту).

имхо не універсальна, доведеться бути прив'язаним до одного порту, і мало того до однієї послідовності ніг, при підключенні до індикатора купа перемичок буде.

Все це не для універсальності, а для поняття основ. Адже оптимізація і модифікація це завжди ускладнені схеми і програми. Люди які починають освоювати завжди шукають «основу». Проте спасибі за критику.

Я подивився як ось тут пояснюється програмування, а можна як небудь ось під це завдання зробити: написати програму для відображення положення перемикачів, підключених до одного з портів на світлодіодах підключених до іншого порту МК. На семисегментний індикаторі відобразити число перемикань? А то я мучуся і не можу збагнути, це для AVR ATmega16

Добрий день. Спробую відповісти, настільки наскільки я зрозумів. Перше - опитування положення перемикач, я так розумію або 0 або 1, просто опарашіваем стан PIN. Далі я так зрозумів світлодіоди візуально відображають становище перемикача, які підключені до іншого порту - просто в тілі умови активізуємо необхідну ногу контролера PORTN | = _BV (PNn) ;. для запалювання світлодіода, ну і прописуємо лічильник і виводимо на індикатор. От якось так.

а не могли б написати для асемблера саме ту ділянку де використовується цей семи сегментний індикатор? ну мені так щоб перевіритися

Привіт, нажаль з асемблером знаком на ВИ. Не було особливої ​​необхідності розвивати ці знання.

хто її вважає і змінює. Пробував її змінювати. Ефекту немає.

char volatile Elem1, Elem2, Elem3, Elem4 - тут мені не подобається volatile. З - за нього може бути проблеми і отбраженіе незрозумілих символів - адже воно говорить що значення змінних зміниться в будь-який час. Це не той випадок коли його треба ставити. Спробуйте покрутити настройки таймера - частоту TCCR0.

Ах да. Контролер АТmega88V-10PU