Прекращает ли DmxSerial прерывания?
Я пытаюсь создать установку с помощью Arduino Mega, имеющей выход DMX (используя библиотеку DMXSimple) и библиотеку MIDI (будет сделано).
Мне было интересно, если у меня возникнут проблемы. Согласно этому вопросу, где в ответе Маженко упоминается, что FastLED удерживает прерывания, мне интересно, могу ли я столкнуться с проблемами, если попытаюсь прочитать MIDI-данные с 3 последовательных портов. при отправке DMX.
Вероятно, FastLED (для светодиодных лент) и DMX (250 кбит/с) имеют некоторое сходство. DMXSimple работает только с одной линией данных (без UART), но MIDI использует UART (31,25 кбит/с), 3 UART.
Я опасаюсь, что все работает по отдельности (давным-давно я пробовал это с MIDI), но когда я пытаюсь объединить это, у меня возникают проблемы с синхронизацией.
@Michel Keijzers, 👍-1
1 ответ
Лучший ответ:
Да, он отключает прерывания при отправке байта:
#if defined(__AVR__)
void dmxSendByte(volatile uint8_t value)
{
uint8_t bitCount, delCount;
__asm__ volatile (
"cli\n" <<==== DISABLE INTERRUPTS
"ld __tmp_reg__,%a[dmxPort]\n"
"and __tmp_reg__,%[outMask]\n"
"st %a[dmxPort],__tmp_reg__\n"
"ldi %[bitCount],11\n" // 11 bit intervals per transmitted byte
"rjmp bitLoop%=\n" // Delay 2 clock cycles.
"bitLoop%=:\n"\
"ldi %[delCount],%[delCountVal]\n"
"delLoop%=:\n"
"nop\n"
"dec %[delCount]\n"
"brne delLoop%=\n"
"ld __tmp_reg__,%a[dmxPort]\n"
"and __tmp_reg__,%[outMask]\n"
"sec\n"
"ror %[value]\n"
"brcc sendzero%=\n"
"or __tmp_reg__,%[outBit]\n"
"sendzero%=:\n"
"st %a[dmxPort],__tmp_reg__\n"
"dec %[bitCount]\n"
"brne bitLoop%=\n"
"sei\n" <<==== ENABLE INTERRUPTS
:
[bitCount] "=&d" (bitCount),
[delCount] "=&d" (delCount)
:
[dmxPort] "e" (dmxPort),
[outMask] "r" (~dmxBit),
[outBit] "r" (dmxBit),
[delCountVal] "M" (F_CPU/1000000-3),
[value] "r" (value)
);
}
Кроме того, эта подпрограмма запускается из подпрограммы прерывания по таймеру. На AVR без приоритетов прерываний, даже без отключения прерываний, это все равно будет блокировать запуск всего остального программного обеспечения.
- Аппаратное прерывание срабатывает случайным образом
- лучшая практика для производительности: пустой цикл () при использовании прерывания?
- Программное обеспечение, устраняющее дребезг кнопки при отпускании
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
Спасибо за столь быстрый ответ, как вы думаете, это может вызвать проблемы с MIDI-вводом? 3 последовательных порта, 31 кбит/с? Или это настолько медленно, что MIDI будет обрабатываться между вызовами dmxSendByte этой библиотеки?, @Michel Keijzers
Проблема не в скорости передачи данных, а в том, как быстро поступают байты. Должно быть время, чтобы поместить входящий байт в буфер RX, прежде чем прибудет следующий байт, и DMXSimple в конечном итоге создаст окна, в которых это может произойти. Если у вас есть два байта, поступающих между окнами, один из них будет потерян., @Majenko
Хорошо (я надеюсь, что, поскольку я использую аппаратные UART, буфер RX будет заполнен до того, как возникнет эта проблема. В любом случае, я проведу некоторое тестирование «одновременного» MIDI и DMX вместе. Спасибо за понимание., @Michel Keijzers
Существует (IIRC) только один байт аппаратного буфера RX. Он должен быть очищен прерыванием RX до поступления следующего байта., @Majenko
Хорошо ... это означает, что 32 нас, но это кажется больше, чем время для выполнения этих 20 инструкций ... так что все может быть в порядке :-), @Michel Keijzers