Урок 68. Практическое программирование OSD-контроллера MAX7456 в системе Ардуино. Создание и загрузка шрифтов, вывод информации на экран.

Программирование MAX7456

Урок посвящен практическому программированию OSD-контроллера MAX7456. Научимся создавать и загружать шрифты, выводить OSD-информацию на экран монитора.

Предыдущий урок     Список уроков     Следующий урок

Для проверки и отладки программ урока я собрал систему из урока 66. Она состоит из:

  • платы Arduino Nano;
  • модуля MAX7456 (схема модуля в уроке 66);
  • видеокамеры;
  • автомобильного монитора;
  • блока питания 12 В.

Собранная система

Плата Ардуино подключена стандартным кабелем к USB компьютера, от которого и получает питание. Модуль MAX7456 получает питание от платы. Видеокамера и автомобильный монитор запитаны от блока питания 12 В.

Должна быть установлена библиотека MAX7456.h. Я использовал исправленный вариант:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Он корректно работает с таблицей символов ASCII и русскими шрифтами.

 

Создание файла шрифта.

Перед тем как использовать микросхему MAX7456 в ее EEPROM необходимо загрузить знакогенератор.

От фирмы-призводителя микросхема поступает с таким знакогенератором.

Шрифт

Вряд ли читателей моего сайта устроят надписи в виде иероглифов. Да и остальные символы не соответствуют кодировке ASCII. Некоторые функции библиотеки правильно работать не будут.

Прежде всего, необходимо создать файл шрифтов, которые будут загружены в память знакогенератора. Естественно можно взять готовый.

Для файлов шрифтов OSD-генератора MAX7456 обычно используются два формата: mcm и h.

Файлы mcm формата используются в программном обеспечении фирмы Maxim. Файлы такого типа представляют собой последовательность данных в текстовом двоичном виде.

Формат mcm файла

mcm-файлы используются для загрузки знакогенератора непосредственно от компьютера.

Если знакогенератор загружается из платы Ардуино, то, как правило, применяется заголовочный файл с расширением .h. Он включается в программу загрузчика шрифта (#include "MAX7456_Font.h"). Данные файла при компиляции размещаются в программной памяти (FLASH) микроконтроллера с использованием модификатора PROGMEM. В оперативной памяти просто не хватает места. Об этом способе хранения данных написано в уроке 27.

Далее запускается программа Ардуино и данные шрифта загружаются из программной памяти микроконтроллера в EEPROM знакогенератора MAX7456.

Выглядит содержимое h-файла так.

Формат 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 на заводе изготовителе записан такой знакогенератор.

b.mcm     b.h

Исходный шрифт

Я буду использовать знакогенератор с кириллицей согласно кодировке ASCII.

r.mcm     r.h

Шрифт с кириллицей

 

Загрузка знакогенератора в MAX7456.

Я попробовал для записи шрифта использовать загрузчик фирмы Maxim MAX7456_Font_Updater.rar. Загрузить все символы правильно не удалось ни разу. В 2-5 местах у соседних символов коды повторялись. Программа регулярно сбоила.

Написал свой загрузчик знакогенератора:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Работает идеально.

В папке должен находиться, как минимум:

  • файл 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

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Загрузить, распаковать пакет MAX7456_Font_Loader.zip

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

С помощью Aduino IDE загрузить MAX7456_Font_Loader.ino в плату Ардуино.

Открыть монитор последовательного порта (Ctrl + Shift + M).

На OSD-мониторе отобразится таблица текущего шрифта.

Текущий знакогенератор

В окне монитора последовательного порта будет

Сообщение

Если желание загрузить новый шрифт осталось, то необходимо отправить символ 'y'.

После этого начнется загрузка нового знакогенератора в EEPROM MAX7456.

В окне монитора побегут числа от 0 до 255 и появится надпись Upload finished (Загрузка закончена).

Сообщение загрузчика

На OSD мониторе отобразится новый, только что загруженный шрифт.

Текущий знакогенератор

 

Программирование OSD-дисплея MAX7456.

В этом разделе проверим работу основных функций библиотеки.

Все достаточно просто и, скорее всего, было понятно и в предыдущем уроке при описании функций библиотеки MAX7456. Я приведу конкретные примеры.

Очистим экран (заполним пробелами), выведем надписи ”mypractic.ru” и “Проверка MAX7456”.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

#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.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

#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() {
}

Добавили подчеркивание

Добавим строку с числами.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Для этого добавим в конце 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);

Вывод чисел

Добавим обычную строку, инверсную строку и мигающую строку.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

osd.print("Обычная строка", 2, 7); // обычная строка
osd.print("Инверсная строка", 2, 9, 0, 1); // инверсная строка
osd.print("Мигающая строка", 2, 11, 1, 0); // мигающая строка

Вывод строк с разными атрибутами

Отключим фоновое изображение. Превратим MAX7456 в обычный видеоконтроллер. Все новые строки добавляем в конце setup().

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

osd.activateExternalVideo(false); // отключение фонового изображения

Отключение фонового изображения

Включим фоновое изображение и отключим OSD-текст.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Вместо

osd.activateExternalVideo(false); // отключение фонового изображения

поставим

osd.activateOSD(false); // отключение OSD-текста

Отключение текста

Проверим смещение. Заставим изображение двигаться в горизонтальном и вертикальном направлениях.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

#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 – перевод строки.

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

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 метод для выбора системы отсутствует. Я добавил его в новой версии:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Описание в предыдущем уроке.

При неправильно установленной системе OSD-генератор работает некорректно. Может все смещаться на экране, информация может вообще не отображаться.

Еще надо учитывать, что в системе NTSC строк меньше, чем в PAL, значит меньше разрешение экрана. Лучше вывод информации подбирать на конкретной камере и дисплее.

 

На сайте, в новой рубрике Проекты Ардуино,  появился практический пример применения OSD-генератора MAX7456. Это электронный прицел для сверлильного станка.

Надеюсь, я сумел убедить вас, что работать с OSD-контроллером очень просто.

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 2 недели

Эдуард

285
Комментарии: 1972Публикации: 201Регистрация: 13-12-2015

126 комментариев на «Урок 68. Практическое программирование OSD-контроллера MAX7456 в системе Ардуино. Создание и загрузка шрифтов, вывод информации на экран.»

  1. C интересом прочитал незнакомую для меня тему — спасибо за простое и понятное изложение.

    0
  2. Добрый день, Эдуард!

    Ваши уроки — это большой труд, читать их одно удовольствие. Спасибо.

    Тема OSD на мой взгляд достаточно узко специализированная, особенно для PAL/NTSC форматов (стремительно устаревают). В этой связи у меня вопрос, если сочтёте корректным ответить, а как применяет это решение Ваш заказчик, на каком устройстве использует OSD?

    0
    • Здравствуйте!
      Я разрабатывал ему программу для точного сверлильного станка. Выяснилось, что тяжело попадать сверлом в метку для будущего отверстия. С помощью OSD генератора мы сделали электронный прицел. В будущем планируется выводить на этот же экран информацию контроллера станка, которая сейчас отображается на отдельном дисплее.

      0
  3. Я заинтересовался этой темой из за желания совместить камеру заднего вида на авто, которая включается при включении задней передачи на 2-дин магнитолу с парктроником! должно круто получиться! и ещё можно на ту же ардуину зацепить датчик положения руля и выводить траекторию движения назад! как на дорогих иномарках))))

    0
    • Я тоже именно этим озадачился на своем Форд Мондео 4, где родной блок слишком дорогой, а есть руки и желание собрать свое. Если есть успехи, пожалуйста, дайте мне знать. Я хочу рисовать плавные динамические линии, которые меняют свой угол от положения руля. Пока понимаю, что придется заполнить всю таблицу своими символами в виде кривых с определенным углом, потом это все как-то подставлять и вычислять. Пока думаю, что это сложно и арудуинке будет тяжеловато, но есть дешевая stm32f103c8, которая заметно можнее Меги и она есть в ардуино. Планирую собрать все на ней.

      0
  4. Доброго дня и здоровья !!! Проделана огромная работа, за что благодарность и уважение ! У меня есть вопрос, можно ли на монитор вывести символ но увеличенный в размере в несколько раз и при этом еще при помощи допустим кнопок управления передвигать его по экрану монитора ?

    0
    • Здравствуйте!
      Да, можно. Я намерен создать новый раздел на сайте — проекты Ардуино. Одним из таких проектов я собираюсь выложить проект электронного прицела. Символ, состоящий из 3×2 стандартных знакоместа можно кнопками двигать по экрану. Положение его запоминается в EEPROM. В качестве символа я использую крест для прицеливания, но можно задать любой другой. В углу выводятся координаты прицела.

      1
      • Эдуард !!! Я очень рад что у Вас есть такая задумка, если что то надо помочь, я готов общаться. У меня есть уже такой прицел, но на другой основе и мне не нравится. Я видел у одного товарища готовую конструкцию, он покупал где то готовую плату, на ней была атини не помню какая и мах и 5 кнопок управления. В памяти маха было примерно 10 видов перекрестий что очень здорово. Для воздушки свое с мил дотами, и для прочего оружия. Можем общаться в скайпе или в дискорде, что на много лучше. С Уважением дед Игорь!

        0
        • У меня не задумка. У меня есть готовая разработка. Я делал ее для сверлильного станка. Надо только выложить на сайт.

          1
          • Привет Эдуард !!! Жду с нетерпением как выложишь, кинь ссылку пожалуйста. С Уважением дед Игорь !!!

            0
          • Эдуард, вот ссылка на то что я хочу сделать. Платить такие большие деньги пенсионеру не под силу, вот и прошу вас помочь. С Уважением дед Игорь !

            0
  5. Привет Эдуард !!! Извени за беспокойство но только щас руки дошли до дела,не могу загрузить библиотеку в мах, пишет ошибку:
    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]

    0
    • Здравствуйте!
      У меня компилируется без проблем. Наверное, другая версия Arduino IDE.
      Попробуйте воспользоваться советом из 2го комментария к этому уроку.

      0
    • Max греться не должен. Аппаратная ошибка.
      Даже если не подключите Ардуино MAX должен транслировать изображение с камеры.

      0
  6. Извини Эдуард, заморочил и тебе и себе голову, все понял и исправил, все работает, благодарю !!! С Уважением дед Игорь !

    0
  7. Эдуард здравствуйте. У меня плата micro minimosd прошивка работает нестабильно. При включении то работает то нет, другие прошивки для безпелотников работают без сбоев. Проблема точно не в питании…..

    0
    • Разобрался с платой micro minimosd… На плате не предусмотрена связь PIN10CS пришлось подпаиваться проводками.

      0
  8. Привет Эдуард !!! Здоровья и благополучия !!! У меня возникла проблема с загрузкой библиотеки в мах, пишет: Неверная библиотека найдена в 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

    0
    • Здравствуйте! Спасибо за пожелания.
      Вы правильно скопировали библиотечные файлы в предназначенные для них каталоги? Не забыли в Файл->Настройки->Размещение папки скетчей задать путь? Как это сделать в уроке 9 подробно описано.

      0
      • во что накотал: 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

        0
  9. Вот что выдало в последний раз ; 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 .

    0
  10. Конечно Эдуард !!!, Я думаю что я ни тем загружаю, у меня просто преобразователь сигнала на CP2102 b FTDI FT232

    0
  11. У меня еще есть USBAS но его надо по другому подключать а это уже сложно так как все уже в плате впаяно

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

    0
  13. вот я идиот, в платах я поставил арду мини, а надо было про мини, все прошил, Эдуард, огромное тебе гранд мерси, извини за отнятое время, щас буду второй скетч запихивать с перекрестием.С Уважением дед Игорь !!!!!!!!

    0
  14. ну вот любую букву или цифру сделать в 3 раза больше это только программно или надо изменять букву в знакогенераторе ?

    0
    • Там матрица из 6 знакомест перемещаются по экрану. Двигать больше знакомест — это серьезное изменение программы. Меняется математика, распределение памяти знакогенератора и т.п.

      0
  15. я одно не пойму, как же этот парень который продает готовое изделие мог поместить 20 видов перекрестия в знакогенераторе, и у него прицельные планки большие, это вопрос конечно !!!

    0
    • Я же не говорю, что это не возможно. Я говорю, что программа серьезно меняется. К тому же изображения перекрестьев, особенно больших, занимают место в знакогенераторе, уменьшая количество допустимых текстовых символов. Может, его устройство вообще не способно выводить текстовую информацию.

      0
    • Динамический знакогенератор. То есть — постоянно перезаписываемый при смене вида. Требуется внешнее ППЗУ достаточно большого объема. Можно и спрайты применять, можно вообще чистым оверлеем пользоваться — с помощью второго проца накладывать на видео что-то свое, — с частоты 8 МГц — вполне себе возможно.

      0
    • Стандартных средств я не знаю. У меня в программе-загрузчике шрифтов MAX7456_Font_Loader читается из знакогенератора для сравнения с заданным. Но никуда не выводится. И если вывести в монитор последовательного порта, то что с этим делать. Вручную переписывать.
      Да и непонятно, что это вам даст. Там хранятся куски перекрестья.

      0
  16. Привет Эдуард !!! Я как понял теперь 1 знак нужно рисовать допустим в поле 8х6 и переписывать прошивку?

    0
    • Здравствуйте!
      Есть символ или знакоместо. Его размер 12х8 пикселей. Если в нем нарисовать перекрестье, то оно получится очень маленьким. Поэтому перекрестье у меня рисуется в 6 рядом расположенных знакоместах, в квадрате 3х2 знакоместа или 36х36 пикселей. В каждом знакоместе отображается символ — часть перекрестья.
      При перемещении перекрестья эти 6 символов отображаются в разных местах экрана, но обязательно рядом. Ка из мозаики выкладывается изображение прицела. Для увеличения размеров перекрестья надо отображать и перемещать квадрат не из 6, а из большего числа символов. Подсчитывать координаты, отрабатывать все ограничения.

      0
      • Примерно понял о чем речь, то есть полностью изменять программу и подстраивать под нужный размер. Это реально сделать Эдуард !???

        0
  17. Я обращаюсь к тебе Эдуард с просьбой сделать это, пожалуйста пойди на встречу деду, больших денег у меня нет, пенсия ни о чем и купить я мог себе позволить 1 раз готовую плату, но увы она здохла по неизвестным мне причинам, вот и стал по этому заморачиваться в другом направлении. Бог дал мне тебя, вот по этому и обращаюсь к тебе. С Уважение дед Игорь !!!

    0
  18. В принципе не нужно 3,5,10 перекрестий, достаточно сформировать одно, типа «мил дот» как в снайперском прицеле есть такое понятие, как оно выглядит я могу нарисовать, это перекрестие с точками или линиями поправок на ветер горизонтально и на дальность вертикально.

    0
    • Сейчас совершенно нет времени. Я уже несколько месяцев не выкладывал новые уроки. Все уже обижаются на меня. Может позже попробую. Это не так просто. Надо опять собирать макет устройства, писать программу. Дайте ссылку в интернете на прототип устройства.

      0
  19. Привет Эдуард !!! так и не написал из какова города, шифруешься, шутка, хорошо, я буду ждать, прототипа как такового нет, есть продажа готового на ебэй, в латвии мужичек находится, он и продает, и к стати последнее время не выкладывает на продажу, видимо спроса нет. Эдуард я жду и надеюсь на тебя. С Уважением дед !!!

    0
  20. Привет Эдуард !!! Седня общался по скайпу с тоже Игорь по поводу его готового продукта, то что я ссылку кинул, он говорит что ничего сложного нет по программе вывода знаков на монитор, (эт для него ничего сложного). Да действительно у него выводится на монитор то количество ячеек клеток которое он указывает программой и после чего это количество перемещает по экрану, как бы так !С Уважением, Здоровья и благополучия !!!

    0
  21. Привет Эдуард !!! В скече не могу найти где указывает на размер выводимого 3х2 знакаместа и как его можно изменить расширив этот диапазон ? А может я зря ковыряюсь в этом?! Всегда говорю другим: не знаешь не лезь !!!

    0
    • Здравствуйте!
      Насколько я помню, на экране двигается массив 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);
      }

      0
  22. Эдуард !!!! я сделал то что надо, я понял ка нужно изменять и добавлять необходимое в скетч, УРА,,,,,,,,,,,,,А !!!!

    0
  23. Вот что сделал : // стереть предыдущую метку
    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);

    0
    • В этой строке прибавьте смещение при инициализации
      unsigned int currX= MIDDLE_X, currY= MIDDLE_Y;
      Например,
      unsigned int currX= MIDDLE_X + 8, currY= MIDDLE_Y + 10;

      0
      • попробую, только завтра, уже устал целый день за этим делом сижу, но доволен как младенец соске, а тебе особая Благодарность и уважение, Здоровья и Благополучия !!! Но я не прощаюсь нет, спокойной ночи, до завтра !!!! С Уважением дед Игорь !!!

        0
  24. Эдуард, дружище. Ты пишешь, что победил работу NTSC. Но ведь это не так. Я даже оформил платную подписку, чтобы посмотреть как. Но пусть это будет тебе в поддержку. Ты победил только смещение по строкам, а вот частоту вывода ты не меняешь, поэтому хоть изображение и накладывается на видео в некоторых устройствах, в других, более капризных к частоте ничего не видно или видно и но не записывается. У тебя накладываемое изображение выводится все равно 29fps не важно какой источник подаешь на вход Pal или NTSC.

    0
  25. Эдуард, здравствуйте! Столкнулся с проблемой странного вывода шрифтов r.h через micro minimOSD. Русские буквы идут как полностью белый пиксель (в принципе при выводе алфавита), цифры идут как буквы. Не знаю, что можно сделать. Возможно Вы можете подсказать? На плате micro minimOSD используется AT7456E, аналог MAX7456

    0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".