Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2020, 20:56

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: Генератор кодовых таблиц
СообщениеДобавлено: 30 мар 2020, 17:12 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Люблю семисегментные индикаторы за их внешний вид. Однако, надоело каждый раз набивать таблицу символов ручками. Потому запилил маленький генератор на питоне. Спрашивает порядок сегментов - вводим прямо строку в восемь символов (порядок следования сегментов в байте, от старшего к младшему), потом спрашивает какой электрод общий - анод или катод (будет зажигаться нулём или единицей). На выходе даст сишный файл для подключения в проект. По дефолту оно генерит для AVR-ов, но если выкинуть #include <avr/pgmspace.h> и PROGMEM из текста - можно будет пихнуть куда угодно.

Show Код

Show Выхлоп


Берите кому надо, пользуйтесь на здоровье.
При вставке кода слетели отступы, а в питоне они критичны. Поэтому берём файл из аттача и меняем расширение на ".py"


Вложения:
segments.txt [2.15 Кб]
Скачиваний: 55
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 30 мар 2020, 17:51 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Маладэц! А теперь давай для 14-ти и 16-ти сегментных. Там еще больше пространства для творчества.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 30 мар 2020, 18:33 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Дополню примером, как это делаю я.

Show Код


Код не лишён недостатков, но в качестве примера сгодится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 03:53 
Заглядывает иногда

Зарегистрирован: 26 фев 2018, 03:06
Сообщения: 126
а зачем все это? создал один раз хедер и пользуйся...
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 11:03 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Дык и я вот о том же. Один раз создаем список сегментов из дефайнов, а дефайны сегментов уже конкретно по номерам ног назначаем. А цифры для загрузки в порт уж сам компилятор посчитает, он умеет.
Для букв лучше всего подходят 14- и 16-сегментники, на них вообще классно текст писать. По сравнению с матричными, они экономнее и по деньгам, и по токопотреблению, а буквы выглядят куда лучше, чем на 7-сегментниках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 12:49 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Цитата:
а зачем все это? создал один раз хедер и пользуйся...


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 13:09 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4335
Откуда: г. Липецк
ZvookieJoo писал(а):
...проще...

Ошибаетесь, ваш путь геморойнее, при создании хедера нужно просто предусмотреть в нем модификации с помощью дефайнов и условной компиляции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 13:47 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Каждый извращается на свой вкус. Чел просто тренируется мастрячить в Питоне. ...И чего только не выдумают человеки.
Этот товарисчь еще не встречался с распиновкой сегментов на разные порты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 14:32 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 292
BusMaster писал(а):
Этот товарисчь еще не встречался с распиновкой сегментов на разные порты.

А вот этому вообще не место в знакогенераторе - с портами-пинами пусть разбирается процедура вывода, получив на вход какие сегменты зажигать/тушить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 16:16 
Заглядывает иногда

Зарегистрирован: 26 фев 2018, 03:06
Сообщения: 126
ZvookieJoo писал(а):
Как по мне, проще один раз запустить питонский файл, скормить ему порядок сегментов и тип общего электрода. И не надо лазить по хедеру и комментить лишнюю таблицу, чтобы память не занимала.
один раз выставляется тип анод/катод, а порядок сегментов может меняется надцать раз на этапе трассировки платы и что каждый раз питон и копипаст форева? данунах... в хедере это всего изменение пары-тройки цифр нумерации пинов порта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 16:37 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Цитата:
А вот этому вообще не место в знакогенераторе

О том и пишу, что в этом случае таблица сборки сегментов пишется вообще один раз и представляет собой просто числа - то есть массив данных шрифта. Потом эти числовые данные разбираются функцией вывода и по битам сопоставляются конкретные выводы.
Но на слабых МК, чтобы не грузить МК впустую чисто программерскими заморочками, знакогенератор и вывод совмещен. Только не говорите, что на какой-нить Тиньке или ПИК16 вы так не делали :))) Я в то время такие индикаторы вообще на ассемблере кропал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 16:42 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
BusMaster писал(а):
Этот товарисчь еще не встречался с распиновкой сегментов на разные порты.

И с этим встречался и на ассемблере такое кропал :)

По большому счёту - вопрос удобства программера. Мне вот так интереснее и удобнее, может ещё кому-то покажется удобным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 16:51 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Да мы вас поняли, что вам интересно на Питоне поупражняться.
Но если уж хотите эти ваши "удобства" - один раз создайте с помощью Питона массив шрифта типа led7seg_font[] = {0xXX, 0xXX, 0xXX...} и функцию разбора байта побитно, в которой считывается каждый бит. Номер бита в этой ф-ции привязывается к конкретному выходу (и эту привязку можно менять). В любом порядке, на любых портах в любых комбинациях. Вот это уже будет универсальный способ. Шрифт не меняется. Меняется только функция вывода в части привязки номера бита к конкретному выводу и полярности (акт.1/акт.0).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 31 мар 2020, 22:20 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4335
Откуда: г. Липецк
Универсальный инструмент меня сразу напрягает, морально, это типа швейцарского ножа. Понтов много, цена негуманная, ценность околонулевая, только вынуть, разложить. Все же предпочитаю специализированные инструменты типа таких - "Configuration Wizard в KEIL. Ассемблер А51, подбор битовых масок для вывода на семисегментный индикатор".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 09:25 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 211
Какая то внешняя программа, в которой также нужно задавать сегменты... Затем копировать в исходник... А потом, вдруг, нужно изменить со временем... Нужно искать эту внешнюю программу и опять двадцать пять. Либо ковыряться и материться. Зачем все эти лишние телодвижения? Когда всё описывается дефайнами в самом исходнике (выше уже писали). И наглядно, и понятно, и другие могут править а не плеваться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 12:40 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Snake писал(а):
Какая то внешняя программа, в которой также нужно задавать сегменты... Затем копировать в исходник... А потом, вдруг, нужно изменить со временем... Нужно искать эту внешнюю программу и опять двадцать пять. Либо ковыряться и материться. Зачем все эти лишние телодвижения? Когда всё описывается дефайнами в самом исходнике (выше уже писали). И наглядно, и понятно, и другие могут править а не плеваться.

Угу, а потом вспоминать, куда положил этот исходник, когда надо подтянуть в проект. Копипастить ничего не надо, запустил скрипт в директории проекта и инклуднул файл. Надо переделать - запустил ещё раз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 13:14 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1268
Snake писал(а):
Зачем все эти лишние телодвижения? Когда всё описывается дефайнами в самом исходнике (выше уже писали). И наглядно, и понятно, и другие могут править а не плеваться.

Беру платку, там на гребенку выведены порты в довольно хаотичном порядке, подключаю к индикатору 8 линий подряд, описываю список пинов, в данном случае пины с 3-х портов, а таблица будет для всех случаев одинаковая. В итоге получаем:

Код:
const uint8_t digits[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };   // 0..9

using segs = PinList<PB10, PB12, PB13, PB14, PD2, PC8, PC7, PC6>;

segs::mode<PinMode::PushPull>();

for(int i = 0; i < 10; i++)
{
   segs::write(digits[i]);
   delay_ms(1000);
}

Это один из простых способов, еще можно передав тот же список пинов сгенерить таблицу на этапе компиляции и она будет храниться во флеше, т.е. никакого питона, код сразу на С++, но в рантайме его не будет. У меня в одном проекте раньше было несколько фрагментов кода на C# которые генерили довольно увесистые таблицы, вплоть до 72КБ, причем в двух экземплярах, для 8 и 16-ти битных дисплеев, а теперь все то же самое написано на плюсах, бинарники получаются идентичными, а компилируется даже чуть быстрее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 15:43 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Цитата:
Код:
const uint8_t digits[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };   // 0..9

using segs = PinList<PB10, PB12, PB13, PB14, PD2, PC8, PC7, PC6>;

segs::mode<PinMode::PushPull>();

for(int i = 0; i < 10; i++)
{
   segs::write(digits[i]);
   delay_ms(1000);
}

Принципиально не пихаю плюсовый код в AVR. Писать-то просто, да в бинарнике оверхеда больше. Хотя шаблоны и разложатся на этапе компиляции, но те же таблицы виртуальных методов (если присутствуют) тоже жрут место. На какой-нибудь ARM, где много флэша - туда можно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 16:19 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1643
Откуда: Курск
То есть мне для этого нужно ставить питон?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 16:34 
Старожил

Зарегистрирован: 04 май 2010, 08:16
Сообщения: 398
Откуда: Екатеринбург
Cthulhu писал(а):
То есть мне для этого нужно ставить питон?

Я вас не заставляю :)

Разработка идеальных приложений не входит в мои планы на свободное время :-D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 16:39 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 211
Это как раз об удобстве.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Генератор кодовых таблиц
СообщениеДобавлено: 01 апр 2020, 16:41 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1268
ZvookieJoo писал(а):
Принципиально не пихаю плюсовый код в AVR. Писать-то просто, да в бинарнике оверхеда больше. Хотя шаблоны и разложатся на этапе компиляции, но те же таблицы виртуальных методов (если присутствуют) тоже жрут место. На какой-нибудь ARM, где много флэша - туда можно.

Попытка номер два, на этот раз с реальным примером:
Show

Если где-то задействовать scrTable, то на этапе компиляции будет заполнен массив, который впоследствии разместится во флеше. Можно выбросить этот код, сгенерить этот массив сторонней утилитой и вставить в проект, но бинарники будут полностью одинаковыми. В С++20 можно на этапе компиляции динамически выделять память и вызывать виртуальные функции, т.е. даже с этим всем можно добиться нулевого оверхеда. А в подходе без генерации таблицы на этапе компиляции проделывается серьезная работа чтобы количество рантаймового кода свести к минимуму, в частности для write() на Cortex-M3 получим следующее:
Show

С одной стороны не так и мало, но тут запись 4-х групп бит, одна из которых реверсная, в три разных порта, при этом не затрагиваются все остальные биты этих портов. Вручную лучше не напишешь, а вот хуже запросто...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB