2013-07-24 119 views
0

我試圖用AVR代碼編寫Arduino Uno,因爲我不允許在9月份開始的高級項目中使用Arduino庫。我找到了數據表,得到了數字引腳的工作,然後繼續嘗試通過USB串行連接與我的計算機通信。我已經完整閱讀了本手冊的第19章(1),而且我仍然迷失了方向。我複製並粘貼庫文檔本身和數據表中的代碼,但它仍然表示事情未解決和/或未找到。任何幫助表示讚賞。解讀Atmega328p數據表

代碼:

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

#define analog1 PC0 
#define LED PB5 
#define BAUD 9600 
//#define F_CPU 16000000 

void init_io(){ 
    DDRB |= (1<<LED); 
    DDRC |= (0<<analog1); 

} 

static void 
    uart_9600(void) 
    { 
    UBRRH = UBRRH_VALUE; 
    UBRRL = UBRRL_VALUE; 
    #if USE_2X 
    UCSRA |= (1 << U2X); 
    #else 
    UCSRA &= ~(1 << U2X); 
    #endif 
    } 

void USART_Transmit(unsigned char data) 
{ 
/* Wait for empty transmit buffer */ 
while (!(UCSRnA & (1<<UDREn))) 
; 
/* Put data into buffer, sends the data */ 
UDRn= data; 
} 

int main(){ 
    int analog_value = 1000; 
    while(1){ 
     //analog_value = PINC; 

     if(analog_value > 500){ 
      PORTB |= (1<<LED); 
      _delay_ms(500); 
      PORTB &= ~(1<<LED); 
      _delay_ms(500); 
      putchar(analog_value); 

     } 
    } 
} 

非常感謝!

+1

提供有關您不瞭解或不工作的更多詳細信息。 –

+1

通常'n'表示你的端口號。所以如果你使用'USART0',那麼使用'UCSR0A','UDRE0'和'UDR0 = data'。不過,你還沒有明確說明你需要什麼幫助。你能否詳細說明這個問題? – nonsensickle

+0

類似地,你實際上並沒有在你的'main'函數中傳輸任何東西......傳輸是否發生在中斷上? – nonsensickle

回答

1

你在代碼中的第一個問題是AVR-libc。您正在使用util/setbaud.h文件不正確。我建議你看一下文檔here。爲了簡明扼要,您需要#define BAUD 9600之前#include <util/setbaud.h>。然後,正如其他人指出的那樣,您的註冊名稱不正確。 USART控制寄存器爲UCSRnAUCSRnBUCSRnC;波特寄存器UBRRnLUBRRnH,其中n是你還需要定義一個函數來處理stdout,如AVR-libc中爲您提供沒有在設備上使用的串行端口號,從0

索引。請參閱stdio.h的文檔以瞭解如何編寫一個。

乾杯。

+0

請問您能更具體嗎?我如何使用它是錯誤的?我如何知道使用哪個串行端口? –