-Музыка

Чарлиплексирование и борьба с ним

Понедельник, 20 Июля 2015 г. 03:21 + в цитатник
Продолжаем серию схемотехнических решений для усложнения схемы. Сегодня речь пойдёт про чарлиплексинг, вернее про ДЕчарлиплексирование. Оно зачастую оправдано экономически, но мы же не железа экономии ради городим все эти усложнения =)
Года два назад мне достался древний ксерокс Canon, который корейский сосед (да да, тот самый, отпизженный шесть лет назад) таки попытался выбросить. Был безжалостно разобран и добыта комплектуха, в т.ч. семисегментный индикатор без внятной маркировки, для индикации количества копий и зажёва бумаги. Прозвон показал, что схема с 6 выводами управляет 9 сегментами-светодиодами. Непорядок - традиционно схема "7+точка" управляется с общим анодом максимум 9...10 выводами, где каждая ножка отвечает за свой сегмент. Здесь же дело было явно нечисто - нужна некая комбинация напруг на входе, вычлененная в картинку:
7seg Семисегментник из корейского ксерокса (480x480, 147Kb)
То есть три ноги для питания и три для выхода. Несложным матаном было выяснено, что количество комбинаций для отображения доступных воображению символов (0...F) должно быть минимум три - и это динамическая индикация, одно из гадчайших явлений в моём понимании, ибо его невозможно зафиксировать единым моментом и сложнее отлаживать. Так сзать, неизбежное зло, экономящее провода и комплектуху.
Метод управления до безобразия прост: подключаем к контроллеру все 6 ног (через резисторы 100...200 Ом) и по очереди в коде кидаем на порт 3 числа в виде &B00111000 (всё питание и все выходы, два бита незадействованы) - загораются нужные сегменты и можно подбирать комбинации. Но это же цикл! Это же лишние такты! То же самое можно реализовать, подключив ради экономии ног контроллера сдвиговый регистр 74595 или 4094, но здесь нужна будет производительность МК, чтобы "прогон" битов оставался незаметным глазу, а после выведения байта (одного из трёх) вставлять искусственные задержки "для глаза". Хуйня получается, ребята. Мы должны постоянно следить за тем, что выводится пользователю за счёт таймера и прерывания. Зачем так отчаянно расходовать ресурсы МК, если вдруг нам понадобится критичная по времени выполнения операция?
Поскольку есть комплектуха, которая без дела пылится, можно использовать её как для усложнения схемы, так и для упрощения кода МК - чтобы don't care about обновление индикатора.
7seg_kor_scheme (700x617, 133Kb)
Собстна, схема.
Принцип действия - раз используется три комбинации (18 бит) для одного символа (сложный случай, цифра "1" требует меньше), то придётся использовать три регистра 4094. Избыточно, но на два незадействованных бита можно повесить двухцветный светодиод и баловаться яркостью. Три регистра будут заливаться последовательно через DATA/CLOCK комбинации вида &B00011111; &B00100111 ; &B00100111, которые будут последовательно с дикой частотой выводиться на индикатор посредством сигнала OE каждого из регистров и единой шины Q0...Q5. Переключение OE хотел первоначально повесить на любимую пару 74141+7404 (плюс счётчик К176ИЕ11), однако, это оказалось проблематичнее, и я использовал счётчик со встроенным дешифратором на позиционный код К176ИЕ8. Ведь мне совсем неважна последовательность показа комбинаций. Заводим ногу четвёртой комбинации на ресет счётчика, дабы он не работал вхолостую и не делал мерцание, а затем, убедившись в работоспособности данного решения (подавая ручной импульс на ножку CLK), попробовал собрать генератор на "универсальной" микросхеме-таймере NE555 (КР1006ВИ1). Даже получилось. На номиналы не стоит пристально смотреть - я умудрился вместо C1 воткнуть стабилитрон, посему сейчас схема работает с дикой производительностью, но и жрёт наверное немало. Выходные импульсы генератора 555 заводим на вход счёта ИЕ8, с дикой частотой переключая OE регистров 4094. Получилось =)
IMG_7598 (700x525, 144Kb)
Схема реализована на макетке. Скоро реализую в железе ибо макетка всё же должна быть свободна и доступна для новых экспериментов.

Плюсы: не заморачиваемся с прерываниями и обновлением сегментника в коде МК, лишь послать 3 байта/символ в регистры. Освобождаем целый порт.
Минусы: аналоговая составляющая в виде генератора вносит (по моему скромному мнению) элемент ненадёжности и зависимости от фаз луны в схему. А в целом минус в трёх байтах вместо одного. А три байта - это три байта, а не DWORD. Ну и немного взрыв мозга с разбивкой комбинаций.

P.S. Кстати говоря, прошлая схема с клавиатурой приросла ещё одним 74245, цепляющим клавиатурные пины к шине данных МК, поэтому для включения клавиатуры читаем лишь тот же двусторонний порт данных, включаемый отдельным пином (OE 74245). Да ещё и работает!
code:

Function Iskeypressed() As Byte 'ВПОЛНЕ СЕБЕ рабочая тема с клавой!!!!!!!!!!!
Dim Initialkey As Byte
Dim I As Byte
Ddra = &B11111000 '3 на вход, остальные на выход
'Сканкоды 24 клавиш:
'210 226 194 | 234 202 242
'212 228 196 | 236 204 244
'213 229 197 | 237 205 245
'209 225 193 | 233 201 241
For I = &HC0 To &HF0 Step 8 'Подаём задающие коды, пропуская 8 сканкодов между ними
Porta = I
Waitus 100 'Стыд. На 16МГц кварце сканирование упирается в остаточные явления
Initialkey = Pina
If Initialkey > I Then
While Pina = Initialkey 'Ждём отпускания клавиши
Wend
Iskeypressed = Initialkey
Exit Function
End If
Next I
Iskeypressed = 0
End Function


В колонках играет - Noize MC
Рубрики:  этот удивительный мир вокруг нас
Метки:  



 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку