Наконец собрался и сегодня написал VM, для такого простого набора команд просто и получилось, полторы сотни строк. Для тестов вместо бьющих по глазам диодов вывожу картинку на дисплей, квадрат 8x8 из квадратов поменьше. Также набросал парочку тестовых скриптов: Спойлер
while(1) { var offset = peek(helloWorld, curChar) * 8; var offset2 = peek(helloWorld, (curChar + 1) % 12) * 8;
for(var y = 0; y < 8; y++) { var line = (peek(chars, y + offset) << 8) | peek(chars, y + offset2); line <<= shift; for(var x = 0; x < 8; x++) { var color = 128; if(line & 0x8000) color = 0; paint(y * 8 + x, color); line <<= 1; } }
var offset = 0; while(1) { for(var i = 0; i < 64; i++) { var h = (i * 4 + offset) & 0xFF; paint(peek(arr, i), h); } wait(1); offset++; }
Теперь нужно с набором функций определиться, форматами цвета т.д., потому что в принципе можно одним hsv обойтись, но местами с rgb быстрее. Опять же передавать hsv в функции или хранить в глобальной переменной, передавать hsv целиком или покомпонентно чтобы с ними было удобнее работать...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
любопытно было бы посмотреть на эффект в реале или симуляции. поскольку ваши скрипты мною не воспринимаются, представить результат не могу... а так же хотелось бы разобраться об аппаратной платформе, способной такое воспроизвести - я подозреваю, что это не atmega328 будет...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
любопытно было бы посмотреть на эффект в реале или симуляции. поскольку ваши скрипты мною не воспринимаются, представить результат не могу...
Да ладно, синтаксис на 98% сишный, по крайней мере последний скрипт должен легко читаться, в этом одно из преимуществ. Из отличий можно выделить var, который по сути int32, но для AVR можно уменьшить, даже проще станет. А для массивов var - это int8[], а сами массивы только для чтения, первые два байта хранят размер и максимальное смещение от начала программы тоже 16-ти битное, доступ при помощи [] скорее всего позже добавлю. Еще "&&" и "||" не "short circuit", т.е. всегда вычисляются обе части выражения, но предварительно они приводятся к bool. Дальше, переменных может быть 32 штуки, функций тоже, но это все легко расширить при необходимости. Команды переходов могут прыгать в пределах 8КБ. Во втором скрипте в массиве хранятся индексы диодов описывающие спираль, потом в цикле для каждого диода задается hsv, в данный момент только h, а sv на максимуме, потому что пока не определился, затем этот h масштабируется чтобы перекрыть весь диапазон. Если взять такую полоску, разбить ее на 64 сегмента, свернуть в квадратную спираль и скролить, то получится именно то, что делает этот скрипт.
ARV писал(а):
а так же хотелось бы разобраться об аппаратной платформе, способной такое воспроизвести - я подозреваю, что это не atmega328 будет...
Семь байт в конце - это массив. Выражение внутри paint() состояло из одних констант и свернулось в константу. Большинство команд однобайтовые и парсятся элементарно, могу даже показать как это выглядит: Спойлер
Код:
bool process() { auto opcode = get(); switch (opcode >> 5) { case 0: { int tv = pop(); switch (opcode & 0x1F) { case 0x00: top() += tv; break; // Add case 0x01: top() -= tv; break; // Sub case 0x02: top() *= tv; break; // Mul case 0x03: top() /= tv; break; // Div case 0x04: top() %= tv; break; // Mod case 0x05: push(-tv); break; // Neg case 0x06: push(~tv); break; // Com case 0x07: push(!tv); break; // Not case 0x08: top() &= tv; break; // And case 0x09: top() |= tv; break; // Or case 0x0A: top() ^= tv; break; // Xor case 0x0B: top() = bool(top()) & bool(tv); break; // LogAnd case 0x0C: top() = bool(top()) | bool(tv); break; // LogOr case 0x0D: top() >>= tv; break; // Ror case 0x0E: top() <<= tv; break; // Rol case 0x0F: top() = (top() == tv); break; // EQ case 0x10: top() = (top() != tv); break; // NE case 0x11: top() = (top() < tv); break; // LS case 0x12: top() = (top() > tv); break; // GT case 0x13: top() = (top() <= tv); break; // LE case 0x14: top() = (top() >= tv); break; // GE case 0x15: break; // Pop case 0x16: return true; // Ret } break; }
case 1: push(opcode & 0x1F); break; // Pushk5 case 2: push(vars_[opcode & 0x1F]); break; // Pushv case 3: vars_[opcode & 0x1F] = pop(); break; // Popv
case 4: // Call { switch (opcode & 0x1F) { case 0: rtt.println(pop()); break; // void print(val) case 1: peek(); break; // int peek(arrOffset, index) case 2: clear(); break; // void clear(color) case 3: wait(); break; // void wait(ms) case 4: push(rnd()); break; // int rnd(max) case 5: reverse(); break; // void reverse() case 6: paintMap(); break; // void paintMap(arr) case 7: paint(); break; // void paintMap(ledNum, color) case 8: return true; // void exit() ....... } break; }
При этом часть инструкций опциональны(Addi/Subi), а самая большая Pushk таковая из-за того, что числа могут быть 8/16/24/32 бита, если на AVR будет только 8/16, то можно значительно ее упростить. И мне кажется работать будет быстрее чем с твоими текстовыми скриптами, особенно команды типа PM которые в цикле будут парситься на каждом проходе и занимающие в 2 раза больше памяти, у меня просто на стек кидается смещение массива от начала программы, потом paintMap() берет его стека, прибавляет к указателю на начало скрипта и получается адрес по которому хранится размер массива и потом сырые байты.
Если взять такую полоску, разбить ее на 64 сегмента, свернуть в квадратную спираль и скролить, то получится именно то, что делает этот скрипт.
лучше один раз увидеть... есть какое-то видео, анимация или что-то подобное? как-то меня "квадратная спираль с бегущим огнем" не очень в голове вырисовывается...
Reflector писал(а):
И мне кажется работать будет быстрее чем с твоими текстовыми скриптами
конечно, разве кто спорит? всю работу сделать на компьютере, а для МК по сути дать готовую "прошивку" думаешь, я не мог бы сделать подобное? мне было интересно сделать это на МК без компа. поначалу я хотел версию бейсика сделать, но потом передумал и сделал свой "ассемблер"
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
лучше один раз увидеть... есть какое-то видео, анимация или что-то подобное? как-то меня "квадратная спираль с бегущим огнем" не очень в голове вырисовывается...
Это тестовые примеры, реализовал что первое в голову пришло, просто чтобы проверить работоспособность. Не важно как оно выглядит, главное можно реализовывать эффекты обходя массив разными способами, без написании специализированных функций. Вот квадратная спираль:
Сверни так hsv полоску и скроль цвета по кругу, только у меня не лента и скрол достигается за счет изменения начального значения h.
ARV писал(а):
конечно, разве кто спорит? всю работу сделать на компьютере, а для МК по сути дать готовую "прошивку" думаешь, я не мог бы сделать подобное? мне было интересно сделать это на МК без компа. поначалу я хотел версию бейсика сделать, но потом передумал и сделал свой "ассемблер"
Вопрос то был касательно того сможет ли mega328 такое воспроизвести и она сможет потратив меньше времени, RAM и флеша скорее всего тоже. И да, если хотя бы интерпретатор бейсика писался так просто, то изобретать свой "ассемблер" не было бы необходимости
т.е. эта спираль реализована на матрице из светодиодов? и по ней бежит радуга - верно понял?
Reflector писал(а):
Вопрос то был касательно того сможет ли mega328 такое воспроизвести и она сможет потратив меньше времени
да не было вопроса... я сразу сказал, что будет быстрее гораздо. я не сразу вспомнил, что у тебя подход "компилируемого" в байт-код скрипта. собственно, тут многое зависит от интерпретатора байт-кода, но наверняка он будет быстрее символьного интерпретатора...
Reflector писал(а):
если хотя бы интерпретатор бейсика писался так просто
а чего там сложного? подмножество бейсика для светоэффектов было бы не многим сложнее имеющегося интерпретатора "ассемблера" просто меньше полезной памяти осталось бы, только и всего.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
т.е. эта спираль реализована на матрице из светодиодов? и по ней бежит радуга - верно понял?
Уже говорил, что сейчас вывод идет на SPI дисплей где рисуются 8x8 квадратов и нумерация там по рядам, а в массиве прописаны индексы спирали. Бежит радуга, да.
ARV писал(а):
а чего там сложного? подмножество бейсика для светоэффектов было бы не многим сложнее имеющегося интерпретатора "ассемблера" просто меньше полезной памяти осталось бы, только и всего.
Допустим интерпретатор "ассемблера" встречает подобное выражение:
Код:
x = 10 * foo(rnd(y - 5) / 2, 8) + 1;
Cейчас у тебя шаблонный код, после команды интерпретатор ожидает, что должно идти два символа которые нужно интерпретировать как 8-ми битное число в hex и до разбора выражений ему очень далеко. А сколько ошибок можно сделать в таком выражении... И отлаживать придется на ПК, хотя бы чтобы эти ошибки увидеть и уже практически пропадает разница между написанием на ПК или написанием на ПК и компиляцией в байт-код, что гораздо эффективнее с точки зрения исполнения. Компилируются скрипты, кстати, за несколько тысячных секунды.
так я тоже говорил, что лучше один раз увидеть... неужели телефон кнопочный без камеры?
Reflector писал(а):
Допустим интерпретатор "ассемблера" встречает подобное выражение
не, не допустим, в "ассемблере" таких выражений не может быть а вот в бейсике - да, могут. и единственная проблема - не найти ошибку, а сообщить о ней... при отсутствии-то дисплея... это - да, проблема в подходе
Reflector писал(а):
Компилируются скрипты, кстати, за несколько тысячных секунды
кэп, вы ли это?!
и плюсы, и минусы твоего варианта очевидны: при стрельбе по воробьям из пушки грохоту гораздо больше...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Доброго всем времени суток! Дилетантский вопрос: Собрал плейер в паре с светиками WS2812B в кол-ве 50 шт. При включении без SD флеш загорается красным медленно переходит в желтый-зеленый-голубой-синий-сиреневый - получается плейер норм работает? И еще как вытащить-записать скрипт с DSM, всю помощь перечитал не получаетсяи все, с расширением .sc записывает, а внутри одни каракули. Спасибо заранее!
посмотрите в настройках на закладке "Скрипт" - у вас, похоже, установлена галочка "Экспортировать только выделенный кадр", а кадр при этом не выделен...
Добавлено after 58 seconds: рекомендую не ставить тут никакие галочки, кроме первой, пока не освоитесь
Нет, все так же. Сегодня еще раз скачал DSM, попробовал ее на диске С открыть, осталось попробовать на другом ПК или с другой виндой
Добавлено after 2 hours 6 minutes 23 seconds: На ХР попробовал создать скрипт, такая же проблема, зато посмотрев dsm.log заметил странную вещь: 13:43:20.581: Работа начата 13:43:20.597: Палитра пользователя загружена из файла "default.dppf" 13:43:20.612: Выбрана максимальная скорость, для чего заблокировано обновление панели редактора и наблюдения 13:43:20.612: Файл рабочего пространства не указан, используется файл по умолчанию 13:43:20.612: Рабочее пространство загружено из файла "default.layout"
Я максимальную скорость не выбирал и не знаю где ее поменять. Может с этим связано глюки? Сейчас вообще некоторые кнопки не активны пока не перезагрузишь прогу
да нет там никаких глюков 1. создали проект, разместили пикселы 2. нарисовали кадры анимации, проверили, что анимация вас удовлетворяет 3. открываете редактор скриптов заходите в меню и жмете команду Импортировать анимацию в скрипт 4. вуаля! выложите ваш проект, проверю у себя.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Добрый день! Я только учусь поэтому нет еще проектов, мне бы еще с железом разобраться, не поделитесь с скомпилированным HEX-файлом для прошивки микроконтроллера м328 для светиков WS2812b буду во многом благодарен. Пробовал отсюда скачать но там не увидел HEX-файла https://cloud.mail.ru/public/P4CM%2FHBthmnjag Скачал отсюда https://sites.google.com/view/digiscript/ вообще перестало SD читать только медленный переход всех цветов, до этого хоть считывало, но отличалось от тех готовых эффектов которые описаны. Спасибо заранее!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения