Главная » Микроконтроллеры
Призовой фонд
на март 2017 г.
1. UNI-T UT-39C
Паяльник
2. Тестер компонентов LCR-T4
Паяльник
3. 100 руб.
От пользователей

Динамическая индикация на светодиодных 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 Поиск в FivelВ блокнот
H1 Индикатор4х7 FIQ-3641A1 Поиск в FivelВ блокнот
Q1-Q4 Биполярный транзистор
КТ361Е
4 Поиск в FivelВ блокнот
C3 Конденсатор22 нФ1 Поиск в FivelВ блокнот
R1-R7, R14 Резистор
150 Ом
8 Поиск в FivelВ блокнот
R8 Резистор
39 кОм
1 Поиск в FivelВ блокнот
R9 Резистор
1 кОм
1 Поиск в FivelВ блокнот
R10-R13, R15-R18 Резистор
6.2 кОм
8 Поиск в FivelВ блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

Опубликована: Изменена: 18.11.2013 0 2
Я собрал 0 Участие в конкурсе 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.9 Проголосовало: 1 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
NickF #
В общем решение проекта понравилось. Долго искал переменную регулирующую яркость, пока не нашел хитрый регистр PR2. К сожалению не годится для моего проекта на 676. Придется переделывать на 1 таймер и на последовательный вывод 7 сегментов в сдвиговый регистр. Так как лапок у 676 маловато.
Прикрепленный файл: 07.46.05.jpg
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Бокс для хранения компонентов ELM327 OBD II — адаптер с поддержкой CAN
вверх