8MHz駆動になったmega168で、UARTエコー。

シリアルコンソールで送信した値がそのまま帰ってくる。

ATMega8の時とは違って、受信割り込みに反応して返すのではなくmain()の中のループで受け取って返している。というか受信割り込みから復帰できないので。

今晩中に解決できるといいな…

SourceCode, hex, Makefile(avr-gcc 3.4.6)

#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#defineTRUE1
#defineFALSE0
#defineNULL'¥0'
#definesbi(BYTE,BIT)BYTE|=_BV(BIT)//BYTEの指定BITに1をセット
#definecbi(BYTE,BIT)BYTE&=~_BV(BIT)//BYTEの指定BITをクリア
/**動作設定**/
#defineFOSC8000000//8MHz
/**UART設定**/
#defineBAUD9600//9600bps
#defineMYUBRRFOSC/16/BAUD-1//UART分周率
//#defineUCSR0A_U2X01//倍速フラグ等速ならコメントアウト
#ifdefUCSR0A_U2X0//倍速が定義されているならば
#defineMYUBRRFOSC/16/(BAUD/2)-1//UART分周率(倍速)
#endif
volatilecharusart_recvData;//USART受信データ
#defineLED_SET()sbi(PORTB,PB0)//基盤上の動作確認LED
#defineLED_CLR()cbi(PORTB,PB0)
/*PORT設定*/
voidport_init(void){
sbi(DDRB,PB0);
}
/*USART設定*/
voidusart_init(unsignedintubrr){
UBRR0H=(unsignedchar)(ubrr>>8);//ボーレート上位8bit
UBRR0L=(unsignedchar)ubrr;//ボーレート下位8bit
UCSR0A=(0<<U2X0);//等速
UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0);//送受信許可、受信完了割り込み不許可
UCSR0C=(0<<UMSEL00)|(3<<UCSZ00)|(1<<USBS0)|(0<<UPM00);
//フレーム設定非同期通信8ビット1ストップビットパリティ無し
}
intmain(void){
port_init();//PORT設定
usart_init(MYUBRR);//USART設定

LED_SET();//起動確認LED

for(;;){
if(bit_is_set(UCSR0A,RXC0)){//受信データがある時
usart_recvData=UDR0;//受信データ読み出し
loop_until_bit_is_set(UCSR0A,UDRE0);//送信レジスタ空きまで待機
UDR0=usart_recvData;//送信データ書き込み
}
}
}