今度は、データレジスタエンプティ割り込みではなく送信完了割り込みを使ってみる。とりあえず何かを送信し終えない限り送信完了フラグが立たない。テキストにサンプルが載っていないので多分あまり一般的な方法ではない。
; スタックポインタの初期化マクロ .MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO ; 割り込みベクターテーブルを侵さないようにするため、マイコンのリセット後はただちに別の番地へ飛ぶことにする。 .ORG 0 JMP MAIN ; 送信完了割り込みがかかると制御が0x28番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。 .ORG UTXCaddr ; 0x28 JMP UTXC_INT_HANDLER .ORG 0x100 MAIN: INITSTACK ; トランスミッターを有効化して、送信完了割り込みを有効化して、 LDI R16, 1 << TXEN0 | 1 << TXCIE0 STS UCSR0B, R16 ; 8N1 (8ビットデータ、パリティなし、1ストップビット)にして、 LDI R16, 1 << UCSZ01 | 1 << UCSZ00 ; CSZはCharacter Size。 STS UCSR0C, R16 ; ボーレートを9600にして、 LDI R16, 51 ; == 8MHz/(16*9600)-1 STS UBRR0L, R16 ; BRはBaud Rate。 ; グローバル割り込みを有効化して、 SEI ; とりあえず何かを送信して、とりあえず送信完了割り込みをかけて、 LDI R26, 0 STS UDR0, R26 LOOP: RJMP LOOP UTXC_INT_HANDLER: ; 1文字を送信する。 LDI R26, 'a' STS UDR0, R26 RETI