C 解读Atmega328p数据表

C 解读Atmega328p数据表,c,arduino,avr,C,Arduino,Avr,我正试图用AVR代码编写一个Arduino Uno,因为我不允许在九月份开始的高级项目中使用Arduino库。我找到了数据表,让数字管脚正常工作,然后继续尝试通过USB串行连接与我的电脑通话。我已经读了本手册第19章()太多次了,我仍然迷路。我从库文档本身和数据表中复制并粘贴了代码,但它仍然表示未解决和/或未找到问题。感谢您的帮助 代码: #包括 #包括 #包括 #包括 #定义模拟1 PC0 #定义LED PB5 #定义波特率9600 //#定义F_CPU 16000000 void init_

我正试图用AVR代码编写一个Arduino Uno,因为我不允许在九月份开始的高级项目中使用Arduino库。我找到了数据表,让数字管脚正常工作,然后继续尝试通过USB串行连接与我的电脑通话。我已经读了本手册第19章()太多次了,我仍然迷路。我从库文档本身和数据表中复制并粘贴了代码,但它仍然表示未解决和/或未找到问题。感谢您的帮助

代码:

#包括
#包括
#包括
#包括
#定义模拟1 PC0
#定义LED PB5
#定义波特率9600
//#定义F_CPU 16000000
void init_io(){

DDRB |=(1您的代码中的第一个问题是AVR libc。您使用的
util/setbaud.h
文件不正确。我建议您查看一下文档。为了使事情简单,您需要在
之前定义BAUD 9600
,然后,正如其他人所指出的,您的注册名是re不正确。USART控制寄存器为
UCSRnA
UCSRnB
UCSRnC
;波特率寄存器为
UBRRnL
UBRRnH
,其中
n
是设备上使用的串行端口号,从0开始索引

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


干杯。

提供更多关于您不了解的内容或不起作用的内容的详细信息。通常
n
表示您的端口号。因此,如果您使用
USART0
,那么请使用
UCSR0A
UDRE0
UDR0=data
。不过,您还没有明确说明需要哪些帮助。请详细说明问题?类似地,您在
main
函数中没有实际传输任何内容…传输是在中断时发生的吗?我尝试过用0替换n,但仍然得到错误。显示为未找到的是UBRRH=UBRRH_值;UBRRL=UBRRL_值;UCSRA |=(1)你在哪里找到了UBRRH和UBRRL的代码?atmega328甚至没有这些寄存器(这可以解释为什么编译器抱怨找不到这些寄存器)。你能说得更具体一点吗?我怎么用错了?我怎么知道使用哪个串口?
#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);

        }
    }
}