2013-07-24 3 views
0

9 월에 시작되는 수석 프로젝트에 Arduino 라이브러리를 사용할 수 없기 때문에 AVR 코드로 Arduino Uno를 프로그래밍하려고합니다. 데이터 시트를 발견하고, 디지털 핀을 작동시키고, USB 직렬 연결을 통해 내 컴퓨터와 대화하려고했습니다. 나는이 설명서 (1)의 19 장을 완전히 여러 번 읽었으며, 나는 여전히 길을 잃었다. 라이브러리 문서 자체와 데이터 시트에서 코드를 복사하여 붙여 넣었습니다. 아직 상황이 해결되지 않았거나 찾을 수 없다고합니다. 어떤 도움을 주셔서 감사합니다.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 컨트롤 레지스터는 UCSRnA, UCSRnBUCSRnC입니다. n 당신은 또한 AVR-libc의 당신에게 아무것도 제공하지 않기 때문에, stdout을 처리하는 함수를 정의 할 필요가 0

에서 인덱스 장치에 사용되는 시리얼 포트의 수이며, 여기서 전송 레지스터는 UBRRnLUBRRnH 있습니다. 쓰기 방법을 배우려면 stdio.h에 대한 설명서를 참조하십시오.

건배.

+0

좀 더 구체적으로 알려주시겠습니까? 나는 그것을 어떻게 잘못 사용하고 있는가? 사용할 직렬 포트를 어떻게 알 수 있습니까? –