2017-10-30 5 views
3

CでArduinoのシリアルをプログラミングする際に問題があります。アプリケーションでスピードが必要なため、Cで行う必要があります。Codeblocksを使用しています。コンパイル。ATmega328PでUDREを使用する割り込み駆動型USART

私はまた、シリアル機能がアプリケーションをブロックしてデバッグ機能を与えないようにしたいので、循環バッファ型のシリアルライブラリを作成しようとしています。アプリケーションはデータを受け取る必要はなく、印刷するだけです。

問題はシリアル割り込み明らかに発射されず、プログラムブロックで始まり、コンパイラは警告を与えて行います。

main.c|11|warning: ‘UART_UDRE_vect’ appears to be a misspelled signal handler| 

次のようにテストプログラムは次のとおりです。

#include<avr/io.h> 
#include<avr/interrupt.h> 

#define USART_BAUDRATE 9600 
#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*16UL)))-1) 

char ok = 0; 

ISR(UART_UDRE_vect) { 
    ok = 1; 
    UCSR0B &= ~(1<<5); 
} 

int main(void) { 
    UBRR0H = (BAUD_PRESCALE >> 8); 
    UBRR0L = BAUD_PRESCALE; 
    UCSR0B |= (1<<TXEN0); 
    UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); 
    sei(); 
    while(1){ 
    // write the byte to the serial port 
    UDR0 = '0'; 
    UCSR0B |= (1<<5); 
    while(ok != 1){} 
    ok = 0; 
    UDR0 = '\n'; 
    UCSR0B |= (1<<5); 
    while(ok != 1){} 
    ok = 0; 
    } 
    return 0; 
} 

設定とエコーの例であるhereが機能するため、ボーレートは正しいです。

また、他の例ではUDREを使用せず、RX割り込みのみを使用していますが、これは私が探しているものではありません。

何か忘れていますか?

+0

に変更してください。このツールチェーンはまったくわかりませんが、一般的な問題は割り込みベクタテーブルに割り込みを登録することです。これはここでどのように行われますか? – Lundin

+0

interrutionsはavr interrupt.hライブラリに記載されています。[link](http://www.atmel.com/webdoc/avrlibcreferencemanual/group__avr__interrupts.html) – BigFilhao

+0

ArduinoはC++を使用していますか? –

答えて

1

2つの問題:

  • ATmega328pがUSART_UDRE_vect名前を付ける必要があり、あなたの特定の部分のためのdocumentationあなたがリンクされ、割り込みベクタによります。

  • 割り込みと共有される変数は、常にvolatileと宣言する必要があります。そうしないと、コンパイラはそれらが使用されていると理解しない可能性があります。基本的にコンパイラは、変数okは、どこでもISRへの関数呼び出しを見ないので、0以外の値を得ることはできないと考えています(プログラムではなくハードウェアによって呼び出されるため)。宣言をstatic volatile char ok;

関連する問題