ATMEGA8のUART受信割り込みが出来なかったのが、できた。

DSC00788.jpg

PCのキーボードからoを送るとLEDを点灯、xを送ると消灯する。それ以外を送ると”ERROR”と返してくる。

ソースコード(AVR-GCC)動画(8MB)

UARTの初期化は


#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define FOSC 8000000 // 8MHz
#define BAUD 9600 // 9600bps
#define MYUBRR FOSC/16/BAUD-1 // UART分周率
volatile char uart_recv_data; // UART受信データ
/* USART設定 */
void usart_init(unsigned int baud){
UBRRH = (unsigned char)(baud>>8); // ボーレート上位
UBRRL = (unsigned char)baud; // ボーレート下位
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // 送受信許可 受信完了割り込み許可
UCSRC = (1<<URSEL)|(3<<UCSZ0)|(0<<USBS)|(0<<UPM0);
// フレーム設定 非同期通信 8ビット 1ストップビット パリティ無し
}


で、 usart_init(MYUBRR); で呼び出す。

受信割り込みは、sei();しておいて

/** UART受信割り込み **/
SIGNAL(SIG_UART_RECV){
if(bit_is_clear(UCSRA,FE)) // フレーミングエラーが無い時
uart_recv_data = UDR; // 受信データをグローバル変数に取得
}

をどこかに書いておけば実行される。

uart_recv_dataはグローバル変数として、volatileで宣言しないとならない。というかここだけ3ヶ月前にやって挫折したコードから直したら動いたので、かなり重要らしい。よくわからないけど。