Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Відеокарта для любого мікроконтролера

2024-02-22

Всі статті →

Буває таке, що потрібно виводити з мікроконтролера чимало різноманітної інформації, будь то температура, оберти двигуна або ж слідкувати за роботою всіх каналів АЦП. Тут вибір не великий, або використовувати семисегментні індикатори, або ж вибрати якийсь маленький LCD дисплей, що не завжди зручно через малі розміри останніх.

То, чому б для цих справ не використати монітор від комп’ютера. В інтернеті є багато прикладів відеоадаптерів для мікроконтролерів, але почавши пошуки готового проєкту, результати були не втішні, то в схемі використано ПЛІС, що складно для того хто з ними ніколи не працював, то зображення чорно-біле, то зображення кольорове але пікселі розміром як великий палець. Ще був цікавий проєкт з використанням старої ISA відеокарти, але чи то відеокарта була несправною чи я допустив якусь помилку в коді програми, бо у мене так нічого і не запрацювало.

Тому було вирішено зробити свою власну відеокарту, «з рулетками й випивоном». Звісно придумувати велосипед з нуля якось зовсім не хотілось, тому ідею взяв у відомого вуйка Клайва Синклера, а саме, з його комп’ютера ZX Spectrum.

Ідея Клайва полягає в тому, щоб розділити зображення на екрані, на дві окремі сторінки, сторінку пікселів і сторінку атрибутів. У сторінці пікселів, пікселі зберігаються блоками, де один байт в пам’яті представляє собою 8-м пікселів, кожна 1-ця в байті вважається пікселем переднього плану, а кожен 0-ль вважається фоновим пікселем. У сторінці атрибутів зберігаються кольори кожного блоку, 4 молодші біти в байті, це колір пікселів переднього плану, а 4 старші біти, це колір фонових пікселів. Такий спосіб передачі зображення, значно скорочує обсяг інформації яку потрібно передавати, що дуже добре для маленьких 8-ми бітних мікроконтролерів.

В результаті була створена відеокарта з такими параметрами: Розширення екрану 400 на 300 пікселів, що вже навіть на 22 дюймовому моніторі виглядає не погано, і нещасних але все таки цілих 15 кольорів! Плата має розміри 73мм на 114мм з одностороннім монтажем, в моєму випадку виготовлена на лазерному принтері.

Відеокарта побудована на жменці 74 логіки, мікроконтролері Atmega8 (пізніше був замінений на більш поширений Atmega88) 2х мікросхемах динамічної пам’яті, і працює на частоті 20 мГц, що повністю повторює усі таймінги відеорежиму SVGA 800x600 60 Hz, тому усі монітори без проблем працюють з даною відеокартою. Прошивка мікроконтролера повністю написана на асемблері.

Короткий опис всіх сигналів представлено нижче:

  • VCC і GND - Відповідають за живлення, відеокарта працює від 5V джерела живлення.
  • /RESET - Вхід зовнішнього скидання мікроконтролера відеокарти.
  • /WAIT - Вихід для синхронізації, якщо відеокарта зайнята записом інформації у пам'ять, то на цьому виході стоїть логічна одиниця, в цей момент запис інформації в регістри адреси і даних відеокарти заборонена.
  • Data0 - Data7 - Входи регістрів адреси і даних.
  • C_Y - тактовий сигнал запису у регістр адреси по вертикалі, активний фронт наростаючий.
  • C_X - тактовий сигнал запису у регістр адреси по горизонталі, активний фронт наростаючий.
  • C_D - тактовий сигнал запису у регістр даних, активний фронт наростаючий.

Так виглядають внутрішні регістри.


Схема.

Коротко про роботу схеми.

На мікросхемі IC1 побудований тактовий генератор, тактові імпульси від нього поступають на мікроконтролер IC2, зсувний регістр IC4 і на вхід тригера IC3_B.

В режимі читання відеоданих з пам’яті, мікроконтролер IC2 ставить по черзі в порт PD адреси по вертикалі та горизонталі, після активації сигналів RAS і CAS, на виході мікросхем DRAM IC11 IC12 з’являється зчитаний байт атрибутів, який записується у регістр IC6. Після зміни мікроконтролером IC2 адреси по горизонталі, ще раз активується сигнал CAS і на виході мікросхем DRAM з’являється байт пікселів, який по наростаючому фронті тактового сигналу записується у зсувний регістр, водночас через тригер IC3_B наростаючий фронт тактового сигналу записує в регістр IC7 попередньо зчитаний байт атрибутів який зберігається у регістрові IC6. Таким чином байти атрибутів і пікселів одночасно попадають у мультиплексор IC5 де і формується кольоровий відеосигнал. Транзистори Q1-Q3 виступають в ролі простого цифро-аналогового перетворювача.

Для синхронізації запису інформації у пам’ять відеокарти, використовується тригер IC3_A. Коли на тактовий вхід C_D приходить наростаючий фронт, тригер перемикається і ставить на виході /WAIT логічну 1-цю, що забороняє передачу нового пакета інформації у відеокарту. В цей час мікроконтролер відеокарти перевіряє стан тригера IC3_A, і якщо він спрацював, то мікроконтролер підключає виходи регістрів адреси IC8, IC9 і регістр даних IC10 до пам’яті та дає команду запису, після чого скидає тригер IC3_A у попередній стан.

Роз’єм відеокарти обраний на 40 пін, спеціально, щоб для з’єднання з мікроконтролером, можна було використати сигнальний шлейф від IDE жорсткого диска. Шлейф підходить лише старого зразка, на 40 проводів. Також паралельно з відеокартою, на один шлейф, можна під'єднати контролер PS/2 клавіатури, і отримати ще на додачу безліч кнопок. Виходить щось схоже на комп’ютер))

Всі деталі відеокарти можна без проблем купити в магазині, мікросхеми 74-ї логіки можна використовувати лише сімейства HC, LS не підходить. В тактовому генераторові, працює лише спеціалізована логіка HCU, HC працює не стабільно. Мікросхеми пам'яті DRAM можна зняти зі старої відеокарти, материнської плати або старого модуля оперативної пам’яті SIMM.

Фюзи мікроконтролера налаштовуються на тактування від зовнішнього тактового генератора, Atmega8 працює на частоті 20мГц без проблем.

І подальший розвиток відеокарти, якщо замінити мікросхеми IC8, IC9, IC10 на 3 регістри 74HC595 тоді відеокарта вийде з інтерфейсом SPI, при цьому швидкість запису інформації у відеокарту падає, але не критично.

На виході PB7 мікроконтролера, генерується сигнал з частотою миготіння курсора, можна використовувати для відновлення функцій оригінальної відеокарти ZX Spectrum.

З мінусів, це швидкість запису інформації у відеокарту, бо запис у пам'ять відбувається у момент зворотного ходу променя, і дорівнює частоті 37,8 кГц. За один кадр відбувається 142 циклу запису у пам'ять. Також інформацію в пам’яті не можна модифікувати, що викликає свої незручності.

Ось так виглядає зображення на 19 дюймовому моніторі.

Прошивки мікроконтролера, схему і малюнок печатної плати додаю:

На даний момент, вже є друга версія такої ж відеокарти, але на пам’яті SRAM. Використання статичної пам’яті дозволило підняти частоту запису інформації у відеокарту до 2,5мГц.

Якщо сподобалась стаття пишіть відгуки.

З повагою Viktor Korinnyi.

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Відеокарта для любого мікроконтролера"
5 з 5
зроблена на основі 4 оцінок 4 клієнтських відгуків.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Viktor Korinnyi
03.10.2024 22:12:05
Віталій М. На момент публікації цієї статті, варіант відеокарти на SRAM вже тестувався в роботі, є готова плата і прошивка, але до написання статті так і не дійшов, за браком часу. Ліби я писати не зможу, так як мікроконтролери AVR програмую лише в середовищі CodeVisionAVR.
Віталій М.
03.10.2024 09:24:48
Viktor Korinnyi було б добре прикріпити до файлів проекту лібу, бо без неї цим проектом не скористаєшся, а самому розбираться і писать, я наприклад, не зможу
Віталій М.
02.10.2024 14:17:46
Цікавий проект. Візьму собі на замітку. А як подивиться варіант на памяті SRAM?
A1
24.05.2024 18:20:48
Цікаво. Але, схоже, це доволі древній проект. Зараз, думаю, таке можна на тому ж RP2040 зробити (не стверджую, бо не робив). І дешевше повинно бути.
оплата картами Visa і MasterCard