1

こんにちは、私はこれが初めてで、助けが必要です。'null' を与える代わりに、realterm に 'S' を表示するだけだと思われます。問題は何でしょうか?それはレジスターでしょうか?またはコード自体?

#include <avr/io.h>
#include <util/delay.h>

void UART_Init(unsigned int ubrr)
{
    UBRRH=(unsigned int)(ubrr>>8);
    UBRRL=(unsigned int)ubrr;
    UCSRA=0x00;
    UCSRB=(1<<TXEN)|(1<<RXEN);
    UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
}

void UART_Tx(unsigned char chr)
{
    while (bit_is_clear(UCSRA,UDRE)){}
    UDR=chr;
}

int main(void)
{
    UART_Init(95);
    DDRD|=0B11111111;
    PORTD|=0B11111111;

    while(1){
        _delay_ms(10);
        UART_Tx('S');
    }
}

システムは 14745600 Hz の xtal で実行されています。ホストの速度は 9600 ボーです。すべての設定は 8N1 である必要があります。

4

2 に答える 2

2

UCSRC レジスタに書き込むときは、URSEL を設定する必要があります。

変化する

UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);

UCSRC=(1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);

データシートから:

UBRRH レジスタは UCSRC レジスタと同じ I/O ロケーションを共有します。したがって、この I/O ロケーションにアクセスする際には、特別な考慮が必要です。この I/O ロケーションの書き込みアクセスを行う場合、書き込まれる値の上位ビットである USART レジスタ選択 (URSEL) ビットが、2 つのレジスタのうちどちらに書き込まれるかを制御します。書き込み操作中に URSEL がゼロの場合、UBRRH 値が更新されます。URSEL が 1 の場合、UCRC 設定が更新されます。

コードの残りの部分は問題ないように見えます。

于 2014-10-10T12:00:56.017 に答える