LoginSignup
3
2

More than 5 years have passed since last update.

arduino unoの asm で serial.write (多分nanoもできる)

Last updated at Posted at 2018-07-31

環境/environment

arduinoのhardwareserialのコードをasembblyで描きたい

void setup() {
  asm(
    //baudrateの設定
    "ldi R16,0x00                     \n"
    "sts 0x00C5,R16                      \n"
    "ldi R16,0x07                        \n"
    "sts 0x00C4, R16                     \n"

//baudrateが300と57600の時は0b00000000をつかう
    "ldi R16,0b00000010                  \n"
    "sts 0x00C0, R16                     \n"

    "ldi R16,0b11001000                  \n"
    "sts 0x00C1, R16                     \n"


    "ldi R16,0b00000110                  \n"
    "sts 0x00C2, R16                     \n"
  );
  asm(
    "USART_Tx:                           \n"
    "LDS  R16,192                        \n"
    "SBRS R16, 5                         \n"
    "RJMP USART_Tx                       \n"

    //udrレジスタに書き込み
    "ldi R16,0x21                        \n"
    "sts 0x00C6, R16                     \n"

    //UCSR0B(0x00C1)UDRIE0(bit 5)をセット
    "lds  R16,0x00C1                     \n"
    "ori  R16,0b00100000                 \n"
    "sts  0x00C1, R16                    \n"


  );
}

void loop() {
}

baudrateとUBRR0H、UBRR0Lのsetting

baudrate UBRR0H UBRR0L
300 13 4
1200 6 130
2400 3 64
4800 1 160
9600 0 207
19200 0 103
38400 0 51
57600 0 16
74880 0 26
115200 0 16
230400 0 8
250000 0 7
500000 0 3
1000000 0 1
2000000 0 0

引用

シリアル通信関連のレジスタ

ATMEGA328pの公式データシート
ATMELの8bitCPUの命令セットやレジスタ

3
2
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2