Сайты в интернете не вызывают доверия.

Меню навигации для мобильных

Последние сообщения

#1
Цифровая техника / Re: Запустить 8086
Последний ответ от Slabovik - Сегодня в 18:12
Продолжим. 40МГц тактирования позволяет удобно определить цикл шины памяти с 25-наносекундным дедтаймом. Он нужен изза того, что память не очень быстро снимает данные со своего выхода после цикла чтения, и если следующим будет идти цикл записи, там целых полтора-два десятка наносекунд может быть игра "перетяни шину". Чтобы этого не было, данные нужно выставлять слегка позже, чем начинается цикл.

Слегка изменил схему генератора

8086_Gena_TM8_40MHz.png

По-идее, можно обойтись без  четвёртого (D3/Q3) триггера, но его девать некуда - пусть стробирует гейт на выводы 'L' триггеров ИР22, которые забирают данные из памяти.

Строб гейтов данных на запись в память выглядит точно также, только следует чуть позже за счёт задержки в логическом элементе.
Постарался наиболее точно отобразить задержки в элементах. В основу взял серию 74AC

8086_Gena_TM8_40MHz_timings.png

Можно частоту делить на 3, взяв в качестве опорной 24МГц. Это проще. Но поделив на D-триггерах, получим ровно 1/3, получим 41нс  полутакта, а по документам надо 50.

Можно попробовать посчитать делитель на 3 на JK-триггерах. Это асинхронные триггеры и фронты будут за счёт задержек смещены, возможно, в нужную сторону. Посмотрим. Вот схема делителя

8086_Gena_TB15_24MHz.png

Пойду тайминги рисовать :)
#2
Цифровая техника / Re: Re: Орион-128 возрождение ...
Последний ответ от matrixplus - Сегодня в 13:15
запись на проект  плат SVGA  https://zx-pk.com/forum/viewtopic.php?f=7&t=23750

Орион-128 плата SVGA проект (улучшение изображения) http://rdk.regionsv.ru/orion128-super-42-turbo.htm

Принимаются заявки:  цена приблизительно озвучена на   https://zx-pk.com/forum/viewtopic.php?f=7&t=23750


информация http://rdk.regionsv.ru/orion128-super-42-turbo.htm
фото платы http://rdk.regionsv.ru/orion128svga/svga-015.jpg



в ней предусмотрены раьемы для платки расширения которая уже есть (в принципе разведена но ее бум делать позже)
#3
Фото, видео, аудио / Re: Коротко о погоде
Последний ответ от Slabovik - Вчера в 22:13
Целый день пасмурно и прохладно, что даже до +4 еле-еле прогрело. Но с обеда зарядил дождь, который к вечеру превратился в мокрый снег, а потом в сильный мокрый снег. Ладно, что деревья ещё сильно лист не выпустили, даже вишни со сливами бутоны только-только приготовили, но тополя в городе поломало конечно... Полагаю, обойдётся  :)

TJM-2024-05-03.jpg
#4
Цифровая техника / Запустить 8086
Последний ответ от Slabovik - Вчера в 16:43
Давно колупаюсь, когда время есть, но до практики так и не добрался ввиду объёмных затрат на хардварь. Тем не менее, давно хотел сделать какой-нибудь контроллер на базе этого проца. Да, есть NEC V40, но это уже перебор :)

Итак, имеем i8086 либо подобный. Задача-минимум - запустить. Задача-максимум - с прозрачным режимом работы с памятью и собственным видеоконтроллером, дающим картинку на телевизор либо LCD. 256 цветов достаточно. 16 - минималка.

8086 есть в нескольких вариантах. 8086 - базовый с тактовой 5МГц. 8086-2 имеет тактовую 8МГц. И есть редкий 8086-1 с тактовой 10МГц. Базовый купить полный кулёк не проблема, их много продают с разборок. 8086-2 надо поискать. 10-мегагерцовый вариант я не находил. А есть ещё вариант 80С86 - то же самое, только по КМОП-технологии.

Для начала надо разобраться с тактированием. Оно по-интеловски слегка странное - соотношение полупериодов должно быть 3/5 и 2/5

8086_timing_diagram.png

8086_timing_table.png

Тайминги версии 80C86 идентичны таймингам оригинала

Да, я видел варианты, где делают 2/3 и 1/3 и даже 3/4 и 1/4, но это с пониженными частотами, 4 а не 5, 6 а не 8...
Для 8-мегагерцового 1/3 при 125нс периоде получается только 41нс, а не 50, требуемых по даташиту (45+фронт)

3/5 и 2/5 можно чётко получить при 40-мегагерцовом осцилляторе

8086_40MHz_to_8_divider.png

Здесь подаваемая на процессор частота CT1, другие сигналы полезные для синхронизации узлов.

уфф, оказалось, у меня потерялась циклограмма. Потребуется время нарисовать по-новой... продолжу...
#5
Путешествия / Re: Из кабины машиниста
Последний ответ от Slabovik - Вчера в 13:37
Снег идёт и поезд идёт. Зимняя Швейцария
St.Moritz - Chur with heavy snowfall
[свернуть]
#6
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - 02 Май, 2024, 21:53
Случайно удалил свой пост.
Предделитель для 1Гц будет такой:
72000000/7200 = 10000Гц
Предзагрузка 10000.
Прерывание по переполнению счётчика:

↓ спойлер ↓
void TIM13_init(void){
  RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // разрешить тактирование таймера
  TIM3->PSC = 7200 - 1; // предделитель
  TIM3->ARR = 10000 - 1; // предзагрузка
  TIM3->DIER |= TIM_DIER_UIE; // прерывания будем ловить по переполнению счетчика
  TIM3->CR1 |= TIM_CR1_CEN;
  NVIC_EnableIRQ(TIM3_IRQn);
}

void TIM3_IRQHandler (void) {
  if ((TIM3->SR & TIM_SR_UIF) == TIM_SR_UIF) { //  проверяем, что прерывание произошло по событию переполнения счетчика stm32f10x.h
    TIM3->SR &= ~TIM_SR_UIF; // флаг сбросить, иначе при выходе из обработчика прерываний мы тут же попадем туда снова
    LEDTOGGLE; // моргаем
  }
}
[свернуть]
---
Но, у нас ещё есть собственное прерывание на SPI: void SPI1_IRQHandler() :)
#7
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от Slabovik - 02 Май, 2024, 19:14
Это немного другая организация процесса, но в принципе подходит. Основной цикл крутит круги, в которых вызываются все процедуры. А процедуры уже смотрят, пора им или ещё нет. Тут проблема может быть в том, что вдруг возможен какой-то длительный процесс/процедура, а эта штука его прерывать не сможет. Прерывания помогают отделить процессы друг от друга.
#8
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - 02 Май, 2024, 18:38
Ну у меня же есть SySTick, он же подходит?, - зашли, проверили миллисекунды, - надо выполнили задачу, нет - вышли.
Можно и меньше 1 мсек его настроить.
#9
Мастерская радиолюбителя / Re: Заказ плат - где и как?
Последний ответ от Slabovik - 02 Май, 2024, 15:43
Неплохая подборка производителей.
Статья на Хабре: https://habr.com/ru/articles/808465/
#10
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от Slabovik - 02 Май, 2024, 12:12
Скорее пока буду смотреть на исходное изображение



Сигналы 'A' и 'B' - выбор строки. Фактически - это разряды двоичного числа в диапазоне 0-3 (A - разряд 0, B - разряд 1)
Несмотря на то, что строк на дисплее 16 длиной по 32 пикселя, электрически их только 4 длиной по 128 пикселей, что составляет 16 байт.

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

Сигнал 'OE' (Output Enable) - включение отображения строки (или индикатора). Активный уровень - высокий. Может использоваться для управления яркостью индикатора при помощи ШИМ.

'R' - информационные биты, отображаемые строкой. Инвертированные: '0' - точка горит, '1' - точка погашена. Биты задвигаются в регистры строки в количестве, соответствующем физической длине строки (т.е. 128 бит или 16 байт для нашего случая).

'CKL' - строб (Clock, CLK и т.п.) для данных 'R'. Активный переход от низкого уровня к верхнему - в этот момент то, что было на 'R' попадёт в сдвиговый регистр строки. CKL - наверное опечатка

'SCLK' - строб для переноса накопленных в сдвиговом регистре данных на выход (он же Rdy, DataReady, Sync и т.п.) Активный переход от низкого уровня к верхнему
↓ спойлер ↓
тут могут быть нюансы т.к. микросхем с аналогичных функционалом много и бывает, что у некоторых типов на выходе использован не регистр-защёлка, а регистр хранения - у него при низком уровне сигнала данных на выходе 'хранятся', а при высоком он 'прозрачен', т.е. на его выходах ровно то же, что и на входах

Вот как-то было: https://anklab.ru/forum/index.php?msg=220
[свернуть]

Синонимы.
'A','B' = A0, A1, SA0, SA1...
'CLK' = Clk, Clock, BitLock, BitShift, Shift...
'SCLK' = Ready, Rdy, DataLock, DataReady...
'R' = Data, DataBit, DB...
'OE' = On...

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

Самое главное. Как работать.
Развёртка индикатора должна быть весьма пунктуальна. Поэтому не обойтись без хардверной синхронизации от таймера. В самом простом случае, вывод на индикатор делается внутри прерывания от таймера - см. картинку. Это не очень хорошо т.к. последовательный вывод отнимает много времени, но для учебной цели пойдёт
↓ спойлер ↓
в более серьёзном проекте в прерывании от таймера необходимо делать только включение вывода новой строки (OE и RDY) и можно расчёт байт новой строки, а затем выход и запуск SPI со своими прерываниями - так не надо будет мудрить с вложенными прерываниями и не будет блокировки прерываний надолго (что и есть не очень хорошо)[/b] Ну а пока одно прерывание, SPI можно сделать софтверный
[свернуть]

Циклограмма-вывода-на-светодиодные-матрицы.png
картинка очень широкая, поэтому лучше правым кликом мыши...

В прерывании первое - опускаем OE
Второе - устанавливаем AB текущей строки
Третье - поднимаем RDY (SCLK)
Четвёртое - рассчитываем биты/байты следующей (!) строки, складываем в буфер (ОЗУ)

Пятое - опускаем RDY (SCLK), передаём  рассчитанные биты/байты следующей строки.
Выходим из прерывания.

Повторюсь - пятое не обязательно делать внутри прерывания по таймеру (лучше не делать). Если используется хардверный SPI, то подготовленный на четвёртом буфер должен быть доступен и процедуре обработки SPI, а пятый пункт заключается в запуске прерываний SPI, после чего выход из прерываний по таймеру.
По прерыванию от SPI смотрим на буфер и засовываем в SPI следующий из буфера байт. Если байта нету - останавливаем SPI.

Вот, нарисовал то, что я бы сам делал, будь у меня только проц и ни одной микросхемой более

Циклограмма-вывода-правильная.png

Такое построение позволяет не сидеть долго в прерывании, блокируя их (это моветон, почему - узнаете, когда жахнет).
2,5 мс между строками - это соответствует 100 Гц развертки на экране. Нормально, чтобы не обращать внимание на мерцания.

Лучше всего выделить ОЗУ, в которой формировалось бы изображение, выводимое на экран.
Изменять изображение программе разрешить только когда будут показаны все строки, например, формировать сигнал после вывода 4-й строки, запуская процедуру обновления. Иначе будут видны "перекосяки". Процедура обновит содержимое экранного ОЗУ и новый кадр пойдёт уже обновлённым.

Да, скорость SPI слишком задирать не надо. Например, при 1МГц вывод 128 бит будет всего по длительности ~0,13мс, так что времени довольно много. Другое дело, если экран будет большим, но там просто посчитать.

Надо будет оценить (тем же осциллограформ), сколько по времени займёт исполнение прерывания от таймера, но не думаю, что много. Особенно, если изображение уже в "экранной" области ОЗУ, то оно уже готово, надо только выбрать нужную строчку. Если выводить из памяти программ, то там конечно дольше выходит т.к. каждый раз каждую строчку считать по-новой. Это непроизводительно.

А, да. RDY, OE, AB сделать программно управляемыми (ногодрыг). Data, CLK - хардверными, пусть блок SPI ими дрыгает. По циклограмме вроде понятно, в каком порядке всем этим дрыгать. AB если назначить на биты 0 и 1 какого-нибудь порта, будет проще их туда выгонять (хотя...)