С stm32f103 на телевизор (полный TV сигнал)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не то, чтобы я считаю эту тему актуальной, но ведь кому-то понадобилось делеть TV-выход на Nano даже при том, что там отображается всего 20 символов в строке...

Опять же, не прошло и месяца, как аналоговое телевидение вышло из моды. ))) А аналоговые телевизоры остались...

Ну и на Ардуино выбор экранов (с разрешением от 128 по горизнтали) обычно ограничивается двумя непересекающимися диапазонами: 

- от менее дюйма до примерно 4 юймов,

- от 20-40 дюймов и больше.

А промежуточный диапазон перекрывают как раз аналоговые TV-приемники.

В общем, первые прикидки показали, что можно сделать на stm32 формирователь полного телевизионного сигнала с разрешением экрана 512х240 пикселей, что дает 64 символа в строке для символов 8х8 или 8х12, а также до 85 символов в строке для достаточно стандартного для Ардуино фонта 6х8 (5х7).

Первая попытка:

Здесь шахматное поле с клеткой 16х16, поверх которого нарисована одниписельная прямая из левого верхнего угла вправо вниз, а также надписи шрифтами 6х8, 8х12 (зернкально) и 8х8 (жирный).

b707
Offline
Зарегистрирован: 26.05.2017

Интересно, хотя и непонятно зачем :)

С интересом жду подробностей по реализации этого в коде.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

О_О

nik182
Offline
Зарегистрирован: 04.05.2015

Давно хотел реализовать на работу табло с текущими параметрами эксперимента на большом экране 40 дюймого телевизора притащенного аспирантами из дома за ненадобностью. Уже полгода лежит без дела. Присоединяюсь. Реализую в ближайшее время. Только шрифт будет большим, чтобы из далека было видно.

P.S. Они уже всё сделали :-(  

https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/A_STM32_Examples/examples/Maple/CrudeVGA/CrudeVGA.ino

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707, я тоже не очень понимаю, зачем.

Ну, например, есть у меня Orange Zero. Непроверенный. Потому как без видеоконтроллера, но с TTL UART. Так что можно было бы использовать подобную конструкцию в качестве видеотерминала.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

b707, я тоже не очень понимаю, зачем.

Ну, например, есть у меня Orange Zero. Непроверенный. Потому как без видеоконтроллера, но с TTL UART. Так что можно было бы использовать подобную конструкцию в качестве видеотерминала.

Очень напомнило:

Однажды Ходжу Насреддина спросили: 

-- Как избавиться от крыс?

-- Очень просто! - сообщил  Ходжа.

-- Нужно растолочь черепки в порошок и, когда поймаешь крысу, засыпать ей это порошок в ноздри. Крыса не сможет дышать и издохнет.

-- Но если я поймал крысу, не проще ли убить ее, ударив об стену?

-- Конечно проще! - ответил Ходжа.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, этот исходник я, разумеется, изучил и даже кое-что из него замствовал.

То есть полезное там как бы есть, но использовать это на практике нельзя.

Похоже, выглядит это так:

1. Все это делается программно, причем, по горизонтали получается что-то чуть больше 20 "пикселов".

2. Есть один неприятный момент, который мне как раз хотелось бы обсудить.

Меня интересуют строки исходника 91 и 107. В первую очередь, конечно, 107, потому что 91, на мой взгляд, совершенно бесполезна.

Дело в том, что без этих строк (в том числе и у меня) на экране промелькивают помехи, а в результате Serial.end() эти помехи исчезают, но одновременно с этим "отваливается" USB порт. Т.е. перепрошить плату в дельнейшем удается только, нажав в нужный момент на RESET. Похоже, этот Serial.end() убивает как USB, так и милисекундные прерывания системы времени.

В общем, кто по этому поводу что может сказать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

Очень напомнило:

Однажды Ходжу Насреддина спросили: 

-- Как избавиться от крыс?

-- Очень просто! - сообщил  Ходжа.

-- Нужно растолочь черепки в порошок и, когда поймаешь крысу, засыпать ей это порошок в ноздри. Крыса не сможет дышать и издохнет.

-- Но если я поймал крысу, не проще ли убить ее, ударив об стену?

-- Конечно проще! - ответил Ходжа.

 

Вечер. Отец с сыном гуляют по берегу реки. На берегу сидит художник и рисует воду, мост через реку, закат...

Отец сыну(наставительно):

- Видишь, как дядя мучается без фотоаппарата?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
Собственно, идея использовать Ардуино в качестве видеокарты не нова: https://www.instructables.com/id/TV-Out-with-Arduino/
Но в данном проекте:
- слишком мало пикселей в строке - порядка 20,
- насколько мне известно, проект не собирается в современных версиях среды (могу и ошибаться - сам не пробовал ввиду отсутствия интереса).
 
В общем-то, хотелось бы, чтобы экран был более или менее полноценным и позволял разместить не менее сраницы текста (29 строк примерно по 55-58 символов). А еще лучше - если стандартные экранные 80 символов.
Считаем: при ширине знакоместа 6 пикселей это соответствует 360-480 пикселей, а при знакоместе 8 пикселей - всего 480-640 пискелей в строке.
Длина строки - 63.5-64 мкс (в зависимости от системы вещания).
Длина видимой части строки по ГОСТ 18471 - 52 мкс, но известно, что телевизор обрезает рая изображения, что для "компьютерного" применения абсолютно неприемлемо. У имеющегося у меня 8" телевизора видимая часть строки составляет примерно 47 мкс. Исходя из этого составим табличку:
 
1количество    пиксельная
2 пикселей      частота,
3 в строке        МГц
4   360          7.66 МГц
5   480         10.2  МГц
6   512         10.9  МГц
7   640         13.6  МГц

В то же время ширина спектра сигнала изображения составляет 6.25 МГц, что соответствует пикселной частоте 12.5 МГц.

Понятно, что на частоте 72 МГц обеспечить программный вывод пикселей на указанных частотах (т.е. по 6-7 тактов на пиксель) невозможно. Остается только аппаратный. А наиболее приемлемый вариант - интерфейс SPI.
 
Правда, SPI на stm32 может работать только на частотах 18 МГц, 9 МГц и ниже. В первом случае сигнал оказывется далеко за пределами полосы видеосигнала, а потому не будет адакватно отображаться на телевизоре, а во втором - в строке окажется только 423 пикселя, что соответствует 52-70 символов в зависимости от ширины знакоместа. Хотелось бы немного больше.
 
В то же время таймеры 72-МГц процессора могут генерировать сигнал с частотами 10.3 (коэффициент деления 7) и 12(коэффициент деления 6) МГц. Но как получить эти частоты от SPI?
 
Единственный вариант, который пришел мне в голову, - выдавать таймером такой сигнал наружу, а SPI заставить работать в режиме slave. Ну и, чтобы не особо напрягать процессор, поручить DMAС взаимодействие с SPI.
 
К сожалению, в Гугле примеров организации такого режима мне раскопать не удалось, поэтому пришлось заглянуть в дэйташит ))).
 
"О сколько нам открытий чудных готовит datasheet!" Во-первых, при экспериментах с SPI master я конфигурировал SCK в "альтернативный" режим. Но оказалось (наверное, для кого-то это очевидно, но я узнал только сейчас), что альтернативный бывает только выход, а вход нужно оставлять сконфигурированным по умолчанию, даже если он используется для специальной функции. Далее: дэйташит настоятельно рекомендует по окончании обмена останавлвать SPI записью в соответствующий бит 0. Оказалось, делать это не обязательно: достаточно просто еще раз записать в этот бит 1. Т.е. раньше мы уже писали туда 1, мы уверенно считываем оттуда 1, но SPI не работает. А если мы повторно запишем 1, интерфейс будет работать. Правда, в процессе работы SPI сохраняет фазу сигнала и, если длина строки окажется не кратной произведению коэффициента деления на размер байта, то на экране вместо шахматного поля мы увидим примерно следующее. И то в лучшем случае - в худшем картинка вообще не будет стационарной.
У меня получилось, что если для коэффициента деления 6 (частота 12 МГц) длина строки может быть равной ровно 64 мкс, то единственный вариант пригодный для коэффициента 7 (частота 10.3 МГц) - длина строки 63.777777... мкс.
 
В дальнейшем я думаю сделать возможность как аппаратного так и программного переключения между пиксельными частотами 10.3 и 12 МГц, пока же, если на фото в 0-м сообщении темы используется частота 12 МГц, то в скетче ниже - 10.3

 

Пока программа находится в очень сыром виде, и даже больше - в эклектичном, например, инициализация одного таймера произведена через класс (заимствование из чужого проекта), то другого - через регистры. Ну и т.д...
для работы скетча нужны файлы знакогенератора для двух фонтов - 6х8 и 8х8:

 

 
Сразу отмечу, что пока КИРИЛЛИЦА НЕ ПОДДЕРЖИВАЕТСЯ. То, что видно на экране - лишь содержимое файлов знакогенераторов, чтобы появилась полноценная кириллица, необходима соответствующая программная поддержка, которой я пока не делал.
 
Скетч взаимодействет с монитором порта: введенное в строку монитора отображается на телевизоре (помните, что я писал выше про кириллицу). Поэтому без открытого монитора порта скетч не запускается.
Кроме того, на экране присутствуют помехи, о чем я писал ранее.
 
Ну и краткое описание схемы подключения (в дальнейшем она, думаю, будет изменена).
Важно !!! - подключить выход таймера PA1 ко входу SCK PA5.
Сигнал Video снимается с выхода MISO (PA6) через резистор 430 Ом.
Сигнал Sync снимается с выхода PB9 через резистор 820 Ом.
Еще несколько выводов PB использовались мною для отладки логическим анализатором, к ним нежелательно ничего подключать или замыкать между собой.
Полный телевизионный сигнал снимается с общей точки двух указанных резисторов через керамический конденсатор 4.7 мкФ.
 
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Выяснил, что после отключения USB (Serial.end()) последовательный порт (Serial1) сохраняет работоспособность.

Значит, так и будет работать: USB выключаем дабы избавиться от помех на экране, а обмен ведем через COM-порт (PA9, PA10).

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Видео одного из промежуточных вариантов: https://youtu.be/kdt_LOdkxfY

Выводит на экран текст, передаваемый по последовательному порту.

Имеет два режима экрана 480х240 и 512х240 пикселей, позволяет переключаться между ними в процессе работы посредством управляющих последовательностей.

Поддерживает два фонта: 6х8 и 8х8 пикселей, которые могут присутствовать на экране одновременно. Переключаются управляющими последовательностями.

Позволяет позиционировать место вывода.

Позволяет рисовать линии посредством управляющих последовательностей.

Пока:

- нет борьбы с помехами,

- не поддерживается кириллица,

- не поддерживаются аппаратные настройки (например, переключение кодовой страницы, что будет актуально после подключения кириллицы - планируется utf-8, 866, 1251 и КОИ8).

Для записи ролика был создан сценарий, т.е. последовательность символов, передаваемая в порт. В качестве источника данных была использована Мега. К проекту она никакого отношения не имеет, вместо нее можно было использовать ардуиновский монитор порта, но я, увы, не могу соревноваться с Мегой в скорости ввода символов.

Код будет выложен ближайшие день-два.

PS. Ни у кого нет на примете фонта 8х8 (желательно жирного) с украинско-белорусской кириллицей?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А вот и обещанные исходники:

stm_strl.ino

screen.h

screen.cpp

И демонстрационный код на Меге:

test.ino

Выход TX3 Меги нужно подключить ко входу RX1 stm32.

Напоминаю, что:

кириллица пока не поддерживается,

борьба с помехами пока не ведется.

Управляющие коды описаны в screen.h. Можно подключить к stm32 вместо Меги ПК через USB-UART и передавать команды и строки текста прямо из монитора порта.

arduinec
Offline
Зарегистрирован: 01.09.2015

Похожий проект "VGA на Arduino Due": https://github.com/stimmer/DueVGA/

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, сходство есть.

Но мне хотелось:

1. Не менее 80 символов в строке (а в указанном проекте - до 53).

2. Обойтись контроллером, который почти на порядок дешевле.

При этих условиях единственный вариант - отказаться от цвета.

Но я сейчас продумываю вариант, при котором можно будет задавать цвет каждой строки целиком (из 7-255 цветов). Вот только думаю, может ли такое когда-нибудь кому-нибудь понадобиться. Тем более, что такой вариант однозначно предполагает переход с композитного сигнала на VGA.

arduinec
Offline
Зарегистрирован: 01.09.2015

arduinec пишет:

Похожий проект "VGA на Arduino Due": https://github.com/stimmer/DueVGA/

Схемы здесь (для VGA и TV): http://stimmer.github.io/DueVGA/
http://stimmer.github.io/DueVGA/breadboard.html
http://stimmer.github.io/DueVGA/tvout.html
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, посмотрел дэйташит на SAM8, там, в отличие от stm32, для SPI можно использовать практически любой коэффициент деления, тогда как для stm32 - только степени двойки. Наверное поэтому для sym32 и нет аналогов. Но я обошел это при помощи SPI slave.

А так - конечно, Due выглядит более многообещающим вариантом по сравнению с stm32f103 из-за впятеро большего объема памяти, на 17% более высокой тактовой частоты и большей свободы в выборе пиксельной частоты. Но, с другой стороны - неудобный формфактор и высокая цена.

 

PS. Естественно, проект не претендует на популярность, т.к. первый вопрос - "Зачем?". Но, все-таки, хотелось бы выслушать мнения по двум вопросам:

1. Какой интерфейс предпочтительнее: композитный TV-сигнал или VGA?

2. Имеет ли какой-то смысл предусмотреть возможность выводить каждую строку растра своим цветом?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сделал поддержку кириллицы.

Поддерживаются 4 кодировки: UTF-8, KOI8R, CP-1251 (Windows), CP-866 (Альтернативная ГОСТ). По умолчанию включена UTF-8, но управляющими последовательностями их можно переключать.

В дальнейшем планируется сделать настройки по умолчанию при помощи dip-переключателя, тобы устройство могло работать в любом из поддерживаемых режимов совместно с устройством, которое ничего не знает об управляющих последовательностях.

Но, пожалуй, данный вариант устройства приобрел более или менее законченные очертания - дальнейшая работа предполагается в расчете на VGA разъем и с ограниченной поддержкой цвета.

Поэтому публикую его полностью.

Схема:

Основной файл:

Заголовочный файл библиотеки screen.h:

01#ifndef SCREEN_H
02#define SCREEN_H
03 
04// Библиотечка использует stm32f103 для формирования полного TV-сигнала,
05// позволяет выводить на экран текст и рисовать линии.
06//    Возможности:
07// Позволяет установить один из двух видеорежимов: 480х240 или 512х240 пикселей,
08// Позволяет выводить текст фонтами размером 6х8 и 8х8 (жирный) пикселей, могут присутствовать на экране одновременно,
09// Позволяет рисовать линии при помощи управляющих последовательностей,
10// Автоматический перенос текста по достижении правого края экрана
11// Автоматический скроллинг по достижении нижнего края экрана
12//    Поддерживаются слежующие управляющие последовательности
13// ]~4 - переключение в режим 480 пикселей
14// ]~5 - переключение в режим 512 пикселей
15// ]~6 - переключение в режим узкого шрифта 6х8
16// ]~8 - переключение в режим широкого шрифта 8х8
17// ]~C- очистка экрана
18// ]~LXXXxYYY$ - рисование линии из текущей точки в указанную
19// ]~MXXXxYYY$ - перемещение текущей позиции рисования линии в указанную точку
20// ]~PXXXxYYY$ - перемещение текущей позиции печати текста в указанную точку
21//    где XXX и YYY - десятичная запись одно-, двух- или трехзначных координат.
22// ]~U - переключение в кодировку UTF-8
23// ]~1 - переключение в кодировку 1251
24// ]~A - переключение в кодировку 866 (альтернативная ГОСТ)
25// ]~K - переключение в кодировку KOI-8
26//    управляющая последовательность может (но не обязана) заканчиваться символом перевода строки, который в этом случае опускается,
27//    в тексте символ 0x13 обрабатывается как конец строки, другие однобайтовые управляющие символы пока не поддерживаются.
28//
29//     !!!  пока не предпринимались попытки борьбы с помехами на экране !!!
30 
31#define SCREEN_MODE_480 0  // режим дисплея разрешением 480х240
32#define SCREEN_MODE_512 1  // режим дисплея разрешением 512х240
33#define CHAR_SIZE_6x8 0  // режим узких символов 6х8
34#define CHAR_SIZE_8x8 1  // режим широких символов 8х8
35#define CP_UTF8 0  // режим кодировки UTF-8
36#define CP_1251 1  // режим кодировки CP-1251
37#define CP_866 2   // режим кодировки CP-866 (Альтернативная ГОСТ)
38#define CP_KOI8 3  // режим кодировки KOI8R
39 
40extern void scrollUp();              // пролистывание экрана на одну строку (8 пикселей) вверх и очистка последней строки
41extern void chessField();            // рисует на экране "шахматное" поле с "квадратиком" 16х16 пикселей
42extern void setScreenMode(int mode); // установка одного из двух режимов 480х240 или 512х240 пикселей
43extern void setCharSize(int size);        // выбор фонта 6х8 или 8х8 пикселей
44extern void setCodePage(int page);        // выбор кодовой страницы
45extern void setXYchar(uint32_t x, uint32_t y); // устанавливает текущую позицию вывода символа
46extern void setXYpix(uint32_t x, uint32_t y); // устанавливает текущую позицию вывода линии
47extern void printChar(unsigned char ch); // вывод символа в текущую позицию
48extern void lineTo(uint32_t x1, uint32_t y1);  // рисует линию из текущей позиции в указанную (вместо moveTo(); следует использовать setXY(); )
49 
50#endif

файл библиотеки screen.cpp:

файлы фонтов:

a_Small_Rus.c

и font_c.c:

На всякий случай напомню, что данный контроллер должен отображать на экране то, что передается ему извне, т.е.  другого контроллера. Для проверки была использованка Mega со следующим скетчем:

Для того, чтобы добиться желаемого результата вход контроллера stm32 Serial1 должен быть подключен к выходу Меги Serial3.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Вообще-то, смысл вашего проекта наверное в том, чтобы наложить надписи на видео от другого источника. Сразу приходят на ум: ОСД для дрона самопального, какой-то радар заднего хода автомобиля с выводом растояний и положения помехи на экран медиасистема, смешанный с видео от камеры заднего вида и т.п.

А вот как VGA не уверен, что кому-то будет интересно. Тем более что аналоговых телеков пока еще дофига, а вот монитор лишним не бывает, всегда куда-то нужнее, чем ардуино к нему подключать.

Только для реализации ОСД что-то нужна схематика микшера видео, и синхронизация от внешнего источника видео.

Вообще-то, я что-то похожее на ОСД на 328-ом видел, на форуме любителей радимоделей.

zelya
Offline
Зарегистрирован: 15.02.2021

почему бы не использовать делитель на 5 (72/5=14.4, близко к 14.318), если используешь внешнюю синхронизацию, и тогда с строками длительностью в 63.5мкс, (NTSC timing)

можно будет как усеченный PAL-M или NTSC использовать.
отдельно буфер строки 904, 912 или 920 бит (113, 114 или 115 байт, 904 укладывается в стандарт, 912 чуть перебором, а 920 уже за пределами ntsc) и там как колорбурст так и цвет выводить.
пауза (0-ли), (после синхросигнала 5 байт 0xBB или 11001100), пауза (0-ли), потом цвет в виде декодированной последовательности (abcd)(efgh) - две тетрады.

чуть позже дополню с тетрадами, в ods посчитаю варианты как pal так и ntsc.

zelya
Offline
Зарегистрирован: 15.02.2021

для пал подсчитал сочетания, если как у Вас 1 битное:

0000-0000
0001-0100
1001-1100
1110-1011
1011-1110
1111-1111

это стандрартные rgb, нечётный и четные строки, т.е. последовательно 16 цветов, но в 1битном кодировании PAL получилось только 6 независимых цветов.
по NTSC наверняка можно обыграть все 16 комбинаций 4битовых последовательностей, но какие они дадут цвета - не могу сказать, надо пробовать.

я попробую с использованием двух SPI каналов, двухбитные последовательности.
в виде двух буферов по 228 байт, и выдача параллельно с PA6 и PB9 через резисторы 580 и 240 Ом,
и 0 - на обоих бит=0, 1 на 1=1, на 2=0, 2 на 1=0, на 2=1, и 3 на 1=1, на 2=1.
и конденсатор там не нужен. выход нагружен входным сопротивлением в 75 ом.
тогда возможно будут такие комбинации:

1111-1111
1211-1112
1122-1221
2112-2211
1222-1222
2222-2222
2322-2223
3233-3332
3223-3322
2333-2333
3333-3333

всего 11 комбинаций.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zelya пишет:

отдельно буфер строки 904, 912 или 920 бит (113, 114 или 115 байт...

904*240/8=27120 байт, откуда в BluePill столько памяти?

zelya
Offline
Зарегистрирован: 15.02.2021

Там на байт несколько точек. Вы же сами по spi выдаёте сигнал.
А тут сигнал на частоте цветоразностной сразу даёт цвет по pal или ntsc.
У меня указаны битовые последовательности в случае 1 спи (0/1)
Или при использовании 2 спи 0 (синхро), оба канала на 0, 1(с большим резистором в 1, 2 меньший резистор в1, больший в 0, 3 оба в единице.
Если использовать делитель 10, будет 4 точки на байт и на 1 спи.

И буфер не предлагаю сразу на весь экран, это буфер строки. Пока одна передается, другая формируется или от знакогенератора и текстового буфера, или с строки из графического фрейм буфера.
Другого простого варианта сделать унифицированный вывод видео при разных входных данных и двух немного разных методах кодирования цвета.
И буфер строки формируется на всю строку, на 64мксек. Тогда 20% неизменно, а 80% формируется из известных данных. Потом по таймеру запускаем спи и формируем четную строку, делаем другие задачи.
Тут можно любую ртос с переключением таймером в 15734/15625 раз. На таймере запуск спи и инициация заполнения 2 буфера.
Получаем при вашей схеме дополнительно 2*114 байт на 2 строки, если быстрый контроллер, то можно в онлайн формировать, 1 буфером.
Вам же и цвет и кучу всего захочется.
А тут сделать механизм формирования строки и не важно, какой буфер в целом и как им пользуются, лишь бы период формирования строки укладывался в 64 мксек.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zelya пишет:
И буфер не предлагаю сразу на весь экран, это буфер строки. Пока одна передается, другая формируется или от знакогенератора и текстового буфера, или с строки из графического фрейм буфера.

Каков объем графического фрейм буфера 904х240 точек?

Чтобы "формировать" строку, надо откуда-то брать данные. Откуда брать данные для графического экрана? Вы знаете другой источник информации кроме фрейм буфера?

zelya
Offline
Зарегистрирован: 15.02.2021

елы-палы. есть графический фрейм-буфер или текстовый фрейм-буфер, т.е. массив байт грубо говоря 80х24.

используем 2 буфера строк по 904..912 точек. ссылка на следующий буфер, номер строки, чет/нечет полукадр,

обычная задача по семафору, имея переменную номер строки, четный или нечетный полукадр, ссылку на строчный буфер и исходные данные - рисует как ей душа пожелает.

когда происходит вызов переполнения таймера строки (15625 или 15734 Гц) выбор:

ссылки на строковые буфера: новый=предыдущий, текущий=следующий, следующий=новый.
запускаем spi,
увеличиваем номер новой строки. если он больше>262+четный&1, то номер=1, четный=(++четный)&1.
(это я сразу пишу в с кодировании)

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

в этих 904 строках 20% практически неизменны, это вне отображаемого пространства.
а около 704..720 точек - их сочетание по тетрадам, т.е. на 177..180 точек даст всевозможные состояния. выше - цветное разрешение сложно предсказать.
если будет ч/б изображение - после строкового импульса не выставлять color burst и будет чб сигнал высокого разрешения, до 704..720 точек разрешающей способности. и можно все поля сделать детально по стандарту.
тогда, если формирование буфера строки не прерываемо планировщиком - то в строках не будет помех, будет независимость от состояния исходного буфера.
если свести до графики CGA адаптера, т.е. 4 цвета 320х200, то можно использовать 1spi, и делитель на синхросигнал для spi будет равен 10, т.е. синхросихнал будет 7.2МГц, тогда строчный буфер можно в 2 раза уменьшить.

при использовании 1spi+1 вывод синхро, как у тебя, то при 3.3V, 2 резистора номиналом 560 ом на синхро, 220 ом на spi - получим при 75ом входной нагрузки 0, 0.3, 1.06 вольт. т.е. монохромный или в случае color burst цветной сигнал одной тональности.
я на выходных поищу bluepill и накарябаю код. заведу через rca или scart на дисплей, посмотрю что получится.
можно для расширения диапазона использовать 2spi и оба синхронизировать с делителя, тогда у нас получится 4 значения напряжений:
0, 0.3, 0.76, 1.06 вольт. - с ними вариантов будет больше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

"В огороде бузина, а в Киеве - дядька."

Я не спрашивал, как реализовать текстовый буфер.

И меня совершенно не интересует режим "как CGA" 320х200.

Тем более, я ничего не спрашивал про резисторы.

Меня интересует один вопрос: как разместить графический буфер 904х240 в памяти BluePill? Желательно в цветном варианте.

zelya
Offline
Зарегистрирован: 15.02.2021

е-ма, не весь буфер, а только буфер строки!!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что "буфер строки"?

Зачем мне буфер строки?

Где хранить то, что нарисовано на экране?

zelya
Offline
Зарегистрирован: 15.02.2021

Это вторичный буфер, который не используется для работы пользователем, он в количестве двух штук используется прерыванием для организации вывода видео, а формирование его уже идёт хоть от текстового буфера, хоть от графического, хоть налету, например при распознавании postscript языка. Чтобы мог организовать хоть как в спектруме графические атрибуты, хоть на каждую точку rgba, текст. Вывод будет отвязанный от реализации основного буфера, связь через 1 функцию конверсии с основного буфера в строковый. Сначала отработать что мы можем вообще выжать из твоего варианта выдачи видеосигнала, а потом уже на основном буфере уже определиться как кодировать для пользователя.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну опять, я про Фому, а Вы - про Ерему!

zelya, у меня к Вам просьба: либо ответьте на вопрос из 3-й строки сообщения №26, либо заведите тему и пишите туда все, что хотите. Но не нужно помещать в данную тему то, что к ней не имеет ни малейшего отношения.

igorborby_76
Offline
Зарегистрирован: 07.01.2022

у меня несколько вопросов, в начале красава, достойное решение.
1. к монитору прикрутили?
2.115200 это макс скорость порта?
3. можно ли прикрутить клаву и ответ по uart в обратку сканов клавы

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. К какому монитору?

2. Строго говоря, там чистый USB, поэтому на физическую скорость эта константа влияния не оказывает.

3. Если есть синяя изолента - почему нет!

Туцик
Туцик аватар
Offline
Зарегистрирован: 31.03.2020

А почему не на esp? Ща врде блюпилы как крыло самолета стоят, да и памяти побольше в есп.

igorborby_76
Offline
Зарегистрирован: 07.01.2022

прикрутил 230400, полет нормальный, все устраивает.
прикладываю результат
https://youtu.be/_e-hXnwsUxU
убрать бы мусор и немного стабильности, и буду пытаться запилить свой маленький не доретро компик

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Туцик пишет:

А почему не на esp? Ща врде блюпилы как крыло самолета стоят, да и памяти побольше в есп.

1. Когда я покупал, было 105-110р. Пока не закончились.

2. Я не встречал нормального дэйташита на esp. Зато где-то слышал, что его в природе не существует.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

igorborby_76 пишет:
убрать бы мусор и немного стабильности, и буду пытаться запилить свой маленький не доретро компик

Я начал возиться с аппаратной реализацией (нужно добавить одну-две простейшие логические микрухи), но наткнулся на непонятки. Потом выяснил, что конкретный экземпляр stm выдает на одной из используемых ног ненормальное напряжение (больше вольта логического нуля). Но к тому моменту занялся другими проектами и возвращаться к этому уже не хотелось.

igorborby_76
Offline
Зарегистрирован: 07.01.2022

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

Logik
Offline
Зарегистрирован: 05.08.2014

Мне одному заметно что это не 4К? И даже вроде не HD...

igorborby_76
Offline
Зарегистрирован: 07.01.2022

Logik пишет:

Мне одному заметно что это не 4К? И даже вроде не HD...


Вы сударь, часом не ошиблись ссайтом малинки, попали на сайт арду. :-)

Logik
Offline
Зарегистрирован: 05.08.2014

Понял. Тут можна поговнячить.. :-)

igorborby_76
Offline
Зарегистрирован: 07.01.2022

Logik пишет:

Понял. Тут можна поговнячить.. :-)


шкодить добрым саморитянам, но для чего. если есть достойные предложения, - тогда можно поерничать.
А засрать мона все, даже себе на полу дома

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano]</p> <p>[quote=igorborby_76 пишет:

 выяснил, что конкретный экземпляр stm выдает на одной из используемых ног ненормальное напряжение (больше вольта логического нуля).

дай попробую угадать, уж не разделяется ли эта нога с SERIAL?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

дай попробую угадать, уж не разделяется ли эта нога с SERIAL?

с каким из Сериал? - их тут 4

Да и какая связь с Сериал, колись

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

дай попробую угадать, уж не разделяется ли эта нога с SERIAL?

с каким из Сериал? - их тут 4

Да и какая связь с Сериал, колись

я в важгаде пост выкладывал, об использовании третьего таймера, с осциллограммами, реплика была про грань добра и зла )))

b707
Offline
Зарегистрирован: 26.05.2017

казалось бы какая связь... плата другая. пины другие, аддон другой...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

казалось бы какая связь... плата другая. пины другие, аддон другой...

а только наружная обвязка может подтягивать уровень, это либо LED либо SERIAL других не знаю, может они и есть, нужен пин нужна схема, чудес не бывает...правда еще бывает вжаренная логика )))
PS я жеж говорил - попробую угадать...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

Мне одному заметно что это не 4К? И даже вроде не HD...

Сэр что-нибудь слышал о такой науке как арифметика?

Для HD нужно 1920*1080/8=259200 байт видеопамяти, где столько взять в Блупилле?

igorborby_76
Offline
Зарегистрирован: 07.01.2022

ua6em пишет:

b707 пишет:

я в важгаде пост выкладывал, об использовании третьего таймера, с осциллограммами, реплика была про грань добра и зла )))


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

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Logik пишет:

Мне одному заметно что это не 4К? И даже вроде не HD...

Сэр что-нибудь слышал о такой науке как арифметика?

 Да сэр! Арихетика - моя слабость. Все больше интригалы, да интригалы.

andriano пишет:

Logik пишет:

Мне одному заметно что это не 4К? И даже вроде не HD...

Для HD нужно 1920*1080/8=259200 байт видеопамяти, где столько взять в Блупилле?

А вот проблемы индейцев шерифа не волнуют. Выбираем правильно кристалл под задачу.

 

igorborby_76
Offline
Зарегистрирован: 07.01.2022

с интрегалами разобрались?. Займемся нашими патифонами, у кого есть предложения?
реализовать триггер шмидта https://uk-parkovaya.ru/wp-content/uploads/1/1/6/11635e811bf116fadc250ba...

руководствуясь к примеру https://lib.qrz.ru/node/5480

или типо того https://forum.cxem.net/uploads/monthly_12_2014/post-186391-0-76944100-14...

просто у меня нет осциллографа для измерения форм сигналов с частотой более 20 Мгц, а то бы помог. не разжился я ещё

может за основу, для формирования _П_П_П_ взять входной каскад на полевике из схемы https://fornk.ru/2990-samodelnyj-chastotomer-na-attiny2313/

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А в чем вопрос-то?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

igorborby_76 пишет:
с интрегалами разобрались?. Займемся нашими патифонами, у кого есть предложения? реализовать триггер шмидта https://uk-parkovaya.ru/wp-content/uploads/1/1/6/11635e811bf116fadc250ba... руководствуясь к примеру https://lib.qrz.ru/node/5480 или типо того https://forum.cxem.net/uploads/monthly_12_2014/post-186391-0-76944100-14... просто у меня нет осциллографа для измерения форм сигналов с частотой более 20 Мгц, а то бы помог. не разжился я ещё может за основу, для формирования _П_П_П_ взять входной каскад на полевике из схемы https://fornk.ru/2990-samodelnyj-chastotomer-na-attiny2313/

LM393 и голову не морочить