ATMEGA8のUART受信割り込みが出来なかったのが、できた。
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ヶ月前にやって挫折したコードから直したら動いたので、かなり重要らしい。よくわからないけど。