我正在尝试使用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');
}
}
}
答案 0 :(得分:0)
我有过一次。在我的例子中,在代码中评估标志之前设置断点将其清除,因为AVR Studio“读取”了标志(因为我打开了标志寄存器)。在读取标志的行之后设置断点是有帮助的。在您的情况下,设置断点 PORTC = rxdata;
为了获得更好的调试感觉,我将标志读入ISR开头的变量,并在此之后立即设置断点。
自从发生这种情况已经有好几年了,我甚至不确定这是不是真的如此。所以,也许你可以验证这一点;)
答案 1 :(得分:0)
我看了一下AVR Studio 4帮助部分。关于UART功能的已知模拟器问题,它指出:
只能从应用程序修改UART / USART UDR寄存器。通过刺激文件输入或修改I / O视图等是不可能的。