解读Atmega328p数据表

时间:2013-07-24 01:14:38

标签: c arduino avr

我正在尝试使用AVR代码编写Arduino Uno,因为我不允许将Arduino库用于9月开始的高级项目。我找到了数据表,让数字引脚工作,然后继续试图通过USB串口连接与我的电脑通话。我已经阅读了本手册第19章(1)太多次了,我仍然迷失了。我从库文档本身和数据表中复制并粘贴了代码,但仍然说未解决和/或找不到任何内容。任何帮助表示赞赏。

代码:

#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 个答案:

答案 0 :(得分:1)

您的代码中的第一个问题是AVR-libc问题。您错误地使用了util/setbaud.h文件。我建议你看一下文档here。为简化起见,您需要先#define BAUD 9600 #include <util/setbaud.h>。然后,正如其他人指出的那样,您的注册名称不正确。 USART控制寄存器为UCSRnAUCSRnBUCSRnC;波特寄存器为UBRRnLUBRRnH,其中n是设备上使用的串口编号,编号为0。

您还需要定义一个函数来处理stdout,因为AVR-libc为您提供了无。请参阅stdio.h的文档以了解如何编写文档。

干杯。