Урок посвящен практическому программированию OSD-контроллера MAX7456. Научимся создавать и загружать шрифты, выводить OSD-информацию на экран монитора.
Предыдущий урок Список уроков Следующий урок
Для проверки и отладки программ урока я собрал систему из урока 66. Она состоит из:
- платы Arduino Nano;
- модуля MAX7456 (схема модуля в уроке 66);
- видеокамеры;
- автомобильного монитора;
- блока питания 12 В.
Плата Ардуино подключена стандартным кабелем к USB компьютера, от которого и получает питание. Модуль MAX7456 получает питание от платы. Видеокамера и автомобильный монитор запитаны от блока питания 12 В.
Должна быть установлена библиотека MAX7456.h. Я использовал исправленный вариант:
Он корректно работает с таблицей символов ASCII и русскими шрифтами.
Создание файла шрифта.
Перед тем как использовать микросхему MAX7456 в ее EEPROM необходимо загрузить знакогенератор.
От фирмы-призводителя микросхема поступает с таким знакогенератором.
Вряд ли читателей моего сайта устроят надписи в виде иероглифов. Да и остальные символы не соответствуют кодировке ASCII. Некоторые функции библиотеки правильно работать не будут.
Прежде всего, необходимо создать файл шрифтов, которые будут загружены в память знакогенератора. Естественно можно взять готовый.
Для файлов шрифтов OSD-генератора MAX7456 обычно используются два формата: mcm и h.
Файлы mcm формата используются в программном обеспечении фирмы Maxim. Файлы такого типа представляют собой последовательность данных в текстовом двоичном виде.
mcm-файлы используются для загрузки знакогенератора непосредственно от компьютера.
Если знакогенератор загружается из платы Ардуино, то, как правило, применяется заголовочный файл с расширением .h. Он включается в программу загрузчика шрифта (#include "MAX7456_Font.h"). Данные файла при компиляции размещаются в программной памяти (FLASH) микроконтроллера с использованием модификатора PROGMEM. В оперативной памяти просто не хватает места. Об этом способе хранения данных написано в уроке 27.
Далее запускается программа Ардуино и данные шрифта загружаются из программной памяти микроконтроллера в EEPROM знакогенератора MAX7456.
Выглядит содержимое h-файла так.
Чтобы использовать все возможности MAX7456 необходимо научиться применять готовые файлы форматов mcm и h, конвертировать их друг в друга и редактировать информацию файлов, т.е. создавать свои собственные символы.
Все это с легкостью можно делать с помощью программы MAX7456 Font Editor. Программа с открытым кодом, размещена на GitHub. Можно загрузить исполняемые модули здесь MAX4756Editor.zip.
Программа проста в использовании. Я поясню совсем коротко.
Запускаете файл MaxFontEditor.exe.
Везде пустые поля.
Кнопкой OPEN можно загрузить файл шрифта в форматах mcm или h. В правом поле появляются изображения символов знакогенератора.
Правой кнопкой мыши можно выбрать любой символ. Его карта появится в левом поле.
Выбрав один из цветов в верхнем левом поле,
можно задать цвет каждого пикселя карты символа.
- Синий означает, что пиксель будет прозрачным, те. для него используется фоновое изображение.
- Белый и черный – цвета отображения пикселя символа.
После редактирования файл шрифта можно сохранить:
- в формате mcm – SAVE AS MCM;
- или в формате h – SAVE AS H.
Можно загрузить файл в одном формате, а сохранить в другом. Т.е. конвертировать форматы файлов.
Кнопки IMPORT IMAGE и EXPORT IMAGE позволяют редактировать битовые карты символов в других растровых редакторах и загружать их в MaxFontEditor. Я думаю, что без этой операции можно обойтись.
Исходно в микросхему MAX7456 на заводе изготовителе записан такой знакогенератор.
Я буду использовать знакогенератор с кириллицей согласно кодировке ASCII.
Загрузка знакогенератора в MAX7456.
Я попробовал для записи шрифта использовать загрузчик фирмы Maxim MAX7456_Font_Updater.rar. Загрузить все символы правильно не удалось ни разу. В 2-5 местах у соседних символов коды повторялись. Программа регулярно сбоила.
Написал свой загрузчик знакогенератора:
Работает идеально.
В папке должен находиться, как минимум:
- файл MAX7456_Font_Loader.ino
- и файл шрифта в h формате.
В файле шрифта имя массива данных должно быть fontdata.
PROGMEM const byte fontdata[16384] = {
В загрузчике MAX7456_Font_Loader.ino должен быть включен файл шрифта с нужным именем:
#include "r.h"
Мой пакет настроен на загрузку знакогенератора с кириллическим символами ASCII кодировки r.h
Я использую именно этот знакогенератор.
Последовательность действий для загрузки знакогенератора MAX7456.
Установить библиотеку max7456-master_1.zip
Загрузить, распаковать пакет MAX7456_Font_Loader.zip
С помощью Aduino IDE загрузить MAX7456_Font_Loader.ino в плату Ардуино.
Открыть монитор последовательного порта (Ctrl + Shift + M).
На OSD-мониторе отобразится таблица текущего шрифта.
В окне монитора последовательного порта будет
Если желание загрузить новый шрифт осталось, то необходимо отправить символ 'y'.
После этого начнется загрузка нового знакогенератора в EEPROM MAX7456.
В окне монитора побегут числа от 0 до 255 и появится надпись Upload finished (Загрузка закончена).
На OSD мониторе отобразится новый, только что загруженный шрифт.
Программирование OSD-дисплея MAX7456.
В этом разделе проверим работу основных функций библиотеки.
Все достаточно просто и, скорее всего, было понятно и в предыдущем уроке при описании функций библиотеки MAX7456. Я приведу конкретные примеры.
Очистим экран (заполним пробелами), выведем надписи ”mypractic.ru” и “Проверка MAX7456”.
#include <SPI.h>
#include <max7456.h>
Max7456 osd;
void setup() {
SPI.begin();
osd.init(10);
osd.activateOSD();
// очистка экрана (заполнение пробелами)
for(int i=0; i<480; i++) {
osd.printMax7456Char(' ', i >> 4, i & 0x0f );
}
osd.print("mypractic.ru", 16, 14);
osd.print("Проверка MAX7456",6,2);
}
void loop() {
}
Отделим заголовок горизонтальной чертой. Нарисуем ее символами с кодом 0xda.
#include <SPI.h>
#include <max7456.h>
Max7456 osd;
void setup() {
SPI.begin();
osd.init(10);
osd.activateOSD();
// очистка экрана (заполнение пробелами)
for(int i=0; i<480; i++) {
osd.printMax7456Char(' ', i >> 4, i & 0x0f );
}
osd.print("mypractic.ru", 16, 14);
osd.print("Проверка MAX7456",6,2); // вывод текста
for(int i=0; i<30; i++) { // подчеркивание
osd.printMax7456Char(0xda, i, 3 );
}
}
void loop() {
}
Добавим строку с числами.
Для этого добавим в конце setup()
// строка с числами
osd.print(12.3456789,2,5, 3, 8);
osd.print(12.3456789,15,5, 2, 1);
osd.print(12.3456789,20,5, 2, 0);
Добавим обычную строку, инверсную строку и мигающую строку.
osd.print("Обычная строка", 2, 7); // обычная строка
osd.print("Инверсная строка", 2, 9, 0, 1); // инверсная строка
osd.print("Мигающая строка", 2, 11, 1, 0); // мигающая строка
Отключим фоновое изображение. Превратим MAX7456 в обычный видеоконтроллер. Все новые строки добавляем в конце setup().
osd.activateExternalVideo(false); // отключение фонового изображения
Включим фоновое изображение и отключим OSD-текст.
Вместо
osd.activateExternalVideo(false); // отключение фонового изображения
поставим
osd.activateOSD(false); // отключение OSD-текста
Проверим смещение. Заставим изображение двигаться в горизонтальном и вертикальном направлениях.
#include <SPI.h>
#include <max7456.h>
Max7456 osd;
void setup() {
SPI.begin();
osd.init(10);
osd.activateOSD();
// очистка экрана (заполнение пробелами)
for(int i=0; i<480; i++) {
osd.printMax7456Char(' ', i >> 4, i & 0x0f );
}
osd.print("mypractic.ru", 16, 14);
osd.print("Проверка MAX7456",6,2); // вывод текста
for(int i=0; i<30; i++) { // подчеркивание
osd.printMax7456Char(0xda, i, 3 );
}
// строка с числами
osd.print(12.3456789,2,5, 3, 8);
osd.print(12.3456789,15,5, 2, 1);
osd.print(12.3456789,20,5, 2, 0);
osd.print("Обычная строка", 2, 7); // обычная строка
osd.print("Инверсная строка", 2, 9, 0, 1); // инверсная строка
osd.print("Мигающая строка", 2, 11, 1, 0); // мигающая строка
}
void loop() {
// проверка смещения
for(byte n=0; n<3; n++) {
for( byte i=0; i<32; i++ ) {
osd.setDisplayOffsets(32, i);
delay(10);
}
for( byte i=31; i!=0; i-- ) {
osd.setDisplayOffsets(32, i);
delay(10);
}
}
for(byte n=0; n<3; n++) {
for( byte i=0; i<64; i++ ) {
osd.setDisplayOffsets(i, 16);
delay(10);
}
for( byte i=63; i!=0; i-- ) {
osd.setDisplayOffsets(i, 16);
delay(10);
}
}
}
Качество видео оставляет желать лучшего.
Напишем простейший монитор. Он принимает символы с последовательного порта и выводит их на экран монитора. Из управляющих кодов он обрабатывает коды 13 – возврат каретки и 10 – перевод строки.
include <SPI.h>
#include <max7456.h>
Max7456 osd;
int x=0,y=0;
void setup() {
Serial.begin(9600);
SPI.begin();
osd.init(10);
osd.activateOSD();
// очистка экрана (заполнение пробелами)
for(int i=0; i<480; i++) {
osd.printMax7456Char(' ', i >> 4, i & 0x0f );
}
}
void loop() {
if( Serial.available() != 0 ) {
byte ccc= (byte)Serial.read();
if( ccc == 13 ) x=0;
else if( ccc == 10 ) y++;
else {
osd.printMax7456Char(ccc, x, y);
x++;
if(x > 29) {
x=0;
y++;
}
}
}
}
Кириллические символы монитор выводит неправильно. Не соответствует кодировка знакогенератора.
Работа MAX7456 с разными системами видеосигналов.
В микросхеме MAX7456 существует возможность выбора системы аналогового видеосигнала: NTSC или PAL. В исходной библиотеке Max7456.h метод для выбора системы отсутствует. Я добавил его в новой версии:
Описание в предыдущем уроке.
При неправильно установленной системе OSD-генератор работает некорректно. Может все смещаться на экране, информация может вообще не отображаться.
Еще надо учитывать, что в системе NTSC строк меньше, чем в PAL, значит меньше разрешение экрана. Лучше вывод информации подбирать на конкретной камере и дисплее.
На сайте, в новой рубрике Проекты Ардуино, появился практический пример применения OSD-генератора MAX7456. Это электронный прицел для сверлильного станка.
Надеюсь, я сумел убедить вас, что работать с OSD-контроллером очень просто.





















C интересом прочитал незнакомую для меня тему — спасибо за простое и понятное изложение.
it’s work just change the «PROGMEM const byte fontdata[16384] =»
to «PROGMEM const char fontdata[16384] =»
Добрый день, Эдуард!
Ваши уроки — это большой труд, читать их одно удовольствие. Спасибо.
Тема OSD на мой взгляд достаточно узко специализированная, особенно для PAL/NTSC форматов (стремительно устаревают). В этой связи у меня вопрос, если сочтёте корректным ответить, а как применяет это решение Ваш заказчик, на каком устройстве использует OSD?
Здравствуйте!
Я разрабатывал ему программу для точного сверлильного станка. Выяснилось, что тяжело попадать сверлом в метку для будущего отверстия. С помощью OSD генератора мы сделали электронный прицел. В будущем планируется выводить на этот же экран информацию контроллера станка, которая сейчас отображается на отдельном дисплее.
Я заинтересовался этой темой из за желания совместить камеру заднего вида на авто, которая включается при включении задней передачи на 2-дин магнитолу с парктроником! должно круто получиться! и ещё можно на ту же ардуину зацепить датчик положения руля и выводить траекторию движения назад! как на дорогих иномарках))))
Я тоже именно этим озадачился на своем Форд Мондео 4, где родной блок слишком дорогой, а есть руки и желание собрать свое. Если есть успехи, пожалуйста, дайте мне знать. Я хочу рисовать плавные динамические линии, которые меняют свой угол от положения руля. Пока понимаю, что придется заполнить всю таблицу своими символами в виде кривых с определенным углом, потом это все как-то подставлять и вычислять. Пока думаю, что это сложно и арудуинке будет тяжеловато, но есть дешевая stm32f103c8, которая заметно можнее Меги и она есть в ардуино. Планирую собрать все на ней.
Доброго дня и здоровья !!! Проделана огромная работа, за что благодарность и уважение ! У меня есть вопрос, можно ли на монитор вывести символ но увеличенный в размере в несколько раз и при этом еще при помощи допустим кнопок управления передвигать его по экрану монитора ?
Здравствуйте!
Да, можно. Я намерен создать новый раздел на сайте — проекты Ардуино. Одним из таких проектов я собираюсь выложить проект электронного прицела. Символ, состоящий из 3×2 стандартных знакоместа можно кнопками двигать по экрану. Положение его запоминается в EEPROM. В качестве символа я использую крест для прицеливания, но можно задать любой другой. В углу выводятся координаты прицела.
Эдуард !!! Я очень рад что у Вас есть такая задумка, если что то надо помочь, я готов общаться. У меня есть уже такой прицел, но на другой основе и мне не нравится. Я видел у одного товарища готовую конструкцию, он покупал где то готовую плату, на ней была атини не помню какая и мах и 5 кнопок управления. В памяти маха было примерно 10 видов перекрестий что очень здорово. Для воздушки свое с мил дотами, и для прочего оружия. Можем общаться в скайпе или в дискорде, что на много лучше. С Уважением дед Игорь!
У меня не задумка. У меня есть готовая разработка. Я делал ее для сверлильного станка. Надо только выложить на сайт.
Привет Эдуард !!! Жду с нетерпением как выложишь, кинь ссылку пожалуйста. С Уважением дед Игорь !!!
Эдуард, вот ссылка на то что я хочу сделать. Платить такие большие деньги пенсионеру не под силу, вот и прошу вас помочь. С Уважением дед Игорь !
https://en.e-pard.com/ebay-uk/order/id382390535111
Постараюсь на этой неделе выложить мой вариант.
Привет Эдуард !!! А куда будешь выкладывать, где искать ? С Уважением !
Здравствуйте!
Создам новую рубрику — Проекты Ардуино.
Даваай, только ссылку кинь не забудь про деда. С уважением !
Привет Эдуард !!!На форуме уже есть такая рубрика
Здравствуйте!
Форум — это для обсуждения.
Понятно, буду ждать !!!
Привет Эдуард !!! Извени за беспокойство но только щас руки дошли до дела,не могу загрузить библиотеку в мах, пишет ошибку:
Arduino: 1.6.5 (Windows 7), Плата»Arduino Nano, ATmega328″
MAX7456_Font_Loader.ino: In function ‘void setup()’:
MAX7456_Font_Loader:41: error: invalid conversion from ‘const byte* {aka const unsigned char*}’ to ‘const char*’ [-fpermissive]
In file included from MAX7456_Font_Loader.ino:5:0:
C:\arduino-1.6.5-r5\libraries\max7456-master/max7456.h:234:14: error: initializing argument 1 of ‘static void Max7456::getCARACFromProgMem(const char*, byte, byte*)’ [-fpermissive]
static void getCARACFromProgMem(const char *table, byte i,charact c);
^
invalid conversion from ‘const byte* {aka const unsigned char*}’ to ‘const char*’ [-fpermissive]
Здравствуйте!
У меня компилируется без проблем. Наверное, другая версия Arduino IDE.
Попробуйте воспользоваться советом из 2го комментария к этому уроку.
Я не пойму что он там пишет
У меня вот такая строка: Max7456::getCARACFromProgMem(fontdata + i*64, 0, currentChar);
Изменить «PROGMEM const byte fontdata[16384] =»
на «PROGMEM const char fontdata[16384] =»
Напишите, пожалуйста, будет работать?
Max греться не должен. Аппаратная ошибка.
Даже если не подключите Ардуино MAX должен транслировать изображение с камеры.
И еще, подключаю питание и сильно греется мах
Куда вписать эту строчку?
Просто напиши всю строку как нужно !!!
вот такая строка: Max7456::getCARACFromProgMem(fontdata + i*64, 0, currentChar);
Где-то вначале есть объявление
PROGMEM const byte fontdata[16384] =
Замените в ней byte на char.
В файле r.h.
r.h это же код, в нем вообще нет ни каких надписей
Он начинается с
PROGMEM const byte fontdata[16384] = {
В моем скетче нет такова объявления100%
Еще раз повторю, в файле r.h
Извини Эдуард, заморочил и тебе и себе голову, все понял и исправил, все работает, благодарю !!! С Уважением дед Игорь !
Хорошо. Я исправлю на сайте.
Эдуард здравствуйте. У меня плата micro minimosd прошивка работает нестабильно. При включении то работает то нет, другие прошивки для безпелотников работают без сбоев. Проблема точно не в питании…..
Разобрался с платой micro minimosd… На плате не предусмотрена связь PIN10CS пришлось подпаиваться проводками.
Привет Эдуард !!! Здоровья и благополучия !!! У меня возникла проблема с загрузкой библиотеки в мах, пишет: Неверная библиотека найдена в C:\Program Files (x86)\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в C:\Program Files (x86)\Arduino\libraries\libraries
Неверная библиотека найдена в C:\Program Files (x86)\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в C:\Program Files (x86)\Arduino\libraries\libraries
Здравствуйте! Спасибо за пожелания.
Вы правильно скопировали библиотечные файлы в предназначенные для них каталоги? Не забыли в Файл->Настройки->Размещение папки скетчей задать путь? Как это сделать в уроке 9 подробно описано.
Да, все сделано правильно, причем эту ошибку выдает в версии 8, а версии 6 совсем другие ошибки.
когда нажимаю проверку, все в норме, а запись выдает ошибки
во что накотал: avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xd3
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xd3
Проблема загрузки в плату. Помощь по загрузке: http://www.arduino.cc/en/Guide/Troubleshooting#upload .
Неверная библиотека найдена в C:\Program Files (x86)\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в C:\Program Files (x86)\Arduino\libraries\libraries
Неверная библиотека найдена в C:\Program Files (x86)\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в C:\Program Files (x86)\Arduino\libraries\libraries
А другие программы загружаются?
Проверяйте тип платы, номер порта, могут быть аппаратные ошибки.
я загружаю через RX TX, это не может быть проблемой ?
Если вовремя кнопку сброс нажимаете, то должно загружаться.
а вовремя это когда ???!
Почитайте в уроке по Arduino PRO MINI. 45й или 46й точно не помню.
ок
Вот что выдало в последний раз ; avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xe2
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xe2
Проблема загрузки в плату. Помощь по загрузке: http://www.arduino.cc/en/Guide/Troubleshooting#upload .
Так вы сброс вовремя давите? Там надо наловчиться.
да, как только пишет загрузка сразу нажимаю
нажимаю на арду мини
Правильно сигналы TxD и RxD подключаете? Там перекрестная схема подключения. Посмотрите в уроке 46.
Конечно Эдуард !!!, Я думаю что я ни тем загружаю, у меня просто преобразователь сигнала на CP2102 b FTDI FT232
Если все правильно подключено, установлен драйвер, то с любым конвертером интерфейсов должно загружаться.
драйвер установлен все четко определяется с назначенным ком портом, но запись не происходит
при прогрпммировании ошибок по скечу нет, только по соединению то что я уже выше скидывал
У меня еще есть USBAS но его надо по другому подключать а это уже сложно так как все уже в плате впаяно
Уже затрахался, 2й день сижу
Надо все тщательно проверить. Есть вариант, что бутлоадер в микроконтроллере испорчен. Если плата новая, то такого быть не должно.
платы новенькие, еще в них ничего не грузилось, а в арду мини в новых должно что нибудь запрограммировано?
Обычно мигающий светодиод.
один горит один мигает
но на преобразователе светодиоды стоят и на рх и на тх, тх при загрузке только тх тускло и редко моргает
вот я идиот, в платах я поставил арду мини, а надо было про мини, все прошил, Эдуард, огромное тебе гранд мерси, извини за отнятое время, щас буду второй скетч запихивать с перекрестием.С Уважением дед Игорь !!!!!!!!
Не расстраивайтесь. Все совершают глупые ошибки.
эт точно, 2 дня, ужас !!!!!
Еще один вопрос, перекрестие на экране не большое, как увеличить его размеры ?
Эдуард, Еще один вопрос, перекрестие на экране не большое, как увеличить его размеры ?
Программа рассчитана на маркер размерностью 3×2 знакоместа. Можно изменить вид маркера, но для увеличения размеров надо переписывать программу.
во блин, что делать ? уж больно маленькие крестики
а я думал что чуток изменить надо п скече
ну вот любую букву или цифру сделать в 3 раза больше это только программно или надо изменять букву в знакогенераторе ?
Там матрица из 6 знакомест перемещаются по экрану. Двигать больше знакомест — это серьезное изменение программы. Меняется математика, распределение памяти знакогенератора и т.п.
понял, это ужасно, и не разрешимо для меня, значит все напрасно, я конечно очень огорчен.
я одно не пойму, как же этот парень который продает готовое изделие мог поместить 20 видов перекрестия в знакогенераторе, и у него прицельные планки большие, это вопрос конечно !!!
Я же не говорю, что это не возможно. Я говорю, что программа серьезно меняется. К тому же изображения перекрестьев, особенно больших, занимают место в знакогенераторе, уменьшая количество допустимых текстовых символов. Может, его устройство вообще не способно выводить текстовую информацию.
Динамический знакогенератор. То есть — постоянно перезаписываемый при смене вида. Требуется внешнее ППЗУ достаточно большого объема. Можно и спрайты применять, можно вообще чистым оверлеем пользоваться — с помощью второго проца накладывать на видео что-то свое, — с частоты 8 МГц — вполне себе возможно.
у меня есть мах с его знаками, но я не могу достать из него таблицу, не знаю как
у него дополнительно только зарядку АКБ показывает и все
как можно считать таблицу с маха ?
Стандартных средств я не знаю. У меня в программе-загрузчике шрифтов MAX7456_Font_Loader читается из знакогенератора для сравнения с заданным. Но никуда не выводится. И если вывести в монитор последовательного порта, то что с этим делать. Вручную переписывать.
Да и непонятно, что это вам даст. Там хранятся куски перекрестья.
В уроке 68 моя программа выводит текущее содержимое знакогенератора на OSD-экран в виде символов.
Только надо вовремя остановиться, а то она запишет новый шрифт и испортит старый.
просто интересно что у него там и как
прошивка в контроллере закодирована от скачивания, а мах то не кодируется
Привет Эдуард !!! Я как понял теперь 1 знак нужно рисовать допустим в поле 8х6 и переписывать прошивку?
Здравствуйте!
Есть символ или знакоместо. Его размер 12х8 пикселей. Если в нем нарисовать перекрестье, то оно получится очень маленьким. Поэтому перекрестье у меня рисуется в 6 рядом расположенных знакоместах, в квадрате 3х2 знакоместа или 36х36 пикселей. В каждом знакоместе отображается символ — часть перекрестья.
При перемещении перекрестья эти 6 символов отображаются в разных местах экрана, но обязательно рядом. Ка из мозаики выкладывается изображение прицела. Для увеличения размеров перекрестья надо отображать и перемещать квадрат не из 6, а из большего числа символов. Подсчитывать координаты, отрабатывать все ограничения.
Примерно понял о чем речь, то есть полностью изменять программу и подстраивать под нужный размер. Это реально сделать Эдуард !???
Я обращаюсь к тебе Эдуард с просьбой сделать это, пожалуйста пойди на встречу деду, больших денег у меня нет, пенсия ни о чем и купить я мог себе позволить 1 раз готовую плату, но увы она здохла по неизвестным мне причинам, вот и стал по этому заморачиваться в другом направлении. Бог дал мне тебя, вот по этому и обращаюсь к тебе. С Уважение дед Игорь !!!
Эдуард, а где ты живешь ?
Я в Нижегородской области г. Бор
В принципе не нужно 3,5,10 перекрестий, достаточно сформировать одно, типа «мил дот» как в снайперском прицеле есть такое понятие, как оно выглядит я могу нарисовать, это перекрестие с точками или линиями поправок на ветер горизонтально и на дальность вертикально.
Сейчас совершенно нет времени. Я уже несколько месяцев не выкладывал новые уроки. Все уже обижаются на меня. Может позже попробую. Это не так просто. Надо опять собирать макет устройства, писать программу. Дайте ссылку в интернете на прототип устройства.
Привет Эдуард !!! так и не написал из какова города, шифруешься, шутка, хорошо, я буду ждать, прототипа как такового нет, есть продажа готового на ебэй, в латвии мужичек находится, он и продает, и к стати последнее время не выкладывает на продажу, видимо спроса нет. Эдуард я жду и надеюсь на тебя. С Уважением дед !!!
Вот нашел по этому проекту: http://guns.allzip.org/topic/256/2313215.html
Привет Эдуард !!! Седня общался по скайпу с тоже Игорь по поводу его готового продукта, то что я ссылку кинул, он говорит что ничего сложного нет по программе вывода знаков на монитор, (эт для него ничего сложного). Да действительно у него выводится на монитор то количество ячеек клеток которое он указывает программой и после чего это количество перемещает по экрану, как бы так !С Уважением, Здоровья и благополучия !!!
Привет Эдуард !!! В скече не могу найти где указывает на размер выводимого 3х2 знакаместа и как его можно изменить расширив этот диапазон ? А может я зря ковыряюсь в этом?! Всегда говорю другим: не знаешь не лезь !!!
Но мне хочется разобраться. С Уважением!!!
Здравствуйте!
Насколько я помню, на экране двигается массив mark.
// стереть предыдущую метку
// вывести новую метку
osd.setDisplayOffsets(offsetX, offsetY);
osd.printMax7456Char(* (mark+0), charPositionX, charPositionY,0,inv);
osd.printMax7456Char(* (mark+1), charPositionX +1, charPositionY,0,inv);
osd.printMax7456Char(* (mark+2), charPositionX +2, charPositionY,0,inv);
osd.printMax7456Char(* (mark+3), charPositionX, charPositionY +1,0,inv);
osd.printMax7456Char(* (mark+4), charPositionX +1, charPositionY +1,0,inv);
osd.printMax7456Char(* (mark+5), charPositionX +2, charPositionY +1,0,inv);
}
Немного недопонимаю, попробую разобраться
Наконец то ответил, занятый человек, сразу видно !!!!
Эдуард !!!! я сделал то что надо, я понял ка нужно изменять и добавлять необходимое в скетч, УРА,,,,,,,,,,,,,А !!!!
Вот что сделал : // стереть предыдущую метку
if( (prevCharPositionX != charPositionX) || (prevCharPositionY != charPositionY) ) {
osd.printMax7456Char(‘ ‘, prevCharPositionX+0, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+1, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+2, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+3, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+4, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+5, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+6, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+8, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+9, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+10, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+11, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+12, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+13, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+14, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+15, prevCharPositionY);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY-1);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY-2);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY-3);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY-4);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY+1);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY+2);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY+3);
osd.printMax7456Char(‘ ‘, prevCharPositionX+7, prevCharPositionY+4);
}
prevCharPositionX= charPositionX;
prevCharPositionY= charPositionY;
// вывести новую метку
osd.setDisplayOffsets(offsetX, offsetY);
osd.printMax7456Char(* (mark+0), charPositionX, charPositionY,0,inv);
osd.printMax7456Char(* (mark+1), charPositionX+1, charPositionY,0,inv);
osd.printMax7456Char(* (mark+2), charPositionX+2, charPositionY,0,inv);
osd.printMax7456Char(* (mark+3), charPositionX+3, charPositionY,0,inv);
osd.printMax7456Char(* (mark+4), charPositionX+4, charPositionY,0,inv);
osd.printMax7456Char(* (mark+5), charPositionX+5, charPositionY,0,inv);
osd.printMax7456Char(* (mark+6), charPositionX+6, charPositionY,0,inv);
osd.printMax7456Char(* (mark+7), charPositionX+7, charPositionY,0,inv);
osd.printMax7456Char(* (mark+8), charPositionX+8, charPositionY,0,inv);
osd.printMax7456Char(* (mark+9), charPositionX+9, charPositionY,0,inv);
osd.printMax7456Char(* (mark+10), charPositionX+10, charPositionY,0,inv);
osd.printMax7456Char(* (mark+11), charPositionX+11, charPositionY,0,inv);
osd.printMax7456Char(* (mark+12), charPositionX+12, charPositionY,0,inv);
osd.printMax7456Char(* (mark+13), charPositionX+13, charPositionY,0,inv);
osd.printMax7456Char(* (mark+14), charPositionX+14, charPositionY,0,inv);
osd.printMax7456Char(* (mark+15), charPositionX+15, charPositionY,0,inv);
osd.printMax7456Char(* (mark+16), charPositionX+7, charPositionY-1,0,inv);
osd.printMax7456Char(* (mark+17), charPositionX+7, charPositionY-2,0,inv);
osd.printMax7456Char(* (mark+18), charPositionX+7, charPositionY-3,0,inv);
osd.printMax7456Char(* (mark+19), charPositionX+7, charPositionY-4,0,inv);
osd.printMax7456Char(* (mark+20), charPositionX+7, charPositionY+1,0,inv);
osd.printMax7456Char(* (mark+21), charPositionX+7, charPositionY+2,0,inv);
osd.printMax7456Char(* (mark+22), charPositionX+7, charPositionY+3,0,inv);
osd.printMax7456Char(* (mark+23), charPositionX+7, charPositionY+4,0,inv);
А работает? В любом случае, там на краях не совсем правильно будет работать.
Работает, только не по центру сразу выводится картинка, приходится кнопками выравнивать
гдето в программе нужно другие координаты задавать, а я пока еще не врубился!
и по этому есть небольшое смещение
получилось 16х8
В этой строке прибавьте смещение при инициализации
unsigned int currX= MIDDLE_X, currY= MIDDLE_Y;
Например,
unsigned int currX= MIDDLE_X + 8, currY= MIDDLE_Y + 10;
попробую, только завтра, уже устал целый день за этим делом сижу, но доволен как младенец соске, а тебе особая Благодарность и уважение, Здоровья и Благополучия !!! Но я не прощаюсь нет, спокойной ночи, до завтра !!!! С Уважением дед Игорь !!!
Привет !!! Все сделал, получилось и все работает, ура………………а !!! Благодарю Эдуард !!!
Здравствуйте! Искренне рад за вас.
Но я не прощаюсь !!! В каком городе живешь то, а то все шифруешься !!!?
В Новочеркасске, 30 км от Ростова на Дону.
«Совсем рядом «
Теперь корпус надо на 3Д принтере печатать, нет сначала начертить.
Привет Эдуард !!! С Новым Годом !!! Здоровья и всех благ !!!
Спасибо! Очень приятно!
И вас с Новым годом!
Эдуард, дружище. Ты пишешь, что победил работу NTSC. Но ведь это не так. Я даже оформил платную подписку, чтобы посмотреть как. Но пусть это будет тебе в поддержку. Ты победил только смещение по строкам, а вот частоту вывода ты не меняешь, поэтому хоть изображение и накладывается на видео в некоторых устройствах, в других, более капризных к частоте ничего не видно или видно и но не записывается. У тебя накладываемое изображение выводится все равно 29fps не важно какой источник подаешь на вход Pal или NTSC.
Здравствуйте!
Я просто использовал стандартную микросхему с ее возможностями.
Эдуард, здравствуйте! Столкнулся с проблемой странного вывода шрифтов r.h через micro minimOSD. Русские буквы идут как полностью белый пиксель (в принципе при выводе алфавита), цифры идут как буквы. Не знаю, что можно сделать. Возможно Вы можете подсказать? На плате micro minimOSD используется AT7456E, аналог MAX7456
Здравствуйте!
Ничего не могу сказать. Очень давно имел дело с OSD. Вроде, я описал все проблемы.