2014-10-10 11 views
1

嗨,我是新來的,我需要幫助。假設只是在實際中顯示'S',而不是'null'。會有什麼問題?它可以是註冊表嗎?或代碼本身?atmega8 UART-不顯示字符在realterm

#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'); 
    } 
} 

系統在xtal上以14745600Hz運行。主機速度爲9600波特。所有的設置應該是8N1。

+0

它與14745600赫茲外部晶體運行,8位無奇偶校驗1停止位 – user2211932 2014-10-10 11:11:30

+0

波特9600,8位無奇偶校驗1停止位 – user2211932 2014-10-10 11:18:12

回答

2

寫入UCSRC寄存器時需要設置URSEL。

變化

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

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

從數據表:

UBRRH寄存器共享同一I/O地址UCSRC寄存器。因此在訪問這個I/O位置時必須考慮一些特殊的問題。當對該I/O位置進行寫訪問時,寫入的值的高位USART寄存器選擇(URSEL)位控制將寫入的兩個寄存器中的哪一個。如果在寫入操作期間URSEL爲零,則UBRRH值將更新。如果URSEL爲1,則UCSRC 設置將被更新。

其餘代碼對我來說看起來很好。

+0

謝謝...現在它工作... :) – user2211932 2014-10-11 01:58:21

0

更改UART_Tx('S');使用UART_Tx(「S」);