Я пытаюсь смоделировать UART, используя ATmega128. Я написал этот код в AVR STUDIO 4.
PORTB0 предназначен для используемого переключателя, поэтому при его нажатии он подключается к 5 В постоянного тока и отправляет «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');
}
}
}