0

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

PORTB0 用于使用过的开关,因此当按下它时,它会连接到 5v dc 并将“a”发送到 uart1。在其他时候,它连接到地。数据的接收是通过中断进行的。使用调试器,当 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');         
        }
    }
}
4

2 回答 2

0

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

UART/USART UDR 寄存器只能从应用程序中修改。无法通过刺激文件或修改 I/O 视图等进行输入。

于 2013-12-05T09:27:33.150 回答
0

我曾经有过这个。就我而言,在代码中评估标志之前设置断点会清除它,因为 AVR Studio “读取”了标志(因为我打开了标志寄存器)。在读取标志的行之后设置断点会有所帮助。在您的情况下,在PORTC = rxdata;行设置断点

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

这件事发生已经有好几年了,我什至不确定是否真的是这样。所以,也许你可以验证这一点;)

于 2013-12-04T20:21:23.437 回答