1

だから私は Atmel 328p のプログラミングについて読んでいて、シリアル入力と出力をプログラムできるようにしたいのですが、完全に得られなかったものを見ました:

  • UBRR0H は、このアセンブリ コードでは UBRRnH と呼ばれます。

    USART_Init:
        ; Set baud rate
        out UBRRnH, r17
        out UBRRnL, r16
        ; Enable receiver and transmitter
        ldi r16, (1<<RXENn)|(1<<TXENn)
        out UCSRnB,r16
        ; Set frame format: 8data, 2stop bit
        ldi r16, (1<<USBSn)|(3<<UCSZn0)
        out UCSRnC,r16
        ret
    
  • この C コードでは UBRR0H という名前のままです。

    #define FOSC 1843200 // Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    void main( void ) {
        ...
        USART_Init(MYUBRR)
        ...
    }
    
    void USART_Init( unsigned int ubrr) {
        /*Set baud rate */
        UBRR0H = (unsigned char)(ubrr>>8);
        UBRR0L = (unsigned char)ubrr;
        Enable receiver and transmitter */
        UCSR0B = (1<<RXEN0)|(1<<TXEN0);
        /* Set frame format: 8data, 2stop bit */
        UCSR0C = (1<<USBS0)|(3<<UCSZ00);
    }
    

このコードは、CPU を製造している Atmel によるとまったく同じことを行うのに、なぜ 2 つの異なるものと呼べるのでしょうか?

ありがとう :)

4

3 に答える 3

3

In Nut/OS, I see this #define:

#define     UBRRnH   UBRR0H

It's entirely possible that they are equivalent.

于 2013-08-02T01:00:10.927 に答える
0

データシート (ATmega164P/324P/644P データシートを使用) で、Atmel は命名における「n」の使用について説明しています。MCU には USART0 と USART1 の 2 つの USART があるため、使用している USART に応じて「n」を「0」または「1」に置き換える必要があります。
を使用すると、#defineこれを解決できます。

#define UBRRnH UBRR0H
于 2015-11-12T06:55:59.520 に答える