Динамічна індикація на світлодіодних 7-сегментних індикаторах з програмним регулюванням яскравості

Для апаратури з батарейним живленням використання LCD-індикаторів, як правило, вважається більш переважним, ніж світлодіодних (LED) через великий струм споживання останніх. Даний постулат мені здається зовсім неочевидним з наступних причин: 1) у сучасних LCD-індикаторах існує підсвітка, яка споживає до 100 мА; 2) вони відносно крихкі і бояться прямих променів сонця; 3) сучасні LED-індикатори (особливо superRED і ultraRED) мають достатню яскравість навіть при струмі в 1 мА через них, і при оперативній регулюванні яскравості в залежності від умов освітлення, середній струм споживання 4-розрядного індикатора становить не більше 30 мА навіть на вулиці, що менше, ніж споживання підсвітки LCD.

Незважаючи на безліч в мережі схем з динамічною індикацією, схему з програмною регулюванням яскравості на PIC16 я не зустрічав. У даній статті показано мій скромний погляд на реалізацію такої задачі. Вона призначена, в основному, для радіолюбителів, що роблять перші кроки від повторення конструкцій до самостійного програмування мікроконтролерів.

У статті розглядається спосіб управління світлодіодною матрицею мікроконтролером PIC середнього сімейства, використовуючи переривання від таймерів TMR0 і TMR2. Таймер TMR2 використовується для ШИМ-регулювання середнього струму через включені сегменти. Алгоритм організації роботи наступний:

1. Ініціалізація. Налаштовуємо порти мікроконтролера відповідно до схеми підключення індикатора. Для таймерів 1 і 2 включається режим внутрішнього тактування з діленням, рівним 16. Дозволяються переривання від периферії.

2. Створюємо таблицю-знакогенератор для виводу на індикатор цифр і деяких (переважно латинських) букв і знаків.

3. Резервуємо дві чотирирозрядні змінні. В одну заносимо послідовно цифровий код (для цифр – просто цифру) необхідного для виводу знака відповідно до таблиці з п.2. В іншу змінну передаються перетворені значення з таблиці для постійного висвічування на індикаторі.

4. У перериванні від TMR0 послідовно висвічуються розряди знаків відповідно до таблиці. Перед зміною розрядів індикатор гаситься. У кожному перериванні висвічується один розряд. Після цього обнуляється таймер TMR2, скидається прапор переривання від TMR2 і дозволяються від нього переривання.

5. У перериванні від TMR2 гаситься індикатор і забороняється переривання від TMR2.

6. У основній програмі здійснюється регулювання періоду переривання від TMR2, а отже, часу включеного стану індикатора шляхом занесення в регістр PR2 чисел від 7 до 255 у десятковому численні за формулою X(n+1)=2*X(n)+1. Отримується шість градацій яскравості з різницею між ними в 2 рази. При PR2=255 тривалість максимальна (4мс з 4мс), при PR2=7 тривалість дорівнює приблизно 0.25мс.

Для демонстрації зазначеного принципу управління, нижче наводиться схема на недорогому PIC16F628A та тестова програма на Ассемблері, яка виводить на індикатор слово «test». При натисканні на кнопку, на індикаторі висвічується яскравість (умовно цифрами від 0 до 5). При наступних натисканнях, яскравість змінюється по колу і це відразу видно на індикаторі. Сразу хочу попередити початківців: моделювання схеми на симуляторі типу Proteus не дозволить побачити зміну яскравості через особливості цієї програми (Proteus). Макет схеми для перевірки і експериментів доведеться збирати в «залізі».   Втім, для спостереження власне за організацією динамічної індикації (окрім зміни яскравості) модель Proteus надається.

Споживання схеми при мінімальній яскравості менше 4 мА, при максимальній – близько 80 мА.

  

В архіві наведена тестова програма на Ассемблері MPASM.

Для спрощення схеми і звільнення «ног» для різних дій, застосована конфігурація з внутрішнім генератором і внутрішнім скиданням. При цьому, у тих, хто користується саморобним програматором без можливості подачі сигналу MCLR раніше Upp, можуть бути проблеми з подальшими верифікацією, читанням і стиранням. Тим, хто не впевнений у своєму програматорі, а також якщо потрібна висока стабільність генератора, можна встановити кварц 4 МГц за типовою схемою з вибором  в конфігурації “OSC_XT”. У випадку, якщо в кінцевій схемі потрібні переривання з виводу INT0 (RB0), комою можна управляти за допомогою виводу RA4, для індикатора з ОА індикатор до цього виводу підключається безпосередньо, незважаючи на те, що він відкритий. Звільнений вивід RB0 можна використовувати за призначенням. У програму, у перериванні від TMR0, в цьому випадку, додається після   “movwf   PORTB” код:

   andlw   b'00000001'
   bsf   PORTA,4   погасити кому   
   btfsc   STATUS,Z   враховуємо, що в W інверсне значення.
   bcf   PORTA,4   якщо 0-й біт = 0, зажигти кому   

Невеликі пояснення до програми:

Виводиме число поміщається в змінні OUT_ - OUT+3 відповідно до розряду, а з неї в підпрограмі out__ після перетворення поміщається в OUT_LED. Звісно, можна було б обійтися без змінної OUT_ і всюди для виводу писати:

   movlw   X
   call   Table_s
   movwf   OUT_LED

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

Те ж саме стосується і виводу коми через змінну comma_.

В підпрограмі-таблиці Table_s вжиті заходи для коректної роботи при поміщенні її в будь-яке місце пам'яті програм без обмежень на перетворення блоків 256 байт.

Змінна pause_ у перериванні від TMR0 використовується для задання тимчасових інтервалів 4 мс.

Інше, я думаю, зрозуміло з алгоритму і коментарів.

P.S. Для 2 або 3 розрядів у програмі потрібно внести мінімальні зміни, які, вважаю, по силам навіть для початківців. Для управління індикатором з кількістю розрядів від 5 до 8 необхідно або застосувати контролер з більшою кількістю виводів, або ж для управління розрядами використати дешифратор 3 на 8.

У першому випадку зміни в програмі також мінімальні (використання замість порту А іншого порту і т.д.). У випадку застосування дешифратора програма в частині переривання від TMR0 зміниться досить серйозно.

Список радіоелементів

Обозначення Тип Номінал Кількість Примітка
U1 МК PIC 8-біт
PIC16F628A
1
H1 Індикатор 4х7 FIQ-3641A 1
Q1-Q4 Біполярний транзистор
КТ361Е
4
C3 Конденсатор 22 нФ 1
R1-R7, R14 Резистор
150 Ом
8
R8 Резистор
39 кОм
1
R9 Резистор
1 кОм
1
R10-R13, R15-R18 Резистор
6.2 кОм
8
Додати все

Прикреплені файли:

Top