Цитата(Volodin K.I. @ Jul 22 2009, 08:08)

дк. вчера сидел отлаживал. отправка через uart_putchar работает. не работает только прием символов.
Да возьмите вы документацию на контроллер. Там есть всё что нужно - и функция инициализации, и отправка символа, и приём.
Один в один копируете, вставляете в проект и всё работает.
Зхо делается элементарно
Код
void main(void)
{
uart_init(baud);
for(;;)
{
putchar(getchar());
}
}
Извиняюсь просмотрел что вы хотите сделать с фифо по прерываниям.
Словами долго объяснять что можно былобы подправить в вашем коде,
приведу пример работающей реализации отправки/приёма символов через уарт с помощью фифо.
Код
#pragma vector=USART_RX_vect
__interrupt void USART_RX_IRQ(void)
{
//прерывание по завершению приёма байта
//читаем регистр данных уарта в RXFIFO чтобы очистить флаг прерывания
RxBuf[RxHead++] = UDR0;
if (RxHead >= UARTRXBUFSIZE) RxHead = 0;
}
/**************************************************************/
Код
#pragma vector = USART_TX_vect
__interrupt void USART_TXC(void)
{
if (TxTail != TxHead)
{
UDR0 = TxBuf[TxTail++]; // пересылка следующего байта в прерывании
if (TxTail >= UARTTXBUFSIZE) TxTail = 0;// проверка переполнения
}
}
/**************************************************************/
функции считывания/занесения данных в фифо
Код
/*********************************************************/
signed int getcharFIFO()
{
signed int data = -1;
if (RxTail != RxHead)
{
data = RxBuf[RxTail++];
if (RxTail >= UARTRXBUFSIZE) RxTail = 0;
}
return(data); //возвращаем -1 если фифо пусто или данные
}
/**************************************************************/
Код
/**************************************************************/
void putcharFIFO(signed char data)
{
if ((TxHead == TxTail) && (UCSR0A & (1<<UDRE0))) UDR0 = data;
else
{
TxBuf[TxHead++] = (unsigned char) data;
if (TxHead >= UARTTXBUFSIZE) TxHead = 0;
}
}
/**************************************************************/
Собственно организация эха выглядит так
Код
for(;;)
{
__watchdog_reset();
__enable_interrupt();
__sleep();
__disable_interrupt();
signed int temp;
temp = getcharFIFO();
if(temp != -1) putcharFIFO();
}
Сообщение отредактировал mempfis_ - Jul 22 2009, 07:09