C语言 AVR atmega128 串行粉碎



我在通过USB串行转换器将ATmega128串行端口连接到计算机时遇到问题。USB串行转换器已验证,因为我已使用它将计算机连接到CDMA调制解调器。但是,当我尝试将其与atmega128连接时,我无法找出问题所在。我已将其连接到串行液晶显示器(CLCD),它工作正常。即使在使用虚拟终端进行模拟时,也没有问题。我想知道我是否错过了与串行端口相关的任何内容。我已经在硬件选项和虚拟终端中检查了波特率。这是代码。

#include<avr/io.h>
#include<util/delay.h>
char str1[]="ATrn";
char str2[]="AT+CMGF=1rn";
char str3[]="AT+CMGS="01068685673"rn";
char str4[]="hellox1Arn";

int i;
void TX_CHAR(char ch)
{
    while(!(UCSR1A&0x20));
    UDR1=ch;
}
int main()
{
    UBRR1H=0; UBRR1L=103; UCSR1B=0x08;
    UCSR1C=0b00000110;
    while(1)
    {
        i=0; while(str1[i])TX_CHAR(str1[i++]);
        _delay_ms(200);
        i=0; while(str2[i])TX_CHAR(str2[i++]);
        _delay_ms(200);
        i=0; while(str3[i])TX_CHAR(str3[i++]);
        _delay_ms(200);
        i=0; while(str4[i])TX_CHAR(str4[i++]);
        _delay_ms(3000);
    }
}

要检查的事项:

  • 硬件 - 接线
  • M103C 保险丝的值(= 兼容模式)
  • XTAL频率和预分频器,因为波特的公式取决于它:波特=Fosc/16(UBRR+1)
  • USART双速旗(UCSRA)
  • 帧格式
  • UDREn 标志集

如果您使用预定义的符号值,您还可以更好地了解您的代码,例如

/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);

参见数据手册中的示例(第 176 页)

在帧格式上,我知道您设置为异步,8位(UCSR1B:2 = 0, UCSR1C:2,1 = 11),奇偶校验禁用,1停止位

void TX_CHAR(char ch)我知道您正在使用掩码0x20H检查位 7 (RXC1) 的状态。另一方面,您没有启用 RX(RXEN1 表示 UCSR1B:4=0)

我想知道您是否应该更好地检查位 6 (TXC1)。再。。。使用符号值将有助于更好地理解代码。

希望这有帮助...

最新更新