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