Регулировка яркости в часах на 7SEG индикаторах

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

я всё строю часы =)

что хочу сделать:

1. на семисегментных индикаторах и RTC 1302(у меня нет другого).

2. с авторегулировкой яркости.

3. будильник.

4. отключение будильника датчиком положения.

5. варианты отключения меняются случайным образом(быстрые потряхивания\ медленные\ количество этих самых потряхиваний).

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

вот, нашел вот такой код регулировки яркости и схема подключения индикатора(хотя из скетча и так всё понятно).

мож кому пригодится

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Код, кстати, кривоватенький.

Для начала следовало бы заменить циклы с NOP (длительность которых зависит от тактовой частоты) на delayMicroseconds().

А вот такие конструкции

        if ( p == HIGH ) { p = LOW; }
        else { p = HIGH; }

имеет смысл применять только в тех случаях, когда p может принимать более двух значений.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

спасибо за поправку.

работает скетч и правда, не очень. но лучшего не нашел.

a5021
Offline
Зарегистрирован: 07.07.2013

Код откровенно плохой. Синтез знаков делается не так. Яркостью лучше управлять шим-каналом. Тогда можно задавать даже разную яркость для разных разрядов. У меня в коде паялки все это есть.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

a5021, а можно взглянуть?

я примерно так (что ШИМ) и представлял: ОА(или ОК) подключать на те порты, которые с ШИМом. 

ОА можно напрямую к МК, а когда ОК - то через транзисторы.

 

a5021
Offline
Зарегистрирован: 07.07.2013

Глянуть можно. Все исходники есть в теме "Паяльная станция из ардуино", но не уверен, что они покажутся наглядными из-за накрученного там функционала.

Если бы на меге были четыре шим-канала на одном таймере, то идеальной схемой было бы подключить каждый из них к каждому из четрех разрядов индикатора. Имеется ввиду, к общему электроду для сегментов этого разряда. Но у меги такого раскошества нет и придется выкручиваться.

В принципе, можно обойтись и одним шим-каналом. Идея простая. Разрешаем прерывания таймера по переполнению счетчика и по совпадению (compare match) на шим-канале. В обработчике по переполнению "зажигаем" нужную цифру, а в обработчике по совпадению "гасим" ее. Таким образом цифра будет гореть только на протяжении, пока таймер не досчитает до совпадения. Когда случается следующее прерывания по переполнению, то зажигаем следующую цифру, а по совпадению гасим уже ее. И так для всех разрядов по кругу.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

так на АТМ328 вроде 4 ШИМ?

тему глянул... н-дя...

не разберусь :(

a5021
Offline
Зарегистрирован: 07.07.2013

karl2233 пишет:
на АТМ328 вроде 4 ШИМ?

Шесть. По два на каждом из трех таймеров. Задействовать два таймера, чтобы получить совокупно четыре канала для управления разрядами, лишает всю идею изящества и не лучшим образом расходует аппаратный ресурс. В этом случае проще программно одним каналом рулить всеми разрядами.

mihail32123
Offline
Зарегистрирован: 26.02.2013

andriano пишет:

А вот такие конструкции

        if ( p == HIGH ) { p = LOW; }
        else { p = HIGH; }

имеет смысл применять только в тех случаях, когда p может принимать более двух значений.

Чем предлагаете заменять?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mihail32123 пишет:

Чем предлагаете заменять?

Простым вычислением:

p = !p;

или

p ^=1;

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

так понимаю, что это вариант для управления одним ШИМ (а там ключ, который идёт на общий анод или катод)?

или я неверно понял?

mnashe
Offline
Зарегистрирован: 29.08.2016

В моём драйвере четырёх семисегментников не используется ШИМ вообще. Точнее, ШИМ задействован только для мигающего двоеточия (реализованного отдельной парой светодиодов 3528).

Разряды же управляются так:
8-битный таймер работает на тактовой частоте МК (я использовал PIC16F72, потому что он стоит всего 30 центов и у него 22 линии ввода-вывода), без предделителя. Это порядка 1,5 мГц.
Обработчик прерывания переполнения таймера инкрементирует счётчик. Если младшие 5 бит равны нулю, то переключается ключ, выбирая нужный разряд, и отображается соответствующий разряд, один из четырёх (6-й и 7-й бит счётчика указывают разряд), а если не равны, то значение сравнивается с переменной яркости для соответствующей цифры (опять же, биты 7..6 определяют, с какой из 4-х переменных сравнивать). В случае равенства изображение стирается.

Таким образом обеспечивается раздельная регулировка яркости для каждой из четырёх цифр в пределах от 1/32 до 31/32. Можно и 64 взять, но тогда частота сканирования будет низковата, периферийным взглядом можно заметить мерцание.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Можно ногами без ШИМ подавать VCC на каждый сегмент и один транзистор уже с ШИМ комутировать общую GND, и ресурсы свободны и плавное регулирование яркости есть!)

mnashe
Offline
Зарегистрирован: 29.08.2016

bodriy2014 пишет:
Можно ногами без ШИМ подавать VCC на каждый сегмент и один транзистор уже с ШИМ комутировать общую GND, и ресурсы свободны и плавное регулирование яркости есть!)
Ага. В одном из вариантов (собранном на отдельных четырёх одноразрядных дисплеях; разводку я уже нарисовал, но ещё не делал платы) я собираюсь использовать ШИМ подобным образом.

Точнее, там мне транзистор не нужен, поскольку в качестве светодиодного драйвера используются микросхемы сдвиговых регистров MBI5024, и ШИМ от МК (инвертированный) подаётся на вход !OE.

Но для задачи в этой теме нет смысла использовать аппаратный ШИМ, поскольку всё равно отображение динамическое (цифры приходится перебирать), а раз уж мы выводим цифры программно, то и стирать их есть смысл программно, каждую в своё время. Это удобно для режима настройки часов: вместо мерцающей цифры — выделение яркостью.