Урок 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

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

не в сети 6 часов

Эдуард

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

124 комментария на «Урок 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

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

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

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