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項より)