реклама на сайте
подробности

 
 
> UART
Enot555
сообщение Apr 25 2008, 23:53
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 25-04-08
Пользователь №: 37 100



Доброго времени суток!
Подскажите, пожалуйста, как вывести контроллер (ATmega8) из режима передачи?
При организации прерываний по USART_DR_Empty и USART_Transmit_Complete после окончания передачи устанавливаются флаги UDRE и TXE и, поскольку UDRE имеет приоритет по прерываниям, то до TXE дело никогда не доходит. Как сбросить UDRE без записи в него новых данных (которые он воспринимает как данные для передачи следующего бита и так далее...)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mdmitry
сообщение Apr 26 2008, 11:53
Сообщение #2


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Для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.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 12:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016