ムライボックス (13) --- ソフトウェア (5)

ストップ・ビットの中央付近で「送信完了」のフラグが立つタイプの UART では、残りの 1/2 ビット・タイム (約 16 μs) 期間の、まだストップ・ビットの中にいる状態で次のキャラクタ・データの書き込みを終えることができれば余分なアイドル状態が挿入されることもなく、連続してキャラクタが送信されます。
したがって、送信完了を検出したら遅滞なく、処理 / UART 出力に移ることが望まれます。
PIC の UART のように送信完了割り込みの機能がなく、レジスタ中のフラグが立つだけの場合には、メインの無限ループのなかで張り付いてポーリングするしかありません。
その点で割り込みで送信完了を通知できるタイプの UART が有利となります。
前回の記事の Arduino (AVR ATmega328 使用) では、ボーレート誤差および挿入されるアイドル期間による速度低下に対処するために必要とされる「バッファ」については、システムで用意されている「ハードウェア・シリアル」の受信側バッファを利用しています。
デフォルトでは、SRAM 1 K バイト以上のチップ (ATmega328 は 2 K) に対しては 64 バイトの受信バッファが使われるようになっています。
ハードウェア・シリアルの送信側については、初期状態では UDRE (USART Data Register Empty) 割り込みは禁止されており、シリアル・クラスの送信メソッドを使わない限り UDRE 割り込みが許可されることはなく、TXC (Transmit Complete) 割り込みをともなう「自前」の UART 送信ルーチンに影響を及ぼすことはありません。
必要な処理は TXC 割り込みハンドラ内で実行されるので、メインのループの中では、シリアルの受信バッファにデータがあるかどうかを調べ、データがある場合には TXC 割り込みを許可して TXC 割り込みハンドラが起動されるようにしているだけです。
「前の」キャラクタの送信完了で TXC 割り込みハンドラが起動され、「次の」キャラクタの処理 / 送信が行なわれるわけで、「一番最初」のキャラクタについては「前の」キャラクタが存在しないので、「前のキャラクタの送信完了」というイベントがそもそも発生せず、何か対策をしないと永久に送信が始まらないことになります。
リセット直後の UART の状態はデータ・レジスタおよびシフト・レジスタいずれも「空」で、「送信可能」な状態ですが、TXC フラグはリセットされています。
そのため、まず何かのキャラクタを UART 送信レジスタに書き込まなければなりません。
何でもいいのですが、「ゴミ」が送信されるのは困るので、まず初期設定として、"OR" ゲートがすべて「阻止」される状態にしておきます。
そうすれば UART 出力はされますが、"OR" ゲートはすべて閉じているので、ムライボックスとしての全ての MIDI 出力ポートはアイドル状態を保ちます。
また、出力データを「アクティブ・センシング」の 0xFE にして、もし漏れても無害なものとしています。