Мигаем светодиодом: PC XT — style

На самом деле между PC XT и 48-ю (!) светодиодами притаился «рояль в кустах»:

Эта плата была спонтанно приобретена на ebay. Ясных планов её использования у меня не было, просто захотелось, да и сейчас не такой большой выбор старого ISA-железа, в особенности 8-битного.

На этой плате установлены сразу 2 чипа 8255 и одна микросхема 8253. 8253 мы в этой публикации использовать не будем. Сверху видны 2 40-пиновых гребёнки для подключения шлейфов. Слева — 16 светодиодов, о них чуть позже.

В двух словах о 8255. Она предоставляет доступ к 24 линиям ввода/вывода — к трём 8-битным портам Port A, Port B и Port C. Микросхема может работать в нескольких режимах, мы же будем использовать самый элементарный — просто будем класть байт в порт.

Светодиоды слева на карте подключены к Port A каждой из двух 8255. Уж не знаю, зачем это было реализовано, возможно, просто для демонстрации работоспособности. Но именно наблюдение за чарующим перемигиванием светодиодов и подвело меня к замыслу «вытащить» все 48 линий наружу и сделать, таким образом, светодиодную матрицу.

Плата приехала вместе с подробнейшей книжицей, в которой была принципиальная схема, описание режимов работы 8255 и 8253 и распиновка верхних гребёнок.

Во время проектирования своих печатных плат обнаружил пару досадных опечаток - правки мои.
Во время проектирования своих печатных плат обнаружил пару досадных опечаток — правки мои.

Делаем печатные платы

Сначала упомяну комп, к которому всё это будет подключаться — публикация на хабре.

Решил разделить собственно светодиодную матрицу от всей прочей нехитрой логики, поэтому плат было две:

Основная плата:

Сверху вниз:

  • гнездо подключения светодиодной матрицы (аноды), находится с обратной стороны

  • 6 330-омных резисторных сборок

  • 1-й разъем к плате c 8255-ми

  • 4 логических инвертора 74HC04N

  • гнездо подключения светодиодной матрицы (катоды), находится с обратной стороны

  • ещё 4 логических инвертора 74HC04N

  • 2-й разъем к плате c 8255-ми

Аноды светодиодов подключены через резисторные сборки к +5В, катоды подключены к выходам инверторов. Входы инверторов подключены к портам 8255-х.

Светодиодная матрица

Сверху, соответственно, выведены аноды, снизу — катоды. Светодиоды на этом виде на обратной стороне платы. Если же смотреть со стороны светодиодов, то вертикальные ряды идут слева направо в порядке: Port A, Port B, Port C первой 8255, Port A, Port B, Port C второй 8255.

Для разработки плат использовал онлайн редактор easyeda.com. Особых проблем при проектировании не возникло, но было много мороки правильно соотнести 6 портов и 48 светодиодов. Разводка платы прошла автоматическая.

Готовые платы

Платы заказывались на jlcpcb.com.

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

На дворе дефицит чипов, поэтому копеечные инверторы бережно установлены в панельки!

вид сзади:
Готовый «бутерброд»
Подключённый и закреплённый на раме:

Программируем всё вот это вот, наконец…

Даёшь ретро-железу винтажную IDE!

Да, пришлось активировать нейронные связи, когда-то давно отвечавшие за навыки работы в Turbo Pascal. А также мышечную память, ответственную за Ctrl-K B, Ctrl-K K, Ctrl-K C, Ctrl-Y и так далее.

Немного подробностей

Первоначальная инициализация: готовим рандомайзер, переключаем 8255-е в режим простого чтения/записи в порт, гасим все светодиоды.

Код:
Procedure AllOff; Forward;  Procedure Init;  Const PORT1_CONTROL_REGISTER = $01B3;       PORT2_CONTROL_REGISTER = $01B7;  Begin      Randomize;      Port[PORT1_CONTROL_REGISTER]:=$80;      Port[PORT2_CONTROL_REGISTER]:=$80;      AllOff; End;  Procedure AllOff;  Begin      MATRIX[0]:=0;      MATRIX[1]:=0;      MATRIX[2]:=0;      MATRIX[3]:=0;      MATRIX[4]:=0;      MATRIX[5]:=0;      Update; End; 

Передаём сформированный массив в порты. Тут я решил заменить унылые Port[xxxx]:=yyyy на ассемблерную вставку.

Код:
Var MATRIX : Array [0..5] of Byte;  Procedure Update;  Const PORT_1A = $01B0;       PORT_1B = $01B1;       PORT_1C = $01B2;       PORT_2A = $01B4;       PORT_2B = $01B5;       PORT_2C = $01B6;  Begin      asm         LEA DI, MATRIX          XOR BX, BX         MOV DX, PORT_1A         MOV AL, [DI+BX]         OUT DX, AL          INC BX         MOV DX, PORT_1B         MOV AL, [DI+BX]         OUT DX, AL          INC BX         MOV DX, PORT_1C         MOV AL, [DI+BX]         OUT DX, AL          INC BX         MOV DX, PORT_2A         MOV AL, [DI+BX]         OUT DX, AL          INC BX         MOV DX, PORT_2B         MOV AL, [DI+BX]         OUT DX, AL          INC BX         MOV DX, PORT_2C         MOV AL, [DI+BX]         OUT DX, AL      end; End;

Здесь находится репозиторий с исходным кодом.

Заключение

Здесь можно увидеть демонстрацию работы. Качество видео получилось так себе, в реальности все гораздо лучше.

Что дальше? Я первоначально хотел насверлить в непрозрачном оргстекле толщиной 3 мм 48 отверстий и «надеть» на светодиоды, чтобы отделить их друг от друга, а сверху — уже прозрачное красное оргстекло. Специально для этого подбирал цилиндрические светодиоды с плоской шляпкой. Сейчас уже не уверен, хватит ли у меня запала.

Что более вероятно, так это то, что я займусь вторым чипом на плате — 8253. Там 3 независимых счетчика, возможно, я после визуальных эффектов перейду к аудио. Ясно, что это будет весьма и весьма примитивная «музычка». Посмотрим!


ссылка на оригинал статьи https://habr.com/ru/post/599635/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *