5

私はArduinoMega2560プロジェクトに取り組んでいます。Windows 7 PCでは、Arduino1.0IDEを使用しています。ボーレート115200のシリアルBluetooth通信を確立する必要があります。RXでデータが利用可能になったときに割り込みを受信する必要があります。私が見たすべてのコードは、Arduinoのループ内にSerial.availableの条件を配置する「ポーリング」を使用しています。割り込みとそのサービスルーチンのArduinoのループでこのアプローチをどのように置き換えることができますか?attachInterrupt()はこの目的を提供していないようです。Arduinoをスリープモードから復帰させるために割り込みに依存しています。

ピン13に接続されたLEDをオンにすることになっているこの単純なコードを開発しました。

    #include <avr/interrupt.h> 
    #include <avr/io.h> 
    void setup()
    {
       pinMode(13, OUTPUT);     //Set pin 13 as output

       UBRR0H = 0;//(BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
       UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
       UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
       UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);   // Turn on the transmission, reception, and Receive interrupt      
    }

    void loop()
    {
      //Do nothing
    }

    ISR(USART0_RXC_vect)
    {    
      digitalWrite(13, HIGH);   // Turn the LED on          
    }

問題は、サブルーチンが提供されないことです。

4

3 に答える 3

7

ついに私は自分の問題を見つけました。割り込みベクトル「USART0_RXC_vect」を。で変更しましたUSART0_RX_vect。また、グローバル割り込みを有効にするために追加しましinterrupts();たが、非常にうまく機能しています。

コードは次のとおりです。

#include <avr/interrupt.h> 
#include <avr/io.h> 
void setup()
{
   pinMode(13, OUTPUT); 

   UBRR0H = 0; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
   UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
   UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
   UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);   // Turn on the transmission, reception, and Receive interrupt      
   interrupts();
}

void loop()
{

}

ISR(USART0_RX_vect)
{  
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
}

返信ありがとうございます!!!!

于 2012-04-19T02:54:59.767 に答える
2

そのコードを試しましたが、機能しませんでしたか?問題は、割り込みをオンにしていないことだと思います。sei();または関数で呼び出すことができinterrupts();ますsetup

于 2012-04-18T14:25:16.927 に答える
-1

この代わりUBRR0L = 8に:

 UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);

これに変更:

 UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10);
于 2019-01-26T18:13:19.200 に答える