TOPへ戻る
★20100404 ATtiny2313 シリアル出力の確認【受信割り込み編】 |
ATtiny2313 の USART を使用して受信した文字をエコーバックするプログラムを書いてみました。
確認用回路図
PCとATtiny2313間の接続ケーブルは、RS-232C クロスケーブルを使用する。
シリアルから、38400bps で、1文字受信すると、: を出力後、受信した文字を出力します。
/*
ATtiny2313 sio 送受信サンプル
ATtiny2313 に、20MHzのセラロックを取り付けています。
Fuse Lo:ED Hi:DF Ex:FF01
Low: 11101101
||||++++-- CKSEL[3:0] システムクロック選択
||++-- SUT[1:0] 起動時間
|+-- CKOUT (0:PD2にシステムクロックを出力)
+-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)
High:11-11111
|||||||+-- RSTDISBL (RESETピン 1:有効, 0:無効(PA2))
||||+++-- BODLEVEL[2:0] (111:Off, 110:1.8, 101:2.7, 100:4.3)
|||+-- WDTON (WDT 0:常時ON, 1:通常)
||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
|+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
Ext: -------1
+-- SPMEN (SPM命令 1:無効, 0:有効)
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define FOSC 20000000 // 20MHz
#define BAUD 38400 // 38400bps
#define MYUBRR FOSC/16/BAUD-1 // UART分周率
volatile unsigned char usart_recvData; // USARTで受信したデータ
//割り込みで使用するグルーバル変数の宣言に volatile を付加する。
/* PORT設定 */
void port_init(void){
DDRB = 0x01;
PORTB = 0x00;
}
void nop(int count){
int i;
for(i = 0; i < count; i++){
_delay_ms(100);
}
}
void sio_init(unsigned int baud){
UBRRH = (unsigned char)(baud>>8); // ボーレート上位
UBRRL = (unsigned char)baud; // ボーレート下位
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // 送受信許可
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
int main(void){
port_init(); // PORT設定
sio_init(MYUBRR); // USART設定
sei(); // 全割り込み許可
for(;;){
PORTB = ~PORTB; // LED点滅
nop(10);
}
}
ISR(USART_RX_vect){
if(bit_is_clear(UCSRA,FE)){ // フレーミングエラーが無い時
usart_recvData = UDR; // 受信データ
UDR = ':';
UDR = usart_recvData; // 送信バッファ空き待機したほうが良い
}
}
ソースファイルのダウンロード
つまらない失敗(^_^;
1)初期化で (1<<RXCIE) が入ってなく受信割り込みが発生しなかった。
2)セラロック20MHzに替えると送受信できなくなった。CKSELの設定が間違っていた。
3)STARTビット幅(オシロで確認)が1/38400で計算した時間幅になっていなかった。(原因は2項より)