Заметка о неделе — 30/17

Я начал неделю с профилирования кода, который написал за неделю до этого. Для меня важно убедиться, что секвенсор не будет тормозить.

Чтобы измерить время, необходимое для выполнения кода на EFM32, я использовал регистр счетчика циклов. Регистр — это ячейка памяти, которую микроконтроллер использует для хранения таких вещей, как настройки конфигурации или счетчик. Счетчик циклов, как следует из его названия, представляет собой счетчик, который отсчитывает синхронно с основной тактовой частотой 14 МГц или 14 миллионов раз в секунду. Измерьте разницу между временем начала и временем окончания, затем разделите результат на 14, и мы получим время, необходимое для выполнения кода в микросекундах, мкс или миллионных долях секунды.

start = DWT-›CYCCNT;
//код, который вы хотите измерить
end = (DWT-›CYCCNT — start)/14;

В отличие от Arduino-мира, нет необходимости заполнять последовательный порт, выплевывая конечное значение. Прелесть правильной разработки микроконтроллера в том, что вы можете просто остановить отладчик, и IDE покажет все переменные. Или поставьте точку останова на строке, и она остановится для вас.

Обрывочный код, который я написал для вывода на светодиоды, занял 150 мкс. Я сохранил состояние светодиодов в массиве целых чисел, а затем отформатировал их в байт, готовый для вывода в сдвиговый регистр. Переход от массива к хранению состояния светодиода непосредственно в байте, готовом к выводу, сэкономил мне 50 мкс. Крошечные выгоды, но все это складывается.

ch1LED |= 1 ‹‹ seq1.currStep;

Еще один аспект оптимизации — посмотреть на необработанный ассемблерный код. Опять же, внутри IDE это очень просто. Просто остановите отладчик и посмотрите на панель Разборка внутри окна отладки. Окно показывает каждую строку кода C с скомпилированным кодом сборки под ней, таким образом, вы можете легко увидеть, как интерпретируется ваш код C. Меньше инструкций означает более быстрый код. Обычно компилятор хорошо угадывает, что вы пытаетесь сделать, и оптимизирует это для вас.

if (clk1flag | clk2flag | clk3flag) {
00001c4e: ldr r3,[pc,#0xa4] ; 0x1cf0
00001c50: ldr r2,[r3]
00001c52: ldr r3,[pc,#0xa4] ; 0x1cf4
00001c54: ldr r3,[r3]
00001c56: orrs r2,r3
00001c58: ldr r3,[pc,#0xa0] ; 0x1cf8
00001c5a: ldr r3,[r3]
00001c5c: orrs r3,r2
00001c5e: cmp r3,#0x0
00001c60: beq 0x00001c66

Я очень рекомендую ТИС-100игру по программированию на ассемблере, о которой вы никогда не просили, если хотите узнать, как она работает. Это бросает вам вызов написать суперэффективный язык ассемблера. Если это многовато, то зацените этот симулятор.

Позже на той же неделе я построил два прототипа, которые уже прибыли из ОШ-парка неделей ранее. Первый представлял собой серию из восьми трехпозиционных переключателей, которые считывались двумя 165-ю входными и последовательными сдвиговыми регистрами. Каждый переключатель подключен к двум входам сдвигового регистра, причем оба входа подключены к земле. Это означает, что переключатель выдает 00, 01 и 11. Два байта из сдвигового регистра легко разделяются побитовыми операциями. Чтобы сэкономить время цикла, это разделение выполняется только тогда, когда это необходимо, а не каждый раз, когда он считывает переключатели.

steps[0] = firstByte & 0b11;
steps[1] = firstByte ›› 2 & 0b11;
steps[2] = firstByte ›› 4 & 0b11;
steps[3] = firstByte ›› 6 & 0b11;
steps[4] = secondByte & 0b11;
steps[5] = secondByte ›› 2 & 0b11;
steps[6] = secondByte ›› 4 & 0b11;
steps[7] = secondByte ›› 6 & 0b11;

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

Вторая плата — это CV-выход секвенсора. Он состоит из 12-битного ЦАП, управляемого SPI, и нескольких операционных усилителей для масштабирования выходного сигнала. ЦАП выполняет цифро-аналоговое преобразование, способ вывода диапазона напряжения, а не просто включения и выключения. Для управления ЦАП вы отправляете два байта, первые четыре бита из которых являются настройками, например, какой канал и какое усиление использовать, следующие 12 бит — это значение, которое вы хотите вывести.

USART_SpiTransfer(USART1, 0b0011 ‹‹ 4 | (значение ›› 8 и 0b1111));
USART_SpiTransfer(USART1, значение & 0b11111111);

ЦАП имеет 12-битное разрешение. Операционные усилители масштабируют выходной сигнал ЦАП от 0 до 5 В. Отправка значения 0 на ЦАП устанавливает выход на 0 В, 4095 на 5 В и 2048 на 2,5 В и так далее.

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

В середине недели я встретился с Томом. Из многих вещей мы обсудили секвенсор. Том всегда отлично подталкивает и подвергает сомнению дизайн. Мне часто это нужно, чтобы держать меня в курсе.

Одна вещь, которую мне нужно выяснить, это возможно ли установить «режимы» при включении питания. В секвенсоре нет кнопок, которые пользователь мог бы удерживать во время включения устройства. Я думаю о таких вещах, как встроенная квантизация или выбор альтернативных функций для нескольких элементов управления и т. д.

Наконец, и, пожалуй, самое неинтересное за всю неделю — я проштамповала кучу милых пакетов, которые использую для упаковки наборов.

На этой неделе мне нужно построить следующий прототип в моем списке, часы и входы сброса. Мне также нужно перепроверить и отправить прототип платы ступенчатого напряжения, которую, как я думал, я отправил несколько недель назад. Я также проведу несколько часов в Eagle, рисуя прототип основных элементов управления.

Я оставлю вас с несколькими вещами.

Новый трек от прекрасной Кейтлин Аурелии Смит — https://open.spotify.com/track/5lgkoNVqoQNBZ01lGcyOCV и соответствующий плейлист — https://open.spotify.com/user/kaitlynaurelia/ playlist/0gbxQIjWOpO6EktHNayhLE

И дайте мне отзыв о моих еженедельных заметках — я выберу кого-нибудь и отправлю ему альбом для рисования Nobots. Может быть, вы можете использовать его, чтобы писать свои собственные недельные заметки?