USART传输 - AVR(atmega169p)收到0或null而不是char'a'

时间:2016-03-01 13:17:50

标签: c avr uart usart

我正在尝试通过USB转串口线将带有白蚁的字符'a'发送到我的AVR。这之前已经有效,但过了一段时间atmel工作室没有将控制器显示为设备,我不得不将atmel工作室更新到更高版本以识别控制器。我可能在某个地方改变了代码尝试,所以我不确定代码是否正确。

这是一个非常简单的程序,用于接收到达的第一个字符:

#include <avr/io.h>
#include "initialize.h"
#include "constantComfort.h"

char receivedchar;

void USART_receive_char(void){
    /* wait for data to be received */
    while( !(UCSR0A & (1<<RXC0)) );

    receivedchar = UDR0;
}

int main(void)
{
    init(0.5); //0.5 for interruptcycle in seconds
    USART_receive_char();
    writeLong(receivedchar,1);
}

如果直接插入,写长可以写'a'作为ascii-code 97,但是当我尝试接收'a'或其他字符时,它只显示0。

AVR的初始化看起来像这样,我很确定我已经相应地设置了白蚁程序。 9600 BAUD,8个数据位,1个停止位,无奇偶校验。

//USART (for Serial connection to computer)
    #define F_CPU       1000000
    #define BAUDRATE    9600                            // 9600 bits/sec
    #define BAUD        ((F_CPU)/(BAUDRATE*16UL)-1)     // from formula

    /* enable USART0 module */
    PRR = (0<<PRUSART0);

    /* set baud rate to  defined baudrate*/
    UBRR0H = (BAUD>>8);
    UBRR0L = (BAUD);

    /* enable receiver and transmitter */
    UCSR0B |= (1<<RXEN0)|(1<<TXEN0);

    /* set frame format: 8 data bits, 1 stop bit (always 1 start bit)*/
    UCSR0C |= (0<<USBS0)|(3<<UCSZ00);

我很确定这是影响此问题的所有代码。我已阅读了手册中的寄存器名称,所以我认为初始化是正确的。

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

代码似乎是正确的,除了

Custom

而不是试试这个

 PRR = (0 << PRUSART0); // i think this does not work

然后启用USART接收中断试试这个

 PRR &= ~(1 << PRUSART0); 

对于BAUD率试试这个(数据表第176页)

 #include <avr/interrupt.h>
 #include <inttypes.h>

 sei(); //global interrupt enable
 UCSR0B |= (1 << RXCIEn); //USART receive interrupt enable (datasheet page 195)

 ISR(USART_RXCn) (datasheet page 57)
 {
 //LED_on switch ON or OFF one of your leds if the receive interrupt is triggered by incoming data from termite
 }

答案 1 :(得分:1)

atmega169p具有8 MHz时钟频率

我已经读过低功耗&#34;模式avr将具有1 MHz的时钟频率,并以某种方式认为它是默认值。

默认情况下,atmega169p的时钟频率为8 MHz,没有预分频,因此波特率计算错误,我认为avr读取速度不够快,因此接收&#39; 0&#39;。

正确的代码段:

    //USART (for Serial connection to computer)
    #define F_CPU       8000000 //>>>>>>>>>>  THIS ONE!  <<<<<<<<<<<<
    #define BAUDRATE    9600                            
    #define BAUD        ((F_CPU)/(BAUDRATE*16UL)-1)     

在此代码段中更改为8 MHz解决了我的问题。

感谢您帮助解决我的代码中的其他潜在问题!