Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Тогда уж просто умножение на 16 одним разом. Равноценно сдвигу влево на 4 бита.
Но... с занесением младших нулей, а не замена тетрад - придется добавлять несколько команд
для помещения старшей тетрады на новое место.
Хотя... как алгоритм... ЗАСЛУЖИВАЕТ ВНИМАНИЯ, особо в тех МК, где есть аппаратное умножение.
:idea:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Сб июн 01, 2013 18:51:03

Сообщение 4epemyxa »

Так тут и есть умножение на 16, которое "разбирает" регистр на две тетрады с одновременным обнулением второй. Причем для сдвига влево или вправо меняется только порядок сборки тетрад в байты.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

То для одного байта - эквивалент SWAP, а вот при длинном составном в несколько регистров... надо отслеживать, что удобнее...
:dont_know:
Родился
Сообщения: 6
Зарегистрирован: Сб июн 01, 2013 18:51:03

Сообщение 4epemyxa »

Да, если результат умножения байта собрать в один регистр, то получается точный эквивалент SWAP. Естественно, смысла в этом нет - что может быть быстрее одноциклового SWAP. А вот использовать умножение на 16 для выделения чистых тетрад без дополнительных ANDI очень даже быстро.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У меня были подобные задачи по смещению части битового поля для ЖКИ индикаторов на основе NJU6432 и KS0035...
Там весьма помудрить порой приходится - помимо прочего зависит и от конкретной привязки сегментов к ячейкам ОЗУ (при изготовлении индикатора).
:facepalm:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Здравствуйте.
Коротко о себе и моём уровне подготовки:
Я перевожу один проект под свои нужды. Основная цель - замена дисплея на цветной TFT.
Хоть я и радиолюбитель с определённым стажем, но мой род занятий и образование не связаны с электроникой и тем более программированием. Так же нет возможности "развиваться в команде" - то есть одиночество абсолютное.

Тем не менее три месяца тотального красноглазия над AVR Assembler-ом дало ощутимые плоды.

Суть проблемы такая:
При выводе текста на дисплеи бОльших размеров моноширинный шрифт смотрится (мяхко говоря) неуклюже. (кстати шрифты делаю сам, практически в ручную, на коленке, попиксельно).
Решил использовать пропорциональный шрифт и создать свою таблицу ASCII. Полный знак примерно 8x16px. Три нижних строки пустые для вывода хвостов от всяких q, y, g, ... щ, ц, ... и запятых.

Ну и естественно вопрос: как реализовать нахождение шрифта в таблице символов и получить ширину символа при выводе.

Готовых решений не прошу.
Буду признателен за любую информацию, которая укажет правильное направление.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Да в общем-то, так же, как и на Си или другом языке. Традиционно есть 2 подхода:
1. При описании каждого символа шрифта указываетс его ширина. Т.е. в массиве байтов, описывающих пикселы символа первый байт задает ширину этого символа.
2. Создается отдельная таблица, в которой хранится ширина и адрес начала символа в знакогенераторе, а сам знакогенератор в отдельной таблице

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

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

Так же в первом случае сложновато делать знакогенератор для шрифтов с "пропуском символов", например, не всегда нужна псевдографика или там латинские символы... Потому что в этом случае надо помимо сканирования списка символов еще и отслеживать "дыры". Во втором случае это проще: в индексной таблице просто пропускаются "лишние" позиции, и все.

Кстати, есть специальные программы для создания пиксельных шрифтов, поддерживающих ОБА способа, и позволяющих практически мышкой нарисовать любой знакогенератор и получить на выходе исходник со всеми данными на любом языке программирования, в т.ч. и ассемблере. Рекомендую поискать. Ключевые слова LCD font editor или generator
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Я создавал массив символов во FLASH (правда у меня цифры 24х40 и усеченный шрифт 16х24). Перед выводом создавал образ экрана, точнее его части, т.к. ОЗУ хватало только на 64 строки (индикатор 400*240 пикселей), где делал распаковку текущего символа на строки и загрузку в ОЗУ. Естественно, постоянная часть, которая уже была отправлена в ОЗУ индикатора не трогалась.
СпойлерИзображение
Вложения
индикатор LS без стрелки.jpg
(32.78 КБ) 527 скачиваний
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Если памяти во FLASH достаточно, то можно под каждый символ отводить максимальную ширину, тогда адрес легко вычисляется. Первый байт знакогенератора - ширина символа.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

trofim2 писал(а):Если памяти во FLASH достаточно, то можно под каждый символ отводить максимальную ширину, тогда адрес легко вычисляется.
255 символов 32х32 пиксела (далеко не гигантский шрифт) займут всего ничего 255*32*8=65280 байт... а так - да, можно отводить и максимальную ширину...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3546972#p3546972"]255 символов 32х32 пиксела (далеко не гигантский шрифт) займут всего ничего 255*32*8=65280 байт...[/uquote]
Разве не 255*32*4?
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

С выводом чего то отдельного или только цифр, или даже группы картинок из таблицы разобрался. И текст развернуть могу, MHz -это один символ. Цифры использую тоже 24х40 без засечек.
СпойлерИзображение

Сейчас именно таблицу ASCII хочу перевести.

Во вложении таблица со смайлами 24х24 которые на фото.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

[uquote="ARV",url="/forum/viewtopic.php?p=3546972#p3546972"]
trofim2 писал(а):Если памяти во FLASH достаточно, то можно под каждый символ отводить максимальную ширину, тогда адрес легко вычисляется.
255 символов 32х32 пиксела (далеко не гигантский шрифт) займут всего ничего 255*32*8=65280 байт... а так - да, можно отводить и максимальную ширину...[/uquote]
Для М128 это всего половина памяти.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="ARV",url="/forum/viewtopic.php?p=3546929#p3546929"]1. При описании каждого символа шрифта указываетс его ширина. Т.е. в массиве байтов, описывающих пикселы символа первый байт задает ширину этого символа.[/uquote]
Да, спасибо. Этим способом и воспользуюсь.
По предварительным подсчётам:
При средней ширине символа в 8 байт некоторые символы (ориентировочно) получатся до 12-ти байт +1 байт ширина символа.
Даже если округлю до 15 байт на символ в две строки - памяти хватит.

Большое спасибо.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Сделал первым способом. По коду громоздко, если средняя ширина одного знака 7px, то по максимуму все увеличиваются до 11px (в полтора раза), + 1 байт ширина, +1 - "0", итого 24 байта на знак. Но возможно буду ещё увеличивать до 16х18, когда дисплеи 240х320 придут. А это примерно 72 байта на знак выйдет (16*1,5*3). Чем цветнее дисплей, тем мельче пиксель.
СпойлерИзображение
В голове ещё третий способ нарисовался. Посмотрю, что будет по памяти, и возможно сделаю "не вашим не нашим", т.е несколько таблиц с символами (шириной 2, 4, 7, 11 px), символы задавать кодами и через условие делать перенаправление на таблицы.

PS Да, с разными таблицами буду пробовать, экономия по памяти получится ощутимая, так как можно некоторые символы кириллицы и латиницы (17 насчитал ABCEHKMOPTXaceopy, а 17х72=1224 байта) на один знак вешать.

PS2 С переменной шириной шрифта определился, но от ASCII отказываюсь, т. к. на больших шрифтах весьма не рационально.
Последний раз редактировалось shonty Чт янв 17, 2019 10:26:35, всего редактировалось 5 раз.
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Может почитать про "масштабируемые шрифты" для форточек...
Только вот ГДЕ?
:dont_know:
:(
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

shonty писал(а):некоторые символы кириллицы и латиницы (17 насчитал ABCEHKMOPTXaceopy
вообще-то, должно быть 12 заглавных букв, совпадающих с латиницей.
кстати, в автомобильных номерах используются только буквы, совпадающие по начертанию с латиницей. и мне помнится, что их 12...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3551345#p3551345"]вообще-то, должно быть 12 заглавных букв, совпадающих с латиницей.[/uquote]
Видимо Y и У, но это как написать.

Решение можно найти и более оригинальное, но я пока не виртуоз, а сразу всё впитать в себя не успеваю, да и дозировать нужно.
На этом этапе сделаю по пониманию материала.
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

да, это буква "У".
"Требованиями и условиями ГОСТа обозначено, что на автомобильных номерах могут быть использованы 12 букв из алфавита кириллицы — А, В, Е, К, М, Н, О, Р, С, Т, У и Х, так как только они имеют аналогичные буквы в латинице."
Источник: http://pravo-auto.com/kakie-bukvy-ispol ... ah-rossii/
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="ARV",url="/forum/viewtopic.php?p=3546929#p3546929"]2. Создается отдельная таблица, в которой хранится ширина и адрес начала символа в знакогенераторе, а сам знакогенератор в отдельной таблице[/uquote]
Всё таки решился сделать вторым способом. Хочу уточнить несколько деталей.
1. Байт ширины символа без разницы где размещать: в индексной таблице или таблице знакогенератора?
2. (Основной вопрос) Поиск адреса начала символа в знакогенераторе. Извините за делетантство, но на ум приходит ввести 3 параметра: это 1-й множитель, 2-й множитель (или число проходов первого параметра) + слагаемое (в качестве довеска, не все ж числа делятся без остатка).
Ответить

Вернуться в «AVR»