UART(USART)の回路がちゃんとできているかチェックする時に使ってるプログラム。

UARTでマイコンが文字列を受け取る。そして受け取った文字をそのままUARTで送り返す。

Arduino+ATMega8で作った15行で書けるけど、avr-gcc+ATMega8だと58行必要になる。

同じ動作をするプログラムなのに。

そういえばWinAVR060421が出ているのにまだ移行していなかった。あとでやる。



SourceCode, MakeFile, Hex (AVR-GCC3.4.5)



■コード

#include<avr/io.h>
#include<avr/interrupt.h>
#defineTRUE1
#defineFALSE0
#defineNULL'¥0'
#definesbi(BYTE,BIT)BYTE|=_BV(BIT)//BYTEの指定BITに1をセット
#definecbi(BYTE,BIT)BYTE&=~_BV(BIT)//BYTEの指定BITをクリア
/**動作設定**/
#defineFOSC16000000//16MHz
/**UART設定**/
#defineBAUD9600//9600bps
#defineMYUBRRFOSC/16/BAUD-1//UART分周率
//#defineUCSRA_U2X1//倍速フラグ等速ならコメントアウト
#ifdefUCSRA_U2X//倍速が定義されているならば
#defineMYUBRRFOSC/16/(BAUD/2)-1//UART分周率(倍速)
#endif
volatilecharusart_recvData;//USARTで受信したデータ
/*PORT設定*/
voidport_init(void){
//今回は特になし
}
/*USART設定*/
voidusart_init(unsignedintubrr){
UBRRH=(unsignedchar)(ubrr>>8);//ボーレート上位8bit
UBRRL=(unsignedchar)ubrr;//ボーレート下位8bit
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//送受信許可、受信完了割り込み許可
UCSRC=(1<<URSEL)|(3<<UCSZ0)|(0<<USBS)|(0<<UPM0);
//フレーム設定非同期通信8ビット1ストップビットパリティ無し
}
intmain(void){
port_init();//PORT設定
usart_init(MYUBRR);//USART設定
sei();//全割り込み許可

for(;;){
if(usart_recvData){//受信したデータがある時
loop_until_bit_is_set(UCSRA,UDRE);//送信データレジスタ空きまで待機
UDR=usart_recvData;//受信データをそのまま返す
usart_recvData=NULL;
}
}
}
/**UART受信割り込み**/
SIGNAL(SIG_UART_RECV){
if(bit_is_clear(UCSRA,FE))//フレーミングエラーが無い時
usart_recvData=UDR;//受信データをグローバル変数に取得
}