Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
USART_UDRE_vect

USART_UDRE_vect

概要

USART_UDRE_vectは、シリアル通信でデータを送信するための割り込みハンドラです。Arduinoのシリアル通信送信バッファから、ATMega328Pのシリアル通信送信バッファにデータをコピーします。

ソースコード

USART_UDRE_vectは、hardware/arduino/cores/arduino/HardwareSerial.cpp に定義されています。以下に全ソースコードを示します。

ISR(USART_UDRE_vect)
{
  if (tx_buffer.head == tx_buffer.tail) {
        // Buffer empty, so disable interrupts
    cbi(UCSR0B, UDRIE0);
  }
  else {
    // There is more data in the output buffer. Send the next byte
    unsigned char c = tx_buffer.buffer[tx_buffer.tail];
    tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE;
        
    UDR0 = c;
  }
}

ISR()は、割り込みハンドラを定義する際に利用するマクロです。関数の属性を指定して、割り込みハンドラでの利用を示します。

ISR(USART_UDRE_vect)
{

送信バッファの先頭と最後が同じ場合はバッファにデータがないので、割り込みを禁止します。

  if (tx_buffer.head == tx_buffer.tail) {
        // Buffer empty, so disable interrupts
    cbi(UCSR0B, UDRIE0);
  }

UCSR0Bレジスタの、UDRIE0ビットを、cbi()を使ってクリアします。

そうでない場合は、送信バッファからデータを取出し、バッファを更新します。最後に、取り出したデータを、Arduinoのシリアルデータ送信用のレジスタ(UDR0)に書き込みます。

  else {
    // There is more data in the output buffer. Send the next byte
    unsigned char c = tx_buffer.buffer[tx_buffer.tail];
    tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE;
        
    UDR0 = c;
  }
}

バージョン

Arduino 1.0.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2012 garretlab all rights reserved.
inserted by FC2 system