Код
#define USART_BAUD 9600ul
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)
void USART_vInit(void)
{
// Set baud rate
unsigned short int UBRRH = USART_UBBR_VALUE>>8;
unsigned short int UBRRL = USART_UBBR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ00);
// Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}
void USART_vSendByte(unsigned short int u8Data)
{
// Wait if a byte is being transmitted
while((UCSR0A&(1<<UDRE0)) == 0);
// Transmit data
UDR0 = u8Data;
}
unsigned short int USART_vReceiveByte()
{
if ((UCSR0A&(1<<RXC0)) == 0) {return UDR0;} else {return 0;}
}
int main(void) // начало основой программы
{
...
(ежесекундно проверяется статус кнопки, и, если кнопка нажата, то)
{
мигнуть лампочкой;
USART_vSendByte(10);
USART_vSendByte(15);
}
}
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)
void USART_vInit(void)
{
// Set baud rate
unsigned short int UBRRH = USART_UBBR_VALUE>>8;
unsigned short int UBRRL = USART_UBBR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ00);
// Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}
void USART_vSendByte(unsigned short int u8Data)
{
// Wait if a byte is being transmitted
while((UCSR0A&(1<<UDRE0)) == 0);
// Transmit data
UDR0 = u8Data;
}
unsigned short int USART_vReceiveByte()
{
if ((UCSR0A&(1<<RXC0)) == 0) {return UDR0;} else {return 0;}
}
int main(void) // начало основой программы
{
...
(ежесекундно проверяется статус кнопки, и, если кнопка нажата, то)
{
мигнуть лампочкой;
USART_vSendByte(10);
USART_vSendByte(15);
}
}
}
Однако результат следующий. Во-первых, за раз отправляется только один байт. Во-вторых, он всегда равен 127 (в 7-битном режиме) или 255 (в 8-битном режиме). В-третьих, даже этот неверный байт отсылается не стабильно: в 60-70% случаев байт не отправляется, хотя лампочка мигает (т.е. условие нажатия выполняется).
Кроме того, приём байта вообще не работает.
Подозреваю, что причина - в неправильной работе с UART.