Прекращает ли DmxSerial прерывания?

Я пытаюсь создать установку с помощью Arduino Mega, имеющей выход DMX (используя библиотеку DMXSimple) и библиотеку MIDI (будет сделано).

Мне было интересно, если у меня возникнут проблемы. Согласно этому вопросу, где в ответе Маженко упоминается, что FastLED удерживает прерывания, мне интересно, могу ли я столкнуться с проблемами, если попытаюсь прочитать MIDI-данные с 3 последовательных портов. при отправке DMX.

Вероятно, FastLED (для светодиодных лент) и DMX (250 кбит/с) имеют некоторое сходство. DMXSimple работает только с одной линией данных (без UART), но MIDI использует UART (31,25 кбит/с), 3 UART.

Я опасаюсь, что все работает по отдельности (давным-давно я пробовал это с MIDI), но когда я пытаюсь объединить это, у меня возникают проблемы с синхронизацией.

, 👍-1


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 без приоритетов прерываний, даже без отключения прерываний, это все равно будет блокировать запуск всего остального программного обеспечения.

,

Спасибо за столь быстрый ответ, как вы думаете, это может вызвать проблемы с MIDI-вводом? 3 последовательных порта, 31 кбит/с? Или это настолько медленно, что MIDI будет обрабатываться между вызовами dmxSendByte этой библиотеки?, @Michel Keijzers

Проблема не в скорости передачи данных, а в том, как быстро поступают байты. Должно быть время, чтобы поместить входящий байт в буфер RX, прежде чем прибудет следующий байт, и DMXSimple в конечном итоге создаст окна, в которых это может произойти. Если у вас есть два байта, поступающих между окнами, один из них будет потерян., @Majenko

Хорошо (я надеюсь, что, поскольку я использую аппаратные UART, буфер RX будет заполнен до того, как возникнет эта проблема. В любом случае, я проведу некоторое тестирование «одновременного» MIDI и DMX вместе. Спасибо за понимание., @Michel Keijzers

Существует (IIRC) только один байт аппаратного буфера RX. Он должен быть очищен прерыванием RX до поступления следующего байта., @Majenko

Хорошо ... это означает, что 32 нас, но это кажется больше, чем время для выполнения этих 20 инструкций ... так что все может быть в порядке :-), @Michel Keijzers