Таймер на семисегментном индикаторе
.docxТаймер на семисегментном индикаторе
Код схемы:
#include <io.h> #include <delay.h> static flash unsigned char digit[] = { (0b11000000), //0 (0b11111001), //1 (0b10100100), //2 (0b10110000), //3 (0b10011001), //4 (0b10010010), //5 (0b10000010), //6 (0b11111000), //7 (0b10000000), //8 (0b10010000) //9 }; static flash unsigned char razryad[] = { (1), //0 (2), //1 (4), //2 (8), //3 }; void main(void) { int i,j,k,m; PORTD=0x00; DDRD=0b11111111; PORTC=0xFF; DDRC=0b11111111; while (1) { for(i=0;i<10;i++) { for(k=0;k<10;k++) { m=k; for(j=0;j<50;j++) { PORTD=digit[i]; PORTC=razryad[2]; delay_ms(10); PORTD=digit[m]; PORTC=razryad[3]; delay_ms(10); } } } } }
"В реале" работает чётко, в Протеусе же с такой частотой обновления семисегментика реалтайм не получается.
Для аппаратуры с батарейным питанием применение 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 можно использовать по назначению. Однако, в исходном виде все гораздо проще и понятнее (поместил в 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 |
|
Скачать список элементов (PDF)
Основные параметры
Цвет |
Красный (GaAsP/GaP) |
λd,нм |
625 |
Дес. точка |
Справа |
Размер,мм |
50.3x19.0x8.1 |
IF (тип.),мА |
20 |
Высота символа,мм |
14.22 |
VF (тип.),В |
2 |
Цвет лицевой панели |
Серый |
Кол-во символов,шт |
4 |
IV,мКд |
от 1900 до 8000 |
Конфигурация |
Общий анод |
Общее описание
-
Высота символа 14.22мм (0.56 дюйма).
-
Малый ток потребления
-
Легко устанавливается на печатную плату или гнездо.
-
Превосходные характеристики.
-
Серый фон, белый сегмент.
-
I.C. совместимый
-
RoHS совместимый.