szty's diary

電子工作、プログラミングなど

AVRでシリアル通信をする

f:id:szty1012:20180407080043p:plain

AVR(ATtiny2313)のUSARTを使って文字列を送信した。

PCにRS232Cポートが無いので、以下のAVRプログラマをUSB-シリアル変換器として使った。

Pololu USB AVRプログラマ v2

Pololu USB AVRプログラマ v2

プログラム

.include "tn2313def.inc"

.cseg
.org 0
    rjmp  setup

usart_init:
    out   UBRRH,r17
    out   UBRRL,r16
    ldi   r16,(1<<UCSZ1)|(1<<UCSZ0)
    out   UCSRC,r16
    ldi   r16,(1<<RXEN)|(1<<TXEN)
    out   UCSRB,r16
    ret

usart_send:
    sbis  UCSRA,UDRE
    rjmp  usart_send
    out   UDR,r16
    ret

setup:
    ldi   r16,RAMEND
    out   SPL,r16
    ldi   r16,12
    ldi   r17,12>>8
    rcall usart_init
loop:
    ldi   r16,'H'
    rcall usart_send
    ldi   r16,'e'
    rcall usart_send
    ldi   r16,'l'
    rcall usart_send
    ldi   r16,'l'
    rcall usart_send
    ldi   r16,'o'
    rcall usart_send
    ldi   r16,' '
    rcall usart_send
    ldi   r16,'w'
    rcall usart_send
    ldi   r16,'o'
    rcall usart_send
    ldi   r16,'r'
    rcall usart_send
    ldi   r16,'l'
    rcall usart_send
    ldi   r16,'d'
    rcall usart_send
    ldi   r16,0x0d      ; CR
    rcall usart_send
    ldi   r16,0x0a      ; LF
    rcall usart_send
    rjmp  loop

レジスタ

  • UDR...USARTデータレジスタ

  • UBRR (H/L)...USARTポートレジスタ

  • UCSRx...USART制御/状態レジスタx

  • UCSZ2,1,0...データビット長を選択。011で8bit

  • RXEN,TXEN...受信許可、送信許可

  • UDRE...送信データレジスタ空きフラグ。UDRが空の時1になる

name\bit 7 6 5 4 3 2 1 0
UCSRA RXC TXC UDRE FE DOR PE U2X MPCM
UCSRB RXCIE TXCIE UERIE RXEN TXEN UCSZ2 RXB8 TXB8
UCSRC - UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL

ニモニック

メモ

今回の場合(標準速非同期動作)、UBRRは

UBRR = \frac{f}{16×BAUD}-1

で求めることができる。

f=1MHzでBAUD=4800bpsとしたのでUBRR=12にした。