USART / とにかく何かを受信する

p.376
f:id:ti-nspire:20200528063457p:plain:h300

; スタックポインタの初期化マクロ
.MACRO INITSTACK
    LDI R20, HIGH(RAMEND)
    OUT SPH, R20
    LDI R20, LOW(RAMEND)
    OUT SPL, R20
.ENDMACRO

INITSTACK

; レシーバーを有効化して(PD0端子をRXD機能にして)、
LDI R16, 1 << RXEN0
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。

; ポートBのIOを全部OUTにする(受信した1バイトをポートBに出力することにする)。
LDI R16, 0xFF
OUT DDRB, R16

AGAIN:
    ; 1バイトを受信するまで(RXC0フラグがセットされるまで)とどまって、
    LDS R20, UCSR0A
    SBRS R20, RXC0 ; SBRSはSkip if Bit in Register is Set。RXCはReceive Complete。
    RJMP AGAIN

    ; 受信した1バイトをポートBに出力する。
    LDS R17, UDR0
    OUT PORTB, R17
    
    ; を繰り返す。
    RJMP AGAIN