在读取数据之前清除UDR寄存器

时间:2013-12-04 11:03:07

标签: serial-port avr interrupt-handling atmega avr-studio4

我正在尝试使用ATmega128来模拟uart。我已经在AVR STUDIO 4中编写了这段代码。

PORTB0用于使用的开关,因此当它被按下时,它连接到5v dc并且它向uart1发送'a'。在其他时候它连接到地面。通过中断接收数据。 使用调试器,当UDR1中有数据并且RXC1置位时,程序跳转到ISR,然后立即清除UDR寄存器并且不检索任何内容。任何人都可以告诉我为什么会这样吗?

这是代码。

volatile unsigned char rxdata;

void uart_init(void)
{
    UCSR1A = 0x00;
    UCSR1B |= (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);    //0b10011000;
    UCSR1C |= (1<<7)|(1<<UCSZ11)|(UCSZ10);  //0b10000110;
    UBRR1H = 0;
    UBRR1L = 103; //9600 baud rate
}

ISR(USART1_RX_vect)
{
    rxdata = UDR1;
    PORTC = rxdata;
}

void putch(char data)
{
    while(!(UCSR1A & 0x20));
    UDR1 = data;
}

主程序是

void port_init(void)
{
    DDRC = 0xFF;        
}

int main(void)
{
    port_init();
    uart_init();    
    sei();

    while(1)
    {
        if (PINB & 0x01){
            putch('a');         
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我有过一次。在我的例子中,在代码中评估标志之前设置断点将其清除,因为AVR Studio“读取”了标志(因为我打开了标志寄存器)。在读取标志的行之后设置断点是有帮助的。在您的情况下,设置断点 PORTC = rxdata;

为了获得更好的调试感觉,我将标志读入ISR开头的变量,并在此之后立即设置断点。

自从发生这种情况已经有好几年了,我甚至不确定这是不是真的如此。所以,也许你可以验证这一点;)

答案 1 :(得分:0)

我看了一下AVR Studio 4帮助部分。关于UART功能的已知模拟器问题,它指出:

  

只能从应用程序修改UART / USART UDR寄存器。通过刺激文件输入或修改I / O视图等是不可能的。