Добрый день!
Зашёл в тупик с очисткой буфера Atmega32.
Очищаю буфер как в даташите:
void USART_Flush()
{
unsigned char dummy;
while (UCSRA & (1<<RXC))
dummy = UDR;
}
Этот вариант не работает. Написал другой вариант с очисткой битов RXEN, TXEN:
void USART_Flush()
{
UCSRB = 0x00;
UCSRB = 0x18;
}
Этот код тоже не работает, всё равно остаются несчитанные символы.
В чём проблема?
Если не работают два варианта, которые не могут не работать, резонно предположить, что ошибка где-то в другом месте.
(дурацкий вопрос про уверенность в не-поступлении новых символов после очистки даже не задаю)
Цитата(nvk @ Mar 28 2012, 16:17)

...не работает, всё равно остаются несчитанные символы.
В чём проблема?
Оба варианта должны работать. Проблема, видимо, в том, что символы поступают после выполнения процедуры USART_Flush...
Navovvol
Mar 28 2012, 13:29
Могу только порекомендовать поменять местами Rx и Tx.
Ну и для уверенности добавить прерывание на прием. Даже не знаю есть ли они у Atmega32.
hd44780
Mar 28 2012, 14:06
Код нормальный.
Лично я в прерывании приёма кладу всё в кольцевой буфер в памяти, а потом уж его и очищаю. Пользовался этим способом много раз, всегда работает.
И не нужно никаких циклов с опросом разных регистров.
Цитата(Navovvol @ Mar 28 2012, 16:29)

Даже не знаю есть ли они у Atmega32.
Есть, куда ж без них-то

....
UraGun
Mar 29 2012, 08:06
кольцевые буферы из даташита показались мне лично не самым оптимальным решением. Особенно, когда я запускал асинхронную спарку двух модбасов на меге128. Пришлось написать своё. Завязал всё на тайминги и прерывания, и ничего теперь не приходится очищать, а это экономия времени опять же. Кстати, память тоже разгрузилась. На каждый канал модбаса использую один буфер на 256 байт. И для приёма и для передачи. Исключил также необходимость перезагрузки данных в буфер из переменных перед передачей. Получилось не очень красиво структурно, но очень быстро и компактно. Ну и асинхронность опять же была очень важна. Так что кольцевой - не панацея.
Сделал по другому: после каждого обращения к модулю sim300 считываю ответ функцией даже если этот ответ не нужен для обработки.
Например:
sendSMS("string");
USART_geta(); // просто считываем ответ
USART_transmit("AT+CBC");
USART_geta();
{ обработка принятого ответа}
И это работало с самого начала, просто я хотел сделать проще...
Цитата(nvk @ Mar 30 2012, 07:17)

И это работало с самого начала, просто я хотел сделать проще...
Разница между USART_geta() и USART_Flush() в признаке окончания функций - UDR == 0x0d (вероятно) и RXC == 0 слегка отличаются.
demiurg_spb
Mar 30 2012, 05:31
можно немного упростить

Код
void USART_Flush()
{
while (UCSRA & (1<<RXC))
{
UDR;
}
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.