Современный бизнес: создаём проблему... решаем проблему... Живём на разницу!...

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

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

#1
Цифровая техника / Запустить 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, другие сигналы полезные для синхронизации узлов.

уфф, оказалось, у меня потерялась циклограмма. Потребуется время нарисовать по-новой... продолжу...
#2
Путешествия / Re: Из кабины машиниста
Последний ответ от Slabovik - Сегодня в 13:37
Снег идёт и поезд идёт. Зимняя Швейцария
St.Moritz - Chur with heavy snowfall
[свернуть]
#3
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - Вчера в 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() :)
#4
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от Slabovik - Вчера в 19:14
Это немного другая организация процесса, но в принципе подходит. Основной цикл крутит круги, в которых вызываются все процедуры. А процедуры уже смотрят, пора им или ещё нет. Тут проблема может быть в том, что вдруг возможен какой-то длительный процесс/процедура, а эта штука его прерывать не сможет. Прерывания помогают отделить процессы друг от друга.
#5
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - Вчера в 18:38
Ну у меня же есть SySTick, он же подходит?, - зашли, проверили миллисекунды, - надо выполнили задачу, нет - вышли.
Можно и меньше 1 мсек его настроить.
#6
Неплохая подборка производителей.
Статья на Хабре: https://habr.com/ru/articles/808465/
#7
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от Slabovik - Вчера в 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 какого-нибудь порта, будет проще их туда выгонять (хотя...)
#8
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - Вчера в 00:25
Давай называть пины так, как я их задефайнил, а то запутаемся.
nOE, PinA, PinB, SCLK - ногодрыг и SPI ноги - CLK, MOSI (PA5/PA7).
У F103 камня управление третьей ногой SS аппаратное реализовано как-то не верно, никто им не пользуется, только две ноги хардварного SPI у всех, не вдавался в подробности почему.
В принципе и у F0 делал также.
#9
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от Slabovik - 01 Май, 2024, 23:02
nOE... я забыл про него.
RDY - это не оно. Это строб, по фронту которого происходит перезапись данных из регистра сдвига в выходной регистр.
Тогда да, nOE пусть остаётся как есть. Потому что выход надо "погасить" перед подъёмом RDY и "зажечь" после выставления строки AB.

Гм, оборванный вывод? Это вполне проблема, да... Жаль, что у STM даташиты такие разбросанные. Не случилось ли какой рестрикции из-за конфигов. Но это читать много надо, так не помню, практиковался совсем мало  :-\

Ну трындец какой-то. Я тутпро RDY вещаю, а на входе матрицы этой фигни нет. В общем, RDY - это ST на микросхемах, формируется как-то автоматом. Давай я завтра, как время будет, возьму и на основе уже этой схемы нарисую циклограммы, как там вообще должно быть. А то я по памяти всё, и... промахиваюсь...

и,да... OE по схеме не задействован, так что совсем печалька...
#10
Цифровая техника / Re: Светодиодные матрицы
Последний ответ от zenon - 01 Май, 2024, 22:36
RDY это nOE? Который шимить можно?
Тут понял что у меня происходит, PA15, я его и так и эдак - не вижу, как был высоким так и остаётся высоким....
... ну и перекиул сначала на PA6, - и сразу увидел его анализатором, завёл на enable, вижу оба состояния.
перекинул инит на PB15, чтобы себя проверить, не напутал ли я что-то с кодом, нет всё ок, рабодает.
В что с PA15 не пойму, те же манипуляции с ним - не реагирует никак, козы на плате нет, до своей ноги звонится.
Может и до этого была проблема из-за него.