Обновить

Исследование мелодий на МК Padauk

Уровень сложностиСредний
Время на прочтение42 мин
Охват и читатели8.8K
Всего голосов 28: ↑27 и ↓1+38
Комментарии9

Комментарии 9

Спасибо, интересно :)

Если будете делать это с частотой 50% и достаточно часто...

50% может быть любым, это называется скваженность.

Во-первых, не скваженность, а скважность.

Во-вторых, вы перепутали частоту с длительностью импульса.

В-третьих, веселая получилась опечатка:

Для простаты я выбрал, что брелок питается от CR2032

Спасибо. Поправил.

Во-вторых, вы перепутали частоту с длительностью импульса.

Да, там в предложении слово частота два раза встречалось, т.е. одно было лишнее.

Осталось везде заменить скваженность на скважность.

Вот теперь точно. :) Спасибо

Скорее, не проблема ассемблера, а оптимизатора. Ибо вы сами усложнили ему задачу:


void playMelody() {
  for (int thisNote = 0; thisNote < MELODY_SIZE; thisNote++) {   
    tone(MELODY_TONE(thisNote));
    if (delay_ms(MELODY_DURATION(thisNote))) {
      return;
    }
    
    tone(0);
    if (delay_ms(MELODY_NO_TONE_DURATION(thisNote))) {
      return;
    }
  }
}

Т.е. вместо того чтобы загрузить один раз из массива элемент, а отом битовые операции проводить, вы его три раза дергаете по индексу.

Да, есть такой момент, это сделано, чтобы можно было мелодии проще унифицировать. Но оно вроде не проблемное место, то, что три раза полезет за данными вроде не сильно занимает больше места в размере кода, а производительность в этом месте не нужна.

Но, согласен можно это место оптимизировать еще, у меня даже была такая мысль, но не понял как это сделать красиво.

Лайфхак загрузки табличных данных в ассемблере Padauk удивил. Заинтересовался, посмотрел, что там ядро умеет. И действительно, там есть только один опкод, который программную память вообще может адресовать индексно, и это goto/jump.

Удивился, поскольку PIC как-то мимо меня прошёл. Не успел между 51 и AVR)) Но в Padauk как-раз программную память тоже так и считают, как в PIC - словами, а не байтами. Так что там не 1 или 2 KB, а 1 или 2 KW. Сколько бит в 1W - не понял пока, в даташите явно не указано. Похоже на 16.

Про ужимание мелодий в памяти: если не брать авангардный джаз и маткор, то количество тонов не больше 15 (2 октавы в заданной тональности). И есть сетка длительностей, кратная константе = 1/темп. Так что можно ужать ноту и до 1 байта. Я в древних Nokia не только в змейку играл)))

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

Хотя, я просто остановился в оптимизации, когда мелодия уместилась в 1КБ, если бы не уместилась, то пробовал все дальше. :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Timeweb Cloud