Урок посвящен практическому программированию 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.
Здравствуйте!
Я просто использовал стандартную микросхему с ее возможностями.