Pull to refresh

Comments 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КБ, если бы не уместилась, то пробовал все дальше. :)

Sign up to leave a comment.

Information

Website
timeweb.cloud
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Timeweb Cloud