ДляATmega128
Код
ISR(USART1_UDRE_vect)
/*************************************************************************
Function: UART Data Register Empty interrupt
Purpose: called when the UART is ready to transmit the next byte
**************************************************************************/
/* signal handler for uart data buffer empty interrupt */
{
if(uart_txd_Tail != uart_txd_Head)
{
UDR1 = uart_txd_buffer[uart_txd_Tail];
/* calculate and store new buffer index */
uart_txd_Tail++;
uart_txd_Tail &= UART_TXD_BUFFER_MASK;
}
else
{
/* tx buffer empty, disable UDRE interrupt */
UCSR1B &= ~_BV(UDRIE1);
}
}
Работа с кольцевым буфером. Посмотрите avrlib, я модифицировал код оттуда.
Для работы с кольцевым буфером надо несколько функций:
Код
int uart_rputc(const uint8_t symbol)
/* Запись символа в кольцевой буфер */
/* Возвращаемое значение: */
/* >= 0 - OK, */
/* < 0 - error, buffer FULL */
{
if((uart_txd_Tail - uart_txd_Head - 1) != 0)
{
uart_txd_buffer[uart_txd_Head] = symbol;
uart_txd_Head++;
uart_txd_Head &= UART_TXD_BUFFER_MASK;
UCSR1B |= _BV(UDRIE1);
return symbol;
}
return EXIT_FAILUREN; /* buffer is full */
}
и
Код
uint8_t uart_rwrite(const uint8_t *buf, const uint8_t datalength)
/* Запись блока данных в кольцевой буфер */
/* Возвращаемое значение: */
/* >= 0 - число записанных символов */
{
register uint8_t res = 0, count;
for(count = datalength; count != 0; ++buf, --count){
if(uart_rputc(*buf) >= 0)
++res;
}
return(res);
}
UART работает на 115200.
Наука изощряет ум; ученье вострит память. Козьма Прутков